먼저 프로세스란 실행중인 프로그램 또는 작업
이라고 할 수 있다. CPU가 프로세스를 실행하기 위해서는 프로세스에 대한 정보가 필요한데, 이를 Context라고 한다. 각 프로세스의 Context를 저장한 공간을 PCB라고 한다.
PCB는 운영체제의 커널 내부에 존재한다. 또한, 각 프로세스의 생성과 동시에 생성되며, 프로세스 종료 시 함께 사라진다.
위 이미지는 PCB 구조를 나타내고 있다. PCB는 다음과 같은 정보를 보유한다.
1) 프로세스 식별자(Process ID)
2) 프로세스 상태(Process State) : 생성(create), 준비(ready), 실행 (running), 대기(waiting), 완료(terminated)
3) 프로그램 계수기(Program Counter) : 이 프로세스가 다음에 실행할 명령어의 주소
4) 사용 중인 레지스터 정보
5) CPU 스케줄링 정보 : 우선 순위, 최종 실행시각, CPU 점유시간 등
6) 메모리 관리 정보(Memory limits) : 사용 가능한 메모리 공간 정보
7) 입출력 상태 정보 : 프로세스에 할당된 입출력장치 목록, 사용 파일 목록 등
8) 포인터 : 부모 프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보
CPU가 실행하는 프로세스가 교체되며 CPU에서 관리하는 Context가 교체되는 것을 컨텍스트 스위칭이라고 한다.
먼저, CPU가 실행중인 프로세스의 Context는 해당 PCB에서 정보를 읽어와 CPU 내부의 레지스터가 관리한다. 그러다가 인터럽트
가 발생하게 되면 해당 프로세스의 실행을 중지하게 된다. 인터럽트는 입출력 요청, CPU 사용 시간 만료, 자식 프로세스 생성, 인터럽트 처리 대기
등에 의해 발생하게 된다.
인터럽트가 발생하면 스케줄러에 의해 다음 프로세스가 실행이 되어야 한다. 다음 프로세스에게 차례를 넘겨주기 위해, 레지스터에서 다뤘던 종료될 프로세스의 Context를 PCB에 업데이트하게 된다. 이후에 다음 프로세스의 Context를 PCB에서 메인 메모리로 올리게 되고 CPU가 실행할 수 있게되는 것이다.
컨텍스트 스위칭을 통해 멀티프로세싱, 멀티스레딩을 구현할 수 있다. 그러나 Context 교체를 하는 동안 프로세스가 실행될 수 없으므로, 잦은 컨텍스트 스위칭은 오버헤드를 발생시켜 CPU의 성능을 저하시킬 수 있다.
와우!!