1.2.1 프로세스와 스레드
프로세스
컴퓨터에서 실행 중인 하나의 프로그램을 의미
- 프로세스는 OS로부터 독립된 메모리 영역(코드, 데이터, 스택, 힙)을 할당받으며, 다른 프로세스의 메모리 영역에 접근할 수 없다.
프로세스에 할당된 메모리 영역

프로세스의 메모리 영역 구조

stack
- 지역 변수, 함수의 매개변수, 반환되는 주소 값이 저장됨
- 높은 주소 값에서 낮은 주소 값으로 메모리가 할당되며, 영역 크기는 컴파일 때 결정됨
heap
- 사용자에 의해 동적 메모리 할당이 일어남
- 낮은 주소 값에서 높은 주소 값으로 메모리가 할당되며, 영역 크기는 런타임 때 결정됨
data
- 전역 변수, 정적 변수, 배열, 구조체 등이 저장되는 영역
- BSS(Block Stated Symbol) 영역과 데이터 영역으로 나눌 수 있음. BSS 영역은 초기화하지 않은 변수, 데이터 영역은 초기화한 변수를 저장함
code
- 실행할 코드가 기계어로 컴파일되어 저장되는 영역으로 text 영역이라고도 함
스택과 힙
스택 영역과 힙 영역은 동적으로 메모리 할당이 가능해 두 영역 사이에 빈 메모리 공간이 존재하게 된다.
- 스택 영역은 LIFO(후입선출) 방식으로, 높은 주소 값에서 낮은 주소 값 순서로 사용한다.
- 힙 영역은 FIFO(선입선출) 방식으로, 낮은 주소 값에서 높은 주소 값 순서로 사용한다.
하지만 메모리 영역을 공유하기 때문에 서로의 영역을 침범하는 문제가 발생할 수 있다!
- 스택 영역이 힙 영역을 침범하는 경우: 스택 오버플로
- 힙 영역이 스택 영역을 침범하는 경우: 힙 오버플로
스레드
프로세스는 한 개 이상의 스레드를 갖는데, 스레드는 프로세스에서 실제로 실행되는 흐름의 단위를 의미한다.

- 스레드는 프로세스 안에 존재하므로 프로세스의 메모리 공간을 이용하고, 지역 변수를 저장하는 스택 영역을 할당받는다. 그리고 전역 변수를 저장하는 힙 영역은 다른 스레드와 공유한다.
사용자 레벨 스레드와 커널 레벨 스레드
스레드도 커널과 마찬가지로 사용자 모드와 커널 모드로 구분한다.
- 사용자 레벨 스레드는 사용자가 라이브러리를 이용해 생성 및 관리한다.
- 커널 레벨 스레드는 커널이 스레드를 생성 및 관리한다.
멀티 스레드 환경에서 사용자 레벨 스레드와 커널 레벨 스레드는 3가지 관계를 맺을 수가 있다.
1️⃣ 다대일 모델: 멀티 코어의 병렬성 이용 불가
2️⃣ 일대일 모델: 다대일 모델의 단점 해결, but 사용자 레벨 스레드 수만큼 커널 레벨스레드가 생성되므로 성능 저하 일어날 수 있음
3️⃣ 다대다 모델: 구현 어려움 (커널 레벨 스레드 수 < 사용자 레벨 스레드 수)
1.2.2 PCB
OS는 프로세스를 제어하기 위해 프로세스 정보를 저장하는 이를 PCB(프로세스 제어 블록)라고 한다.

PCB에 저장되는 정보는 위와 같다.