나만의 작은 도서관
[TIL][C++] 250703 MMO 서버 개발 50일차: 프로세스 컨텍스트 스위칭이 스레드 컨텍스트 스위칭보다 무거운 이유 본문
Today I Learn
[TIL][C++] 250703 MMO 서버 개발 50일차: 프로세스 컨텍스트 스위칭이 스레드 컨텍스트 스위칭보다 무거운 이유
pledge24 2025. 7. 3. 21:13주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다.
컨텍스트 스위칭(context switching)이란?
- 코어에서 실행 중이던 스레드가 다른 스레드로 교체되는 상황을 의미
컨텍스트(context)란?
- 스레드의 상태를 의미, CPU나 메모리 등등…
- CPU에는 레지스터가 있음.
컨텍스트 스위칭은 왜 필요한가?
- 하나의 코어에서 여러 프로세스 또는 여러 스레드를 실행시키기 위해서다. 컨텍스트 스위칭을 하지 않는다면, 기존에 실행되던 컨텍스트만 실행되기 때문에 코어의 개수 이상의 프로세스를 실행할 수 없게 된다.
컨텍스트 스위칭은 언제 발생하는가?
- 다양한 상황에서 발생한다. 배정받은 time slice를 초과했거나, CPU를 사용하지 않는 작업인 I/O 작업이나 다른 리소스를 가져오거나, 파일에 접근한다거나 할 때 발생한다.
- 인터럽트나 시스템 콜이 발생했을 때도 컨텍스트 스위칭이 발생한다.
컨텍스트 스위칭은 누구에 의해 실행되는가?
- OS 커널(kernel)에 의해 실행.
- 커널은 각종 컴퓨터 리소스를 관리/감독하는 역할
컨텍스트 스위칭의 종류 두 가지
- 서로 다른 프로세스 스레드 스위칭 → 프로세스 컨텍스트 스위칭
- 같은 프로세스 스레드 스위칭 → 스레드 컨텍스트 스위칭
프로세스 컨텍스트 스위칭이 스레드 컨텍스트 스위칭보다 무거운 이유
- 프로세스 컨텍스트 스위칭과 스레드 컨텍스트 스위칭 모두 아래와 같은 작업을 거쳐야 한다.
- 커널 모드 전환: 스케줄러 실행을 위한 사용자 모드 ↔ 커널 모드 전환 비용
- 컨텍스트 저장/복원: 현재 스레드의 레지스터 값, 프로그램 카운터, 스택 포인터 등을 메모리에 저장하고, 새로운 스레드의 컨텍스트를 레지스터에 복원하는 과정
- 스레드 컨텍스트 스위칭의 경우 여기서 끝난다. 하지만 프로세스 컨텍스트 스위칭의 경우, 이전과 가상(virtual) 메모리 주소 체계가 다르기 때문에 가상 메모리 주소 관련 처리를 추가로 수행해야 하기 때문에 작업이 무겁다.
- MMU 변경: MMU는 가상 주소를 물리 주소로 변환하는 수행하는 장치로, MMU가 참조하고 있는 페이지 테이블은 더 이상 사용하면 안 된다. 따라서, 새로운 프로세스의 주소체계를 참조할 수 있도록 바꿔야 한다.
- TLB(Translation Lookaside Buffer) 플러시: TLB는 가상 메모리 - 물리 메모리 매핑 정보를 가지고 있는 캐시로, TLB에 저장되어 있던 페이지 정보도 이전 프로세스의 정보이므로 비워줘야 한다. (안 비워주면 “메모리 오염”이 발생할 수 있다.)
결론
- 스레드 컨텍스트 스위칭이 더 빠른 이유는 메모리 주소 관련 처리를 하지 않기 때문이다.
+) 컨텍스트 스위칭이 미치는 간접적인 영향?
- 캐시 무효화: 이전 스레드의 데이터가 캐시에 남아있어 새로운 스레드가 캐시 미스를 겪을 가능성 증가
컨텍스트 스위칭 과정
- 스레드를 커널 모드로 전환
- thread1의 CPU 상태(레지스터 값, 프로그램 카운터, 스택 포인터)를 저장한다.
- thread2의 CPU 상태를 복원(로딩)
- 프로세스 컨텍스트 스위칭이라면, TLB 초기화 및 MMU의 체계 변경을 추가로 진행한다.