프로세스(Process) : 메모리에 올라와 실행되고 있는 프로그램의 인스턴스이다. -> 독립적인 개체
스레드(Thread) : 프로세스 내에서 실행되는 여러 흐름의 단위이다. 프로세스와 다르게 동일한 자원을 공유하기 때문에 위험하지만 효율적이다 -> 경량 프로세스(Lightweight process)
프로세스(Process)
프로세스는 하나의 프로그램과도 같기 때문에 메모리 공간은 다른 프로세스와 완전히 분리되어 있다.

- 프로세스는 독립적이기 때문에
Code , Data , Heap , Stack 이 각각 분리되어 있다.
Code : 코드 자체를 구성하는 메모리 영역
Data : 전역변수, 정적변수, 배열 등
- 초기화 된 데이터는
Data 영역에 저장
- 초기화 되지 않은 데이터는
BSS(Block Started by Symbol) 영역에 저장
BSS 영역이란 초기에 오직 제로 값으로 표시된 정적으로 할당된 변수가 포함된 데이터 세그먼트의 일부로 컴파일러나 링커에 의해 사용된다.
Heap : 동적 할당 시 사용( C 언어 기준 new() , malloc() Java 는 new )
Stack : 지역변수, 매개변수, 리턴 값(임시 메모리 영역)
- 기본적으로 프로세스 1개가 실행될 때 1개의 스레드를 가진다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면
프로세스 간 통신(IPC, Inter-Process Commnuication)을 사용해야 한다.
멀티 프로세스(Multi Process)
하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것을 말한다.
- 장점 : 하나의 작업(Task)에서 여러 자식 프로세스 중 하나의 프로세스에 문제가 생겨도 다른 프로세스에 영향이 가지 않는다 -> 안정성
- 단점 : 각각의 독립된 자원을 할당 받기 때문에 작업량이 많아질 수록 오버헤드 발생.
Context Switching 으로 인한 성능 저하가 일어난다.
컨텍스트 스위칭(Context Switching)
- CPU 에서 여러 프로세스를 돌아가면서 작업을 처리하는데 이 과정을
Context Switching 이라 한다.
- 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관헀던 프로세스의 상태를 복구하는 작업을 말한다.
- 프로세스는 각각의 독립된 메모리 영역을 할당받기 때문에 프로세스 간 공유하는 메모리가 없다.
- 즉,
Context Switching 발생 시 캐쉬에 있는 모든 데이터를 리셋하고 다시 캐쉬 정보를 불러와야 한다. 이 때 작업량이 많으면 캐시 메모리 초기화같은 무거운 작업 처리시 오버헤드가 발생할 수 있다.
스레드(Thread)
스레드는 프로세스 안에 존재하고 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.

- 스레드는 프로세스의 Stack 영역만 각각 할당을 받고 나머지 메모리영역은 공유를 한다.
- 같은 프로세스 안에 있는 스레드들은 각각의 Heap 공간을 공유하여 효율성이 좋지만 공유하기 때문에 위험하다.
- 예를 들어, 한 스레드가 프로세스 자원을 변경하면 다른 이웃 스레드(Sibling Thread)도 그 변경 결과를 즉시 볼 수 있다. -> 공유하기 때문.
멀티 스레드
하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것 -> 웹 서버가 대표적인 멀티 스레드 응용 프로그램이다.

- 장점
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
- 스레드 사이의 작업량이 작아 Context Switching 이 빠르다.
- 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신(IPC)의 부담이 적다.
- 단점
- 주의 깊은 설계가 필요하다.
- 디버깅이 까다롭다.
- 멀티 스레드의 경우 자원 공유의 문제가 발생한다.(동기화문제)
- 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.
<참고자료>
Tech Interview
[OS] 프로세스와 스레드의 차이
[Linux] BBS란 무엇인가?