[운영체제] 프로세스 (PCB, 프로세스 상태, 문맥 교환, 프로세스 구조)
💡 프로세스와 PCB
프로그램과 프로세스는 어떤 차이가 있을까요?
프로그램은 저장장치에 저장되어 있는 정적인 상태이고, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태입니다. 프로세스는 컴퓨터 시스템의 작업 단위로 태스크(task)라고도 부릅니다.
운영체제는 프로그램을 메모리의 적당한 위치로 가져옵니다. 그와 동시에 프로세스 제어 블록(Process Control Block, PCB)라고 하는 작업 지시서를 만듭니다. PCB 에는 프로세스를 처리하는 데 필요한 다양한 정보가 들어있습니다.
PCB 에 있는 다양한 정보 중 대표적인 세 가지는 다음과 같습니다.
- 프로세스 구분자: 메모리에는 여러 개의 프로세스가 존재하기 때문에 각 프로세스를 구분하는 구분자(ID)가 필요합니다.
- 메모리 관련 정보: CPU 는 실행하려는 프로세스가 메모리의 어디에 저장되어 있는지를 알아야 작업을 할 수 있습니다. 이를 위해 PCB 에는 메모리 위치 정보, 경계 레지스터, 한계 레지스터가 포함되어 있습니다.
- 각종 중간값: PCB 에는 프로세스가 사용했던 중간값이 저장되는데, 시분할 시스템에서 여러 프로세스가 번갈아가면서 실행되기 때문에 일정 시간 후 다시 작업을 진행할 수 있도록 다음에 작업해야할 코드의 위치를 저장합니다.
결론적으로 하나의 프로세스를 실행하려면 프로세스 구분자, 메모리 관련 정보, 각종 중간값을 관리해야 하며, 이러한 정보를 보관하는 데이터 구조가 PCB 입니다. PCB 는 운영체제 영역에 만들어지게 됩니다. 또한 프로세스가 종료되면 프로세스가 메모리에서 삭제되고 PCB 도 폐기됩니다.
프로세스 = 프로그램 + PCB
💡 프로세스의 상태
운영체제에서는 여러 가지 이유로 프로세스 상태(process status)가 변화됩니다.
일괄 작업 시스템의 경우 프로세스가 생성된 후 CPU 를 얻어 실행되고 작업을 마치면 종료됩니다. 따라서 일괄 작업 시스템의 프로세스 상태는 생성(create), 실행(run), 완료(terminate) 입니다.
💡 프로세스의 네 가지 상태
시분할 시스템에서의 프로세스 상태는 일괄 작업 시스템보다 조금 더 복잡합니다. CPU 를 얻어 실행 중인 프로세스가 중간에 다른 프로세스에게 CPU 를 넘겨주는 일이 빈번하기 때문입니다. 시분할 시스템에서 프로세스 상태는 다음과 같습니다.
- 생성 상태(create status): 프로세스가 메모리에 올라와 실행 준비를 완료한 상태입니다. PCB 가 생성됩니다.
- 준비 상태(ready status): 생성된 프로세스가 CPU 를 얻을 때까지 기다리는 상태입니다.
- 실행 상태(running status): 준비 상태에 있는 프로세스 중 하나가 CPU 를 얻어 실제 작업을 수행하는 상태입니다. 실행 상태에 들어간 프로세스는 일정 기간 동안 CPU 를 사용할 권리를 가집니다. 만약 주어진 시간 안에 작업을 끝내지 못했다면 프로세스는 준비 상태로 돌아가 다음 차례를 기다립니다.
- 완료 상태(terminate status): 실행 상태의 프로세스가 주어진 시간 안에 작업을 마치면 완료 상태로 진입합니다. 완료 상태에서는 PCB 가 폐기됩니다.
준비 상태에 있는 여러 프로세스 중 다음에 실행할 프로세스를 선정하는 일은 CPU 스케줄러가 담당합니다. 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU 스케줄러 작업을 디스패치(dispatch)라고 합니다. 또한 프로세스가 주어진 시간 안에 작업을 끝내지 못했다면 다시 준비 상태로 돌아가는데 이를 타임아웃(time out) 이라고 합니다.
💡 프로세스의 다섯 가지 상태
프로세스는 생성, 준비, 실행, 완료라는 네 가지 상태만으로 작업을 진행하는 데 큰 문제가 없습니다. 하지만 오늘날 운영체제의 효율성을 고려하여 한 가지 상태가 더 만들어졌습니다.
어떤 프로세스가 실행 상태에 들어가 입출력을 요구했다고 가정해보겠습니다. 인터럽트 시스템에서 프로세스가 입출력을 요구하면 CPU 가 직접 데이터를 가져오지 않고 입출력 관리자에게 명령을 내립니다. 이 상태에서 프로세스는 요청한 작업이 끝날 때까지 다음 작업을 수행할 수 없습니다. 따라서 CPU 도 아무 작업을 하지 않고 기다리게 되어 효율성이 떨어집니다.
입출력을 요구한 프로세스가 입출력이 완료될 때까지 기다리는 상태를 대기 상태(blocking status)라고 합니다. 이는 작업의 효율성을 높이기 위해 입출력을 요청한 프로세스를 대기 상태로 옮기고, CPU 스케줄러가 준비 상태에 있는 프로세스 중 하나를 실행 상태로 만드는 것입니다.
다섯 가지 프로세스 상태를 정리해보겠습니다.
- 생성 상태: 프로그램이 메모리에 올라오고 PCB 를 할당받은 상태입니다.
- 준비 상태: 실행 대기 중인 모든 프로세스가 자기 순서를 기다리는 상태입니다. PCB 는 준비 큐(ready queue)에서 기다리며 CPU 스케줄러에 의해 관리됩니다. CPU 스케줄러는 준비 상태에서 큐를 몇 개 운영할지, 큐에 있는 어떤 PCB 를 실행 상태로 보낼지를 결정합니다.
- 실행 상태: 프로세스가 CPU 를 할당받아 실행되는 상태입니다. 준비 상태에 있는 많은 프로세스 중 실행 상태에 들어가는 프로세스는 CPU 의 개수 만큼입니다.
- 대기 상태: 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될때까지 기다리는 상태로 ‘wait status’ 라고도 합니다. 대기 상태는 작업의 효율을 위해 만들어진 것으로, 대기 상태의 프로세스는 입출력장치별로 마련된 큐에서 기다립니다.
- 완료 상태: 프로세스가 종료되는 상태입니다.
💡 프로세스 제어 블록 (PCB)
PCB 는 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료 구조로 TCB(Task Control Block)라고도 합니다. 모든 프로세스는 고유한 PCB 를 가지며, PCB 는 프로세스 생성과 함께 만들어지고 프로세스가 완료되면 폐기됩니다.
💡 PCB 의 구성
PCB 는 다음과 같이 구성됩니다.
- 포인터: PCB 의 첫 번째 블록에 저장됩니다. 준비 상태나 대기 상태는 큐로 운영되는데, PCB 를 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 포인터를 사용합니다.
- 프로세스 상태: PCB 의 두 번째 블록에 저장됩니다. 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등의 상태가 있습니다. 이는 프로세스가 현재 어떤 상태에 있는지를 나타냅니다.
- 프로세스 구분자: 운영체제 내에 있는 여러 프로세스를 구별하기 위한 구분자를 저장합니다.
- 프로세스 우선순위: 다양한 우선순위의 프로세스가 대기 상태로 들어오기 때문에 대기 상태의 큐도 우선순위별로 따로 운영됩니다. CPU 스케줄러가 준비 상태에 있는 프로세스 중 실행 상태로 옮길 프로세스를 선택할 때 프로세스 우선순위를 기준으로 삼습니다.
- 각종 레지스터 정보: 프로세스가 실행 중에 사용하던 레지스터의 값을 저장합니다. 이전에 실행할 때 사용한 레지스터의 값을 보관해야 다음에 실행할 수 있기 때문에 자신이 사용하던 레지스터의 중간값을 보관합니다.
- 메모리 관리 정보: 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등이 저장됩니다.
- 할당된 자원 정보: 프로세스를 실행하기 위해 사용되는 입출력 자원이나 오픈 파일 등에 대한 정보를 저장합니다.
- 계정 정보: 계정 번호, CPU 할당 시간, CPU 사용 시간 등이 저장됩니다.
- 부모 프로세스 구분자와 자식 프로세스 구분자: 부모 프로세스를 가리키는 PPID 와 자식 프로세스를 가리키는 CPID 정보가 저장됩니다.
💡 문맥 교환 (Context Switching)
문맥 교환은 CPU 를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말합니다. 이때 두 PCB 의 내용이 변경됩니다. 실행 상태에서 나가는 PCB 에는 지금까지의 작업 내용을 저장하고, 실행 상태로 들어오는 PCB 의 내용으로 CPU 가 다시 세팅됩니다.
💡 문맥 교환의 절차
위 그림은 프로세스 P1 과 P2 의 문맥 교환 과정을 나타냅니다. 실행 상태에 있는 P1 이 자신에게 주어진 시간을 다 사용하여 타임아웃이 되면 P1 의 PCB 에 현재까지의 작업 결과가 저장되고 준비 상태가 됩니다. 준비 상태에 있던 P2 가 실행 상태가 되면 CPU 의 레지스터가 P2 의 PCB 값으로 변경되어 다음 작업을 하게 됩니다.
💡 프로세스의 구조
프로세스의 구조는 다음과 같습니다.
- 코드 영역(code area): 프로그램의 본문이 기술된 곳으로 텍스트 영역이라고도 합니다.
- 데이터 영역(data area): 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳입니다.
- 스택 영역(stack area): 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳입니다.
💡 참고
쉽게 배우는 운영체제 - 조성호