프로세스 제어 블록
프로세스 제어 블록
프로세스를 실행하는데 필요한 중요한 정보를 보관하는 자료구조로 TCB라고도 한다. 모든 프로세스는 고유의 프로세스 제어 블록을 가지며, 프로세스 생성 시 만들어져서 프로세스가 실행을 완료하면 폐기된다.
프로세스 제어 블록의 구성
1. 포인터 : 프로세스 제어 블록의 첫 번 째 블록에는 포인터가 저장, 준비 상태나 대기 상태는 큐로 운영되는데, 프로세스 제어 블록을 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 포인터를 사용
2. 프로세스 상태 : 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등이 있다. 프로세스가 현재 어떤 상태에 있는지를 나타내며, 프로세스 제어 블록의 두 번째 블록에 저장된다.
3. 프로세스 구분자 : 운영체제 내에 있는 여러 프로세스를 구별하기 위한 구분자를 저장
4. 프로그램 카운터 : 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값을 저장한다.
5. 프로세스 우선순위 : 프로세스의 중요도가 각각 다르다. 사용자 프로세스보다 중요도가 큰 커널 프로세스는 우선순위가 높고, 사용자 프로세스끼리도 우선순위가 다르다. 다양한 우선순위의 프로세스가 대기 상태로 들어오기 때문에 대기 상태의 큐도 우선순위별로 따로 운영된다. 다시 말해 우선순위에 따라 프로세스 제어 블록들이 여러 줄로 서 있다. CPU 스케줄러가 준비 상태에 있는 프로세스 중 실행 상태로 옮겨야 할 프로세스를 선택할 때는 프로세스 우선순위를 기준으로 삼는다. 높은 우선순위의 프로세스가 낮은 우선순위의 프로세스보다 먼저 실행되고 더 자주 실행된다.
6. 각종 레지스터 정보 : 프로세스 제어 블록에는 프로세스가 실행되는 중에 사용하던 레지스터, 예를 들면 누산기, 색인 레지스터, 스택 포인터와 같은 레지스터의 값이 저장된다. 이전에 실행할 때 사용한 레지스터의 값을 보관해야 다음에 실행할 수 있기 때문에 자신이 사용하던 레지스터의 중간값을 보관한다.
7. 메모리 관리 정보 : 프로세스 제어 블록에는 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등이 저장된다. 그 외에 세그먼테이션 테이블, 페이지 테이블 등의 정보도 보관한다.
8. 할당된 자원 정보 : 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보를 말한다. 어떤 프로세스가 하드디스크에 저장된 파일을 열어서 작업하거나, 음악을 출력하기 위해 사운드 카드에 접근하고 있다면 파일이나 사운드카드에 대한 정보가 필요한데, 이러한 정보를 프로세스 제어 블록에 저장한다.
9. 계정 정보 : 계정 번호, CPU 할당 시간, CPU 사용 시간 등으로, 이러한 정보는 프로세스 제어 블록에 저장된다.
10. 부모 프로세스 구분자와 자식 프로세스 구분자 : 부모 프로세스를 가리키는 PPID와 자식 프로세스를 가리키는 CPID 정보도 저장된다.
포인터의 역할
입출력이 완료되기를 기다리는 프로세스는 대기 상태로 모인다. 시스템 내에는 다양한 종류의 입출력장치가 있기 때문에 대기 상태로 모이는 프로세스도 다양, 그런데 이것들을 하나로 모아놓으면 관리하기가 불편하다. 대기 상태에서 같은 입출력을 기다리는 프로세스의 프로세스 제어 블록은 동일한 입출력 큐에 모여 있는데 이를 대기 큐라고 한다. 지금까지는 준비 상태의 프로세스가 한 줄로 서 있는 것처럼, 즉 준비 큐가 하나만 있는 것처럼 설명했으나 준비 큐는 프로세스의 우선순위에 따라 여러 개의 큐로 나뉜다.
문맥 교환
CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말한다. 이 때 두 프로세스 제어 블록의 내용이 변경된다. 실행 상태에서 나가는 프로세스 제어 블록에는 지금까지의 작업 내용을 저장하고, 반대로 실행 상태로 들어오는 프로세스 제어 블록의 내용으로 CPU가 다시 세팅된다. 이전 작업 상태가 되어야 다음 작업을 할 수 있기 때문, 이와 같이 두 프로세스 제어 블록을 교환하는 작업이 문맥 교환
문맥 교환의 절차
실행 상태에 있는 프로세스 P1이 자신에게 주어진 시간을 다 사용하여 타임아웃이 되면 P1의 프로세스 제어 블록에 현재까지의 작업 결과가 저장되고 P1은 준비 상태로 쫓겨난다. 준비 상태에 있던 프로세스 P2가 실행 상태로 가면 CPU의 레지스터가 P2의 프로세스 제어 블록 값으로 채워져 다음 작업을 하게 된다.
문맥 교환이 일어나는 경우는 ㅁ우 다양, 일반적으로 한 프로세스가 자신에게 주어진 시간을 다 사용하면 발생하고, 인터럽트가 걸렸을 때도 발생, 예를 들어 어떤 프로세스가 자신에게 주어진 메모리 공간을 넘어가려 한다면 이는 경계 레지스터의 범위를 벗어나는 것, 이 때 인터럽트가 발생하여 현재 실행 중인 프로세스의 제어 블록을 저장한 후 인터럽트 관리 프로세스를 실행 상태로 만든다. 인터럽트 관리 프로세스는 메모리 범위를 넘어선 프로세스를 강제로 종료하고 인터럽트 처리를 마치는데, 이와 같이 인터럽트 처리를 할 때도 문맥 교환이 일어난다.