-
컴퓨터에서 실행중인 프로그램
- 프로그램 : 저장 장치에 파일 단위로 저장되어 있으며, 아직 실행되지 않은 코드
-
각자 고유한 공간과 자원을 할당받는다.
- 각각의 code, data, stack, heap 영역을 보유
- code : 프로세스가 실행할 코드가 기계어 형태로 저장된 공간
- 컴파일 시점에 결정
- data : 전역변수, static 변수 등이 저장된 공간
- 컴파일 시점에 결정
- heap : 프로그래머가 관리하는 메모리 공간
- 동적 할당 → 런타임에 결정
- stack : 함수 내 선언된 지역변수, 매개변수, 리턴값, 복귀 주소 등을 저장
- 컴파일 타임에 결정
-
각각의 영역을 갖기에 동기화 작업이 필요하지 않다.
-
각각의 영역을 갖기에 컨텍스트 스위칭 비용이 크다.
- PCB가 생성되며 OS가 실행한 프로그램의 코드를 읽어들여 프로세스에 할당된 메모리의 code 영역에 저장한다.
- 초기화된 전역 변수 및 static 변수를 data 영역에 할당.
- Heap과 Stack은 초기 메모리 주소 초기화
- PCB에 여러 정보가 기록되면 Ready Queue에서 CPU를 할당받기까지 대기한다.
- 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 곳
- 프로세스의 상태 정보를 저장하는 구조체, 컨텍스트 스위칭을 위해 필요하다.
- PCB에 저장되어 있는 정보
-
PID (프로세스 고유 번호)
-
Process State (new, ready, running, waiting(blocked), terminated 등의 상태)
-
Program Counter (다음 실행될 명령의 포인터)
-
CPU registers (CPU 레지스터)
-
CPU scheduling information (CPU 스케줄링 정보)
-
Memory-management information (할당된 자원 정보)
-
Accounting information (CPU 사용시간 등)
-
I/O status information (입출력 상태 정보)
-
- 한 프로세스에서의 실행 단위
- stack만 고유한 영역을 갖고 나머지 영역은 프로세스 자원을 공유
- stack 이외의 영역을 공유하므로 동기화 작업이 필요
- stack 이외의 영역을 공유하므로 컨텍스트 비용이 적다.
- 쓰레드마다 스택을 독립적으로 할당하는 이유
- 스택 메모리 공간이 독립적 → 독립적 함수 호출이 가능하다 → 독립적인 실행 흐름
- 하나의 프로그램을 여러 프로세스로 구성하여 프로세스가 병렬적으로 작업을 수행하는 것
- 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 끼치지 않는다.
- 멀티 쓰레드보다 더 많은 메모리 공간을 차지하기 때문에 컨텍스트 스위칭이 느리다.
- 하나의 프로세스를 여러 개의 스레드로 구성하여 자원을 공유하면서 작업을 수행
- 멀티 프로세스보다 적은 메모리 공간을 차지하여 컨텍스트 스위칭이 빠르다.
- 자원을 공유하고 있기 때문에 하나의 스레드에 오류가 생겨 종료되면 모든 스레드가 종료될 수 있다.
- 동기화 문제를 가지고 있다.
- 프로그램을 여러 개 키는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이 더욱 효율적
- 컨텍스트 스위칭 시 stack 영역만 초기화하면 되기 때문에 빠르다.
- 프로세스를 생성하여 자원을 할당하는 콜이 줄어들어 자원을 효율적으로 관리