프로그램, 프로세스와 쓰레드란?
- 프로그램: 컴퓨터가 실행할 수 있는 명령어들의 집합, 코드로 이루어진 파일.
- 프로세스: 컴퓨터에서 실행 중인 프로그램, 즉 실행 상태로 들어간 프로그램을 말한다.
- 각각의 프로세스는 독립된 메모리 공간을 할당 받는다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.

- 쓰레드: 프로세스 안에서 실행되는 여러 흐름 단위
- 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 프로세스의 것을 공유한다.
- 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
- 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.



PCB
프로세스의 문맥을 저장, 커널의 스택 공간에 위치(사용자가 접근할 수 있는 보호된 메모리 영역).

- PCB들을 연결할 수 있는 Pointer
- OS가 관리상 사용하는 정보
- Process State(ready, running, wait 등), Process ID(프로세스만의 ID)
- scheduling information priority(프로세스한테 CPU를 주기 위한 우선순위 관련 정보)
- CPU 수행 관련 하드웨어 값(프로세스 문맥을 표시하기 위한 정보)
- Program counter, registers(어떤 정보를 담고 일하고 있었는가)
- 메모리 관련
- code, data, stack의 위치 정보(물리적 메모리에서 어디에 위치하고 있는가)
- 파일 관련
- Open file descriptors(프로세스가 오픈하고 있는 파일은 어떤 것들이 있는지)
TCB
쓰레드의 문맥을 저장

- 구성 요소
- PC
- registers
- stack
- 쓰레드가 동료 쓰레드와 공유하는 부분
- Code
- Data
- Heap


발전 역사
- 단일 프로세스 시스템: 한 번에 하나의 프로그램만 실행된다. 다른 프로그램을 실행시키려면 이 기존의 프로그램 실행을 끝내고 실행시켜야 했다.
- 이 시스템의 단점: CPU 사용률이 좋지 않다. IO 작업이 끼어 있다면, 그 IO 작업이 끝나고 결과가 돌아올 때까지 기다리기 때문이다.
- IO(input/output) 작업: 파일을 읽고 쓰거나(from HDD) 네트워크 통신을 하거나 입출력 장치(마우스, 키보드)와 데이터를 주고 받는 것.


- 멀티 프로그래밍: 여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자. 그리고 저 IO 작업이 발생할 때 그 남는 시간에 다른 프로그램을 올려서 실행시키자.
- 목적: CPU 사용률을 극대화 시키는 것.
- IO 작업이 발생하면 다른 프로세스가 CPU에서 실행된다.
- 이 시스템의 단점: CPU 사용 시간이 길어지면 다른 프로세스는 계속 대기하게 된다.

- 멀티 태스킹: 프로세스는 한번 CPU를 사용할 때 아주 짧은 시간(quantum, ms 단위)만 CPU에서 실행되도록 하자.
- 목적: 프로세스의 응답 시간을 최소화 시키는 것.
- 동시성: 이를 통해 아주 짧은 시간 내에 여러 프로세스가 번갈아가며 실행되므로, 마치 동시에 실행되는 듯한 느낌을 사용자는 받을 수 있다.
- 하나의 프로세스가 CPU를 계속해서 독차지 하지 않도록 아주 짧게 나누고 번갈아가면서 프로세스에게 CPU 주도권을 주는 것.
- 이 시스템의 아쉬움들
- 하나의 프로세스가 동시에 여러 작업을 수행하지 못한다.
- 프로세스의 컨텍스트 스위칭은 무거운 작업이다.
- 프로세스끼리 데이터 공유가 까다롭다.
- 한 예로 Message Passing이 있는데 커널의 한 공간에 메시지 통신용 메모리를 할당하고, 이 구간을 통해 서로 데이터를 공유하는 것.
- 따로 데이터 전달용 메모리를 마련해둬야 하므로 메모리 낭비 발생
- 공유 시 커널 모드로 들어가니 속도가 느려질 수 있다.
- 이제 싱글 코어가 아니라 듀얼 코어로 발전했는데 이를 더 효율적으로 사용하고 싶어짐.(컨텍스트 스위칭 비용을 줄이기 위함)


- 멀티 쓰레딩
- 목적: 하나의 프로세스가 동시에 여러 작업을 실행시킬 수 있도록 해주는 것.
- 쓰레드
- 프로세스는 한 개 이상의 쓰레드를 가질 수 있다.
- CPU에서 실행되는 단위(unit of execution), 이제 프로세스가 아니라 쓰레드가 단위가 된 것임.
- 같은 프로세스의 쓰레드들끼리는 컨텍스트 스위칭이 가볍다.
- 쓰레드들은 자신들이 속한 프로세스의 메모리 영역을 공유한다. (Heap, Data, Code)
- 허나 스택은 쓰레드 각각 가지고 있다. 이 스택은 공유하지 않는다.
- CPU가 싱글 코어라면? → 멀티 태스킹
- CPU가 듀얼 코어라면? → 멀티 쓰레딩(병렬로 진짜 동시에 두 개의 쓰레드를 실행한다)

PC, program counter(rip), 다음 명령어를 수행할 주소를 가르키는 포인터


- 멀티 프로세싱: 두 개 이상의 프로세서나 코어를 활용하는 시스템, 이제 병렬성이 가능해진다.

cpu가 여러 쓰레드를 담당하면 멀티 태스킹
프로세스가 여러 쓰레드를 가지고 있으면 멀티 쓰레딩
cpu에 코어가 여러 개이면 멀티 프로세싱
여담
구글은 1개의 탭이 꺼져도 다른 것에 영향이 가지 않는다. 반면 IE는 1개의 탭이 꺼지면 다 꺼진다.
구글 탭들 → 멀티 프로세스
IE 탭들 → 멀티 쓰레드
참고
linux
torvalds • Updated Jan 29, 2023
pintos-kaist
casys-kaist • Updated Jan 28, 2023