컨텍스트 스위치

mydailylogs
|2022. 12. 6. 23:43

운영체제 커널은 문맥 전환(context switch)이라고 알려진 예외적인 제어흐름의 상위 수준 형태를 사용해서 멀티태스킹을 구현하고 있다. 문맥 전환 매커니즘은 앞서 설명한 저수준 예외 (Interrupt, Trap, Fault, Abort) 위에 구축된다.

커널은 각 프로세스마다 고유한 컨텍스트를 유지한다. 컨텍스트는 커널이 선점된 프로세스를 다시 시작하기 위해 필요로 하는 상태이다.

예를 들어 다음의 정보들이 컨텍스트에 포함된다.

  1. 범용 레지스터
  2. 부동 소수점 레지스터
  3. 프로그램 카운터
  4. 사용자 스택
  5. 상태 레지스터
  6. 커널 스택
  7. 페이지 테이블
  8. 프로세스 테이블
  9. 파일 테이블

프로세스가 실행되는 동안 어떤 시점에 커널은 현재 프로세스를 선점하고 이전에 선점된 프로세스를 다시 시작할 것을 결정할 수 있다. 이러한 결정이 이뤄지는 과정을 스케쥴링이라고 부르며, 이는 스케쥴러라고 불리는 커널 내부의 코드에 의해서 처리된다. 커널이 실행할 새 프로세스를 선택할 때 커널이 그 프로세스를 스케쥴했다고 부르곤 한다.

이때 커널이 실행할 새 프로세스를 스케쥴한 후 현재 프로세스를 선점(일시적으로 정지)하는 것을 컨텍스트 스위칭한다고 하며, 이 메커니즘을 이용해서 새로운 프로세스로 제어를 이동한다. 

컨텍스트 스위칭의 일반적인 수행 절차는 다음과 같다.

(1) 현재 프로세스의 컨텍스트를 저장
(2) 이전에 선점되어진 프로세스의 저장된 컨텍스트를 복원
(3) 제어를 새롭게 복원된 프로세스로 전달

컨텍스트의 전환은 커널이 사용자를 대신해서 시스템 콜을 실행하고 있을 때 일어날 수 있다. 만일 시스템 콜이 어떤 이벤트의 발생을 기다리기 때문에 시스템 콜이 블록되어 있다면 커널은 현재 프로세스를 sleep 시키고, 즉시 수행이 가능한 다른 프로세스로 전환한다. 예를 들어 read 시스템 콜이 디스크 접근을 요구하면, 커널은 컨텍스트 전환을 할 수 있으며 디스크로부터 데이터를 기다리는 대신 다른 프로세스를 돌릴 수 있다.

그림 1. 프로세스 문맥 전환의 분석

다른 예는 sleep 시스템콜로 호출하는 프로세스를 Sleep 상태로 만들기 위해서 문맥 전환을 요청하게 된다. 일반적으로 어떤 시스템 콜이 블록되지 않았다 하더라도 커널은 시스템 콜을 호출했던 프로세스로 제어를 돌려주는 대신 문맥 전환을 수행하도록 지정할 수 있다.

문맥 전환은 인터럽트의 결과로도 발생할 수 있다. 예를 들어 모든 시스템은 주기적인 타이머 인터럽트를 생성하는 대개 1 ms, 또는 10 ms 마다의 특정 메커니즘을 가지고 있다. 타이머 인터럽트가 일어날 때마다 커널은 현재 프로세스가 충분히 오래 실행되었다고 판단하여 새로운 프로세스로 전환할 것을 결정할 수 있다.

위의 그림은 두 개의 프로세스 A와 B 사이의 컨텍스트 전환을 보여준다. 해당 예제에서 프로세스 A는 read 시스템 콜 호출 이전에 사용자 모드에서 돌고 있다. 그러다 시스템 콜이 호출되고 트랩이 걸리게 되자 DMA 전송을 디스크 컨트롤러에게 요청하며 디스크 컨트롤러가 데이터를 디스크에서 메모리로 전송한 이후 프로세서에 인터럽트를 걸도록 디스크를 제어한다.

디스크는 데이터를 가져오는데 비교적 긴 시간이 걸릴 것이며, 그래서 커널은 기다리는 도중 아무것도 안하는 대신 프로세스 B로 컨텍스트를 전환하여 계속 자원을 돌린다. 그러다가 DMA가 완료되면 다시 인터럽트가 걸려 CPU에게 해당 사실을 알리게 되고 다시 A로의 컨텍스트 전환이 이뤄진다.

'CS > OS' 카테고리의 다른 글

프로세스 제어  (0) 2022.12.07
시스템 콜의 에러 처리  (0) 2022.12.07
프로세스  (0) 2022.12.06
Exception Control Flow 소개  (0) 2022.12.06
공유 라이브러리로 동적 링크하기 (run-time linking)  (0) 2022.12.06