[OS] 문맥 교환(context switch) 이란?
문맥 교환을 설명하기 앞서 프로세스 스케줄링과 스케줄링 큐에 대해 먼저 알아볼 필요가 있다.
📌 프로세스 스케줄링
프로세스 스케줄링이란 CPU를 사용하려고 하는 프로세스들 사이의 우선순위를 관리하는 일이다. 처리율과 CPU 이용률을 증가시키고 오버헤드/응답시간/반환시간/대기시간을 최소화시키기 위한 기법으로 CPU가 쉬지 않고 계속 열심히 일할 수 있도록 효율적인 계획을 잡아준다.
📌 스케줄링 큐
프로세스 스케줄링의 일반적인 그림이 바로 밑 그림이다. 화살표는 시스템의 프로세스의 흐름을 나타낸다. 프로세스가 시스템에 들어가면 준비 큐에 들어가서 준비 상태가 되어 CPU 코어에서 실행되기를 기다린다. 이 큐는 일반적으로 연결 리스트로 저장된다. 준비 큐 헤더에는 리스트의 첫 번째 PCB에 대한 포인터가 저장되고 각 PCB에는 준비 큐 다음 PCB를 가르키는 포인터 필드가 포함된다.
시스템에는 다른 큐도 존재한다. CPU 코어에 프로세스가 할당되면 프로세스는 잠시 동안 실행되어 결국 종료되거나 인터럽트 되거나 I/O 요청의 완료와 같은 특정 이벤트가 발생할 때까지 기다린다. 프로세스가 디스크와 같은 장치에 I/O 요청을 한다고 가정하자. 장치는 프로세서보다 상당히 느리게 실행되므로 프로세스는 I/O가 사용 가능할 때까지 기다려야 한다. I/O 완료와 같은 특정 이벤트가 발생하기를 기다리는 프로세스는 대기 큐에 삽입된다.
📌 문맥 교환
문맥 교환은 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)을 보관하고 새로운 프로세스의 상태를 적재하는 작업을 말한다. 이때 한 프로세스의 문맥은 그 프로세스의 프로세스 제어 블록(PCB)에 기록되게 된다.
예를 들어, 현재 프로세스 A가 CPU를 사용하고 있는 상황에서 CPU 사용시간이 끝나 다음 프로세스에게 CPU를 넘겨주어야 한다.
스케줄링 알고리즘에 의해 다음 CPU를 받을 프로세스 B가 선택되었으며 타이머 인터럽트가 발생해 CPU의 제어권을 운영체제에게 넘어가게 되는데, 이 과정에서 운영체제는 타이머 인터럽트 처리 루틴으로 가서 직전까지 수행중이던 프로세스 A의 문맥(프로그램 카운터 등)을 자신의 PCB에 저장하고 프로세스 B는 예전에 저장했던 자신의 문맥을 PCB로부터 실제 하드웨어로 복원 시키는 과정을 거치게 된다.
※ 여기서 문맥교환에 필요한 시간, 메모리 등을 오버헤드라 부른다.
PCB(Process Control Block)란?
운영체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내 자료구조로 커널 주소 공간의 data 영역에 존재한다.
📌 문맥 교환의 시점
멀티 태스킹
- 다수의 프로세스가 하나의 CPU자원을 나누어 사용하는 것
- 실행 가능한 프로세스들이 운영체제의 스케줄러에 의해 조금씩 번갈아 수행됨
- CPU를 할당받을 때 문맥 교환이 일어남
- 매우 빠른 속도로 처리되기 때문에 동시에 처리되는 것처럼 느낌
인터럽트 처리
- 인터럽트란 컴퓨터 시스템에서 예외 상황이 발생했을 때 CPU에게 알려 처리할 수 있도록 하는 것
- 인터럽트가 발생할 때 문맥 교환이 일어남
- I/O request : 입출력 요청
- time slice expried : CPU 사용시간 만료
- fork a child : 자식 프로세스 생성
- wait for an interrupt : 인터럽트 처리 대기
사용자 및 커널 모드 전환
- 운영 체제에서 사용자 모드와 커널 모드 사이의 전환이 필요할 때 필수는 아니지만 운영체제에 따라 문맥 교환이 발생