나만의 작은 도서관

[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에 저장되어 있던 페이지 정보도 이전 프로세스의 정보이므로 비워줘야 한다. (안 비워주면 “메모리 오염”이 발생할 수 있다.)

결론

  • 스레드 컨텍스트 스위칭이 더 빠른 이유는 메모리 주소 관련 처리를 하지 않기 때문이다.

+) 컨텍스트 스위칭이 미치는 간접적인 영향?

  • 캐시 무효화: 이전 스레드의 데이터가 캐시에 남아있어 새로운 스레드가 캐시 미스를 겪을 가능성 증가

컨텍스트 스위칭 과정

  1. 스레드를 커널 모드로 전환
  2. thread1의 CPU 상태(레지스터 값, 프로그램 카운터, 스택 포인터)를 저장한다.
  3. thread2의 CPU 상태를 복원(로딩)
  4. 프로세스 컨텍스트 스위칭이라면, TLB 초기화 및 MMU의 체계 변경을 추가로 진행한다.