Context switching(문맥 교환)
개념
- 현재 실행되고 있던 프로세스/쓰레드의 상태를 저장하고 CPU를 다른 프로세스/쓰레드에게 넘겨주는 것
- 이때 CPU가 해당 프로세스를 실행하기 위한 정보들을 컨텍스트(Context)라고 함
- CPU에 실행할 프로세스를 교체하는 기술
- 프로세스 스케줄링 (opens in a new tab)과정에서 프로세스를 계속해서 기술
- 여러 프로세스/스레드를 동시에 실행시키기 위해 필요함
Context
: 프로세스와 관련된 정보들의 집합으로, 프로세스가 관리하는 정보는 두 곳에 저장됨- 실제 CPU는 Main memory의 데이터를 register에 올려서 작업을 하는데, register에 저장된 메모리를
register context
라고 함- CPU에 저장되는 정보 ➜ CPU register context
- 메모리에 저장되는 정보 ➜ Code, Data, Stack, PCB
- 보통 운영체제에서
Context
는 CPU가 해당 프로세스를 실행하기 위한 정보들로, 이Context
는 프로세스의 PCB (opens in a new tab)에 저장됨- 프로세스가 생성되면 메모리에 해당 프로세스의 PCB가 함께 생성되고, 종료 시 삭제됨
- 실제 CPU는 Main memory의 데이터를 register에 올려서 작업을 하는데, register에 저장된 메모리를
Context Saving
: 현재 프로세스의register context
를 저장하는 작업Context restoring
:register context
를 프로세스로 복구하는 작업Context Switching
- 실행 중인 프로세스의
Context
를 저장하고, 앞으로 실행할 프로세스의Context
를 복구하는 일 - 커널의 개입으로 이루어짐
- 실행 중인 프로세스의
발생 원인
- Interrupt handling (opens in a new tab): 커널 함수를 통해 프로그램 실행 도중에 중단되어 인터럽리 처리를 기다리는 경우
- Multitasking (opens in a new tab): 단일 CPU에서 동시에 작업이 실행되는 것처럼 보이도록 하는 경우(동시성은 컨텍스트 스위칭을 통해 달성됨)
- Time Quato Expiry: 주어진 quantum(time slice)의 시간이 끝난 경우(CPU의 사용 시간이 만료되었을 때)
- Preemption: 더 우선순위가 높은 일을 해야하는 경우
- 사용자 및 커널 모드 전환(User and kernel mode switching) (opens in a new tab)
등등
컨텍스트 스위칭 과정
기본 작업
- 커널 모드로 전환
- 프로세스에서 통제권이 넘어가 커널에서 실행됨
- 하드웨어와 밀접한 일이나 컴퓨터의 리소스를 사용해야 하는 일
- CPU의 register 상태 교체
- 각종 명령어를 실행하기 위해 필요한 데이터를 저장하는 register의 상태 교체
- 상태 정보를 기억해서 다른 컨텍스트 스위칭 때 사용할 수 있음
작동 순서
프로세스 A가 running
상태이고, 프로세스 B가 ready
상태일 때
- 스케줄러가 프로세스 A의 실행을 중단하고 프로세스 B를 실행할 것을 요청함(인터럽트/시스템 호출)
- 프로세스 A의 Stack의 데이터 위치를 가리키고 있는
SP(Stack Pointer)
의 값과 다음 실행해야 하는 코드의 주소값을 가지고 있는PC(Program Counter)
의 값을PCB
에 업데이트한 후에 메인 메모리에 저장함- SC와 PC는 모두 중앙처리장치 안의 레지스터임
- 프로세스 A의 상태는
ready
혹은block
으로 변경되고, CPU에서 프로세스 B를 실행함- 이 과정으로 프로세스 B의 상태는
ready
에서running
으로 변경됨(Dispatch)
- 이 과정으로 프로세스 B의 상태는
- 그리고 다시 프로세스 B에서 프로세스 A로 컨텍스트 스위칭을 하는 경우, 프로세스 B의 SP값과 PC값을 PCB에 저장함
- 이후, 실행해야 할 프로세스 A의 PCB 정보들을 메인 메모리에 가져와서 CPU 레지스터에 넣고 실행함
컨텍스트 스위칭의 오버헤드
- 컨텍스트 스위칭은 ms의 짧은 시간 단위로 밀어나지만, 과도하게 많이 일어나게 되면 오버헤드가 발생함
프로세스 vs 쓰레드 컨텍스트 스위칭
둘의 공통점은 커널 모드에서 실행된다는 점
Thread Context Switching
- 같은 프로세스 안의 쓰레드끼리 컨텍스트 스위칭이 발생하는 것
- 프로세스1의 스레드1 → 프로세스1의 스레드2
- 쓰레드는 스택 영역을 제외한 모든 메모리 영역을 공유하기 때문에 메모리 주소 관련한 정보는 바꿀 필요가 없고, CPU의 상태정보만 바꿔주면 됨
- 따라서 쓰레드 컨텍스트 스위칭은 공유하는 정보가 많아 기본 작업만 하면 되기 때문에 프로세스 컨텍스트 스위칭보다 더 빠름
- 작업:
커널 모드 전환
+CPU register 상태 교체
Process Context Switching
- 현재 실행중인 프로세스의 쓰레드와는 다른 프로세스의 쓰레드와 컨텍스트 스위칭이 발생하는 것
- 프로세스1의 스레드1 → 프로세스2의 스레드2
캐시 오염(cache pollution)
발생- CPU 내부에 캐시를 위한 공간이 존재하는데, 컨텍스트 스위칭이 발생하면 캐시의 데이터가 현재 실행중인 스레드의 데이터와 다를 수 있음
- 프로세스가 변경되어 새로운 프로세스가 CPU를 사용하지만, 캐시에는 이전 프로세스에서 사용하던 전혀 다른 데이터에 대한 캐시가 남게 되는데 이를 캐시 오염이라고 함
- 가상 메모리 주소 관련 처리를 추가로 수행해야 함
- MMU(Memory Management Unit) (opens in a new tab)가 새로운 프로세스의 주소 체계를 바라보도록 수정함
- 캐시 역할을 하는 TLB(Translation Lookaside Buffer) (opens in a new tab)를 완전히 비워줘야 함
- 작업:
커널 모드 전환
+CPU register 상태 교체
+가상 메모리 주소 처리(MMU 수정 + TLB 캐시 비우기)