컨텍스트 스위칭

기술노트

컨텍스트 스위칭 (Context Switching)

컨텍스트 스위칭(Context Switching, 문맥 교환)이란, 하나의 CPU가 여러 프로세스(또는 스레드)를 번갈아 가며 실행하기 위해, 현재 실행 중인 프로세스의 상태(Context)를 저장하고, 다음에 실행할 프로세스의 상태를 복원하는 과정을 말합니다. 이를 통해 멀티태스킹이 가능해집니다.

  • 컨텍스트(Context) : 특정 시점에 프로세스를 다시 실행하기 위해 필요한 모든 정보의 집합. (e.g., 프로그램 카운터, CPU 레지스터, 메모리 관리 정보 등). 이 정보는 각 프로세스의 프로세스 제어 블록(PCB)에 저장됩니다.

🔄 컨텍스트 스위칭이 일어나는 경우

  • 멀티태스킹 (Multitasking)

> * 하나의 CPU가 여러 프로세스를 번갈아 가며 실행하여, 동시에 여러 작업이 처리되는 것처럼 보이게 합니다. > * 한 프로세스에 할당된 시간(타임 슬라이스, Time Slice)이 만료되면, 운영체제 스케줄러는 다른 프로세스로 전환합니다.

  • 인터럽트 발생 (Interrupt Handling)

> * 입출력(I/O) 요청과 같이 대기 시간이 필요한 작업이 발생하면, CPU는 I/O 작업이 끝날 때까지 기다리지 않고 다른 프로세스를 실행합니다. I/O 작업이 완료되면 인터럽트가 발생하여 원래 프로세스로 돌아올 수 있습니다.

  • 시스템 콜 호출

> * 사용자 모드의 프로세스가 커널의 서비스를 이용하기 위해 시스템 콜을 호출하면, 사용자 모드 컨텍스트에서 커널 모드 컨텍스트로 전환이 일어납니다. (엄밀히는 프로세스 간 전환이 아닌 모드 전환이지만, 넓은 의미에서 컨텍스트 스위칭에 포함됩니다.)


⚙️ 컨텍스트 스위칭의 과정과 오버헤드

  • 과정 (Steps)

1. 현재 실행 중인 프로세스 P1에 인터럽트 또는 타임 슬라이스 만료 이벤트가 발생합니다. 2. P1의 현재 상태(Context)를 PCB(Process Control Block)에 저장합니다. 3. 다음에 실행할 프로세스 P2를 스케줄러가 선택합니다. 4. P2의 PCB에 저장된 상태를 CPU의 레지스터 등으로 복원(Restore)합니다. 5. P2의 실행을 재개합니다.

  • 오버헤드 (Overhead)

> * 컨텍스트 스위칭은 CPU가 아무런 유용한 작업을 하지 못하는 시간입니다. > * PCB 저장 및 복원, CPU 캐시 메모리 초기화, 메모리 맵핑(TLB) 초기화 등의 작업으로 인해 상당한 비용(시간)이 소요됩니다. > * 따라서, 잦은 컨텍스트 스위칭은 시스템 전체의 성능 저하를 유발합니다.


💡 개발자 핵심 Point

  • 프로세스 vs 스레드 컨텍스트 스위칭

> * 프로세스 : 독립적인 메모리 공간을 가지므로, 컨텍스트 스위칭 시 캐시 및 TLB 초기화 등 무거운 작업이 필요합니다. > * 스레드 : 같은 프로세스 내의 스레드들은 메모리 공간(Code, Data, Heap)을 공유합니다. 따라서 스택 포인터, 레지스터 등 최소한의 정보만 바꾸면 되므로 프로세스 컨텍스트 스위칭보다 훨씬 빠르고 오버헤드가 적습니다. 이것이 멀티태스킹 환경에서 멀티스레딩을 사용하는 주된 이유입니다.

  • 시스템의 성능을 분석할 때, 과도한 컨텍스트 스위칭이 발생하고 있는지 확인하는 것은 중요한 지표입니다. (Linux의 `vmstat`이나 `sar` 명령어 등으로 확인 가능)
  • 프로그램을 설계할 때, 불필요한 스레드 생성이나 잦은 I/O 호출이 과도한 컨텍스트 스위칭으로 이어져 성능을 저하시킬 수 있음을 인지해야 합니다.