운영체제2 - 프로세스, 스레드, PCB
프로세스?
컴퓨터에서 실행 중인 하나의 프로그램.
OS로부터 독립된 메모리 영역을 할당 받으며 다른 프로세스의 메모리 영역에 접근할 수 없다.
- 스택 : 지역 변수, 함수의 매개변수, 반환되는 주소 값 등이 저장되는 영역. 영역 크기는 컴파일 때 결정된다.
- 힙 : 사용자에 의해 동적 메모리 할당이 일어나는 영역이다. C 언어에서 malloc()으로 할당되는 영역. 영역 크기는 런타임때 결정된다.
- 데이터 : 전역 변수, 정적 변수, 배열, 구조체 등이 저장. 세부적으로 BSS(Block stated Symbol) 영역과 데이터 영역으로 다시 나눌 수 있다. BSS영역은 초기화하지 않은변수. 데이터 영역은 초기화한 변수를 저장.
- 코드 : 실행될 코드가 기계어로 컴파일되어 저장되는 영역. text영역이라고도 한다.
스택 영역과 힙 영역은 동적 메모리 할당이 가능하여 사이에 빈 메모리공간이 존재한다.
스택은 LIFO 방식으로 높은->낮은 주소 값 순서로 사용.
힙은 FIFO 방식으로 낮은->높은 주소 값 순서로 사용.
같은 메모리 영역을 공유 하기 때문에 서로의 영역을 침범하는 문제가 생길 수 있는데,
스택 -> 힙 영역 침범 시 스택 오버플로,
힙 -> 스택 영역 침범 시 힙 오버플로 라고 한다.
오버 플로 : 할당할 수 있는 최대 메모리 범위를 넘어가는 것.
언더 플로 : 할당할 수 있는 최소 메모리 범위보다 작은 것.
스레드?
프로세스에서 실제로 실행되는 흐름의 단위.(프로세스당 1개 이상의 스레드를 가짐)
프로세스 안에 존재하므로 프로세스의 메모리 공간을 이용한다.
스택 영역을 할당 받는다.
사용자 레벨 스레드와 커널 레벨 스레드
사용자 레벨 스레드?
사용자가 라이브러리를 이용해 생성 및 관리.
커널 레벨 스레드?
커널이 스레드를 생성 및 관리.
사용자/커널 스레드의 3가지 관계
1. 다대일 모델
사용자 레벨 스레드 n개에 커널 레벨 스레드 1개가 매핑되어 사용자 레벨에서 스레드를 관리한다.
하나의 사용자 레벨 스레드에서 시스템 콜을 호출하면 나머지 사용자 레벨 스레드는 커널에 접근 할 수 없으므로 멀티 코어. 즉 병렬성을 이용할 수 없다.
2. 일대일 모델
사용자 레벨 스레드 - 커널 레벨 스레드 1개가 매핑된다.
다대일 모델의 단점을 극복하였지만,
커널 레벨 스레드가 1:1 로 생성되므로 성능 저하가 일어날 수 있다.
3. 다대다 모델
n개-m개 로 매핑. 이때 커널 레벨 스레드m은 사용자 레벨 스레드n 이하 값이다. ex) 사용자 스레드 4 - 커널 스레드 4이하.
다대다, 일대일 모델의 장접을 포함하지만 구현이 어려운 단점이 있다.
PCB
OS가 프로세스를 제어하기 위해 프로세스 정보를 저장하는 것
현재 상태, PID, 부모PID, 자식PID, 프로세스 우선순위, 메모리 제한 등을 저장.
새로운 프로세스는 기존 프로세스에서 fork()함수를 호출해 생성한다.
부모 프로세스에서 fork()함수 호출 시 부모 프로세스는 자식의 PID값을 가지고
자식 프로세스는 0을 반환한다.