프로세스는 메모리에 적재되어 CPU에 의해 실행되고 있는 프로그램이다. 프로세스는 하나 이상의 스레드로 구성되며, 스레드는 프로세스 내의 실행 흐름의 단위이다. 프로세스는 생성 시에 독립적인 코드 영역(텍스트 영역), 데이터 영역, 힙 영역, 스택 영역을 할당받는다. 반면에 스레드는 프로그램 카운터 및 그 외 레지스터와 스택만을 할당받으며, 스레드 간에 같은 코드, 데이터, 힙 영역을 공유한다.
- 코드(텍스트) 영역: 프로그램 명령 코드 자체를 저장하는 메모리 영역. HEX, BIN 파일 저장 영역(정적 할당 영역)
- 데이터 영역: 전역 변수, 매개 변수, 배열, 구조체 등이 저장되는 영역. 함수 호출 시 생성되고 함수가 끝나면 시스템에 반환됨. (정적 할당 영역)
- 힙 영역: malloc(), new()와 같은 동적인 메모리를 할당하고자 할 때 사용하는 메모리 영역 (동적 할당 영역)
- 스택 영역: 함수 호출 시 되돌아갈 위치 값 및 함수 내에서 선언한 변수 등을 저장하기 위해 사용되는 메모리 공간 (동적 할당 영역)
하나의 프로세스 내에서 여러 스레드를 생성하여 동시에 작업을 처리하는 것을 멀티 스레딩이라고 하는데, 멀티 스레딩을 사용할 경우 멀티 프로세싱보다 프로세스 생성, 컨텍스트 스위칭 같은 오버헤드가 줄어들고, 스레드 간에 기억 공간을 공유하여 효율적으로 통신이 가능하게 된다.
PCB(Process Control Block)
프로세스 생성 시에는 운영체제가 PCB를 생성한다. 이 PCB는 해당 프로세스에 대한 정보를 담고 있는 자료 구조다. PCB는 프로세스와 생명 주기를 같이 한다. 즉, 프로세스가 생성되면 PCB가 생성되고 프로세스가 종료될 때 PCB도 소멸한다. PCB에는 프로세스 ID, 레지스터 값, 프로세스 상태, CPU 스케줄링 정보, 메모리 관리 정보, 사용한 파일 및 입출력 장치 목록 등이 들어 있다.
프로세스 상태
프로세스는 생성(new), 준비(ready), 실행(running), 대기(blocked), 종료(terminated)의 상태 중 하나의 상태를 가지며, 이 상태는 PCB에 기록된다. 생성 상태는 프로세스가 생성 중인 상태이며 아직 실행 준비를 마치지 않은 상태이고, 준비 상태는 실행 준비를 마치고 CPU 할당을 대기하고 있는 상태이다. 이때, 프로세스가 CPU를 할당받아 실행 상태로 변하는 것을 '디스패치'라고 한다. 프로세스가 CPU를 할당받아 실행 중일 때 실행 상태가 되며, I/O작업 등이 발생했을 때 대기 상태가 된다. 프로세스가 모든 작업을 마치고 종료되면 종료 상태가 된다.
컨텍스트 스위치(context switch)
프로그램이 메모리에 적재되어 실행할 준비가 되면 운영체제가 프로세스에 CPU를 할당해 주고, 이 CPU가 프로세스를 처리하게 된다. 이때 CPU가 다른 프로세스를 처리하기 위해 전환하는 것을 컨텍스트 스위치(문맥 전환)라고 한다. 컨텍스트 스위치를 위해서 현재 프로세스의 상태 및 정보를 PCB에 저장하고 다음 프로세스에 대한 상태 및 정보를 PCB에서 가져와 프로세스를 복원하는 과정을 거친다.
멀티스레딩의 장단점
멀티 스레딩을 사용하면 멀티 프로세싱을 사용할 때보다 처리율과 성능 개선을 기대할 수 있다. 또한, 기억 공간을 일부 공유하기에 메모리 사용량을 줄일 수 있다. 하지만, 프로세스 내 스레드들은 메모리 등 자원을 공유하고 있기 때문에 공유 자원에 문제가 생길 경우 전체 스레드가 제대로 동작하지 못할 수 있다.
지난 글
- 프로세스와 스레드 차이 - https://lifewithcoding.tistory.com/113
- 프로세스 - https://lifewithcoding.tistory.com/246
- 프로세스 상태 - https://lifewithcoding.tistory.com/247
- 프로세스 스케줄링 - https://lifewithcoding.tistory.com/262
- 프로세스 스케줄링 방식 - https://lifewithcoding.tistory.com/263