* 이 글은 스레드 컨텍스트 스위칭의 정확한 의미를 알고 계시다는 전제 하에 작성된 글입니다
👉 " CPU 코어에서 컨텍스트 스위칭 되는 건 프로세스일까 스레드일까 " 글 보러 가기
일반적으로
'프로세스 컨텍스트 스위칭은 무겁고 스레드 컨텍스트 스위칭은 가볍다'
라고 알려져 있다
왜 그런걸까?
프로세스 컨텍스트 스위칭 vs 스레드 컨텍스트 스위칭
컨텍스트 스위칭은 아래와 같은 작업을 수행한다 (넘버는 실행 순서와는 관계 없음)
1. 현재 실행 중인 프로세스 혹은 스레드의 context 백업 (가령, CPU 레지스터 값들, 어디까지 실행됐는지 등)
2. CPU 캐시를 비움(flush) (CPU 마다 L1, L2 cache에 대한 동작이 다를 수 있음, 심지어 안 비울 수도 있음)
3. TLB(table lookaside buffer)를 비움
4. MMU(memory management unit)를 변경
여기서 프로세스 컨텍스트 스위칭은 1, 2, 3, 4번을 모두 수행하지만
스레드 컨텍스트 스위칭은 1번만 수행한다
왜 스레드 컨텍스트 스위칭은 더 가벼운가?
왜 그런지를 이해하기 위해서는 프로세스와 스레드의 차이를 알아야 한다
서로 다른 프로세스는 서로 다른 메모리 주소 공간(memory address space)을 가진다
하지만 같은 프로세스에 속하는 서로 다른 스레드는 소속된 프로세스의 메모리 주소 공간을 공유한다
그렇기 때문에 프로세스 컨텍스트 스위칭을 할 때는
새로 실행되는 프로세스가 기존에 실행되는 프로세스의 메모리 주소 공간에 침범하면 안 되기 때문에
실행 중이었던 프로세스의 상태를 백업할 뿐만 아니라 (1번)
cache도 비워주고 (2번)
TLB도 비워주고 (3번)
가상 메모리 주소에서 물리적인 메모리 주소로 변환하는 역할을 하는 MMU 설정도 변경을 해주는 것이다 (4번)
특히 비워주는 작업인 2번과 3번이 시간을 꽤 잡아먹는 작업이기 때문에
프로세스 컨텍스트 스위칭은 스레드 컨텍스트 스위칭에 비해서 오래 걸리는 작업이 된다
(물론 사람 입장에서는 거의 체감이 안 되겠지만..)
반면 스레드 컨텍스트 스위칭의 경우에는,
즉, 같은 프로세스에 속하는 스레드 간의 컨텍스트 스위칭의 경우에는
메모리 주소 공간이 바뀌지 않기 때문에 2, 3, 4번은 수행하지 않아도 돼서
더 빨리 끝나는 가벼운 작업이 되는 것이다
하지만 2018년 즈음에 대재앙급 멜트다운 보안 이슈가 터지면서
이 문제를 해결하기 위해 KPTI (kernel page table isolation) 기법이 적용되고
TLB flush 정책도 영향을 받게 되는데
자세한 내용은 다음 기회에..
쉬운코드는 본질에 충실합니다