PCB와 컨텍스트 스위칭 (Context Switching)

한눈에 보기

커널이 프로세스를 관리하는 자료구조인 PCB와 실행 문맥을 저장하고 복원하는 컨텍스트 스위칭을 다룬다. PCB의 구성, 전환 절차, 캐시와 TLB 오염이라는 간접 비용, 비용을 줄이는 설계까지 정리한다.

최종 업데이트 2026.09.17

프로세스 제어 블록(PCB, Process Control Block)은 운영체제가 프로세스 하나를 관리하기 위해 커널 안에 두는 자료구조이고, 컨텍스트 스위칭(Context Switching)은 CPU를 한 프로세스에서 다른 프로세스로 넘길 때 실행 문맥을 PCB에 저장하고 다음 프로세스의 문맥을 복원하는 작업이다. PCB가 있기에 프로세스는 중단된 지점부터 정확히 재개될 수 있다. 다만 이 전환에는 저장과 복원이라는 직접 비용과 캐시 오염이라는 간접 비용이 따른다.

PCB에는 무엇이 들어 있나

PCB는 프로세스의 신분증이자 스냅샷이다. 리눅스에서는 task_struct라는 구조체가 이 역할을 한다. 담기는 정보는 대략 다음과 같이 묶을 수 있다.

  • 식별 정보: 프로세스 ID(PID), 부모 프로세스 ID, 사용자와 그룹 ID
  • 실행 문맥: 프로그램 카운터(program counter), 범용 레지스터, 스택 포인터, 상태 레지스터 값
  • 스케줄링 정보: 프로세스 상태(준비, 실행, 대기 등), 우선순위, 사용한 CPU 시간, 스케줄링 큐 연결 정보
  • 메모리 관리 정보: 페이지 테이블 위치, 주소 공간 구조에 대한 참조
  • 입출력과 자원 정보: 열린 파일 디스크립터 테이블, 작업 디렉터리, 시그널 처리 정보

레지스터 값들은 실행 중에는 CPU에 있고 PCB의 값은 낡은 상태다. 프로세스가 CPU에서 내려올 때만 최신 값이 PCB에 기록된다. 즉 PCB의 문맥 영역은 프로세스가 실행 중이 아닐 때의 보관소다. 커널은 이 PCB들을 준비 큐와 대기 큐 같은 연결 리스트로 엮어 관리하며, 스레드 단위 스케줄링을 하는 시스템에서는 스레드마다 문맥을 담는 스레드 제어 블록(TCB, Thread Control Block)을 두고 주소 공간 같은 공유 정보는 프로세스 수준 구조가 갖는다.

컨텍스트 스위칭 절차

타이머 인터럽트로 시간 할당량이 끝났거나, 실행 중인 프로세스가 입출력으로 잠들거나, 더 높은 우선순위의 프로세스가 깨어나면 커널은 다음 절차로 CPU를 전환한다.

  1. 인터럽트나 시스템 콜로 커널 모드에 진입한다.
  2. 현재 프로세스의 레지스터, 프로그램 카운터 등 하드웨어 문맥을 PCB에 저장한다.
  3. 스케줄러가 다음에 실행할 프로세스를 고른다.
  4. 주소 공간이 다른 프로세스라면 페이지 테이블 기준 레지스터(x86의 CR3)를 새 프로세스의 것으로 바꾼다.
  5. 새 프로세스의 PCB에서 문맥을 레지스터로 복원하고 사용자 모드로 복귀한다.

이 시간 동안 CPU는 어떤 응용 코드도 실행하지 못하므로 컨텍스트 스위칭은 순수한 오버헤드(overhead)다.

비용의 실체: 직접 비용과 간접 비용

직접 비용은 위 절차 자체의 시간으로, 레지스터 저장과 복원, 스케줄러 실행, 모드 전환이 해당하며 현대 하드웨어에서 대체로 마이크로초 단위다. 그런데 실제 성능에 더 크게 작용하는 것은 간접 비용이다. 전환 직후 새 프로세스가 접근하는 데이터는 CPU 캐시에 없으므로 캐시 미스(cache miss)가 쏟아지고, 주소 공간이 바뀌었으므로 TLB(Translation Lookaside Buffer)의 변환 항목도 무효가 되어 다시 채워야 한다. 분기 예측기의 학습 내용도 어긋난다. 즉 전환이 끝난 뒤에도 한동안 CPU는 평소보다 느리게 돈다. 이 워밍업 비용은 워크로드에 따라 직접 비용의 몇 배에 달할 수 있으며, 컨텍스트 스위칭이 잦은 시스템에서 처리량이 떨어지는 주된 이유다. ASID(주소 공간 식별자)나 PCID 같은 하드웨어 기능은 전환 시 TLB 전체 무효화를 피하게 해 이 비용을 줄여 준다.

무엇을 전환하느냐에 따른 비용 차이

전환 종류주소 공간 교체상대 비용비고
프로세스 간 전환필요가장 크다TLB와 캐시 오염이 최대
같은 프로세스의 스레드 간 전환불필요중간레지스터와 스택만 바꾸면 되고 TLB는 유지된다
사용자 수준 스레드나 코루틴 전환불필요가장 작다커널 진입 없이 라이브러리가 레지스터 일부만 교체
모드 전환(시스템 콜)없음전환이라기보다 진입같은 프로세스 문맥에서 권한만 바뀌므로 컨텍스트 스위칭이 아니다

같은 프로세스의 스레드 사이 전환이 싼 이유는 페이지 테이블 교체와 TLB 무효화가 없기 때문이다. 시스템 콜에 따른 모드 전환을 컨텍스트 스위칭과 혼동하지 않는 것도 중요하다.

전환 비용을 줄이는 설계

비용을 줄이는 접근은 두 갈래다. 하나는 전환 횟수 자체를 줄이는 것이다. 타임 퀀텀을 적절히 키우고, 멀티코어에서 태스크를 특정 코어에 고정(CPU affinity)해 캐시를 데운 상태를 유지하고, 이벤트 루프(event loop)나 코루틴 기반 비동기 모델로 스레드 수를 줄이는 방식이 여기 속한다. 다른 하나는 전환 한 번의 비용을 줄이는 것으로, PCID 활용, 거대 페이지로 TLB 항목 수 줄이기 같은 방법이 있다. 고성능 서버에서 스레드를 코어 수 근처로 제한하고 나머지 동시성을 비동기로 처리하는 이유가 바로 이 컨텍스트 스위칭 비용에 있다.

면접에서 이렇게 물어본다

  • PCB에 저장되는 정보들을 범주별로 설명해 보라.
  • 컨텍스트 스위칭이 일어나는 시점과 그 절차를 순서대로 말해 보라.
  • 컨텍스트 스위칭의 직접 비용과 간접 비용을 구분하고 어느 쪽이 왜 더 큰지 설명해 보라.
  • 프로세스 간 전환이 같은 프로세스의 스레드 간 전환보다 비싼 이유는 무엇인가.
  • 컨텍스트 스위칭 오버헤드를 줄이기 위한 시스템 설계 기법을 제시해 보라.
운영체제 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기