• os
  • process
  • thread

Context Switching

문맥 교환의 과정과 발생 시점, 프로세스와 스레드의 전환 비용 차이, 준비 큐가 길어질 때의 문제와 해결 방안을 정리한다.

시리즈 · 운영체제7 / 18
  1. 운영체제의 유형
  2. System Call과 Dual Mode
  3. 인터럽트와 폴링
  4. 프로세스와 PCB, 프로세스의 상태 변화
  5. 프로세스 주소 공간과 Stack이 높은 주소부터 할당되는 이유
  6. 스레드: 사용자·커널 수준 스레드와 Thread Pool, Fork-Join
  7. Context Switching
  8. 프로세스 스케줄링: 단계와 알고리즘
  9. Thread Scheduling: 경합 범위 PCS와 SCS
  10. 경쟁 상태와 상호 배제: Thread Safe, 데커·피터슨 알고리즘
  11. 뮤텍스와 세마포, 모니터
  12. 교착 상태: 발생 조건과 해결 방법
  13. 메모리 계층 구조와 캐시 메모리
  14. 메모리 관리: 주소 바인딩과 연속 메모리 할당
  15. 가상 메모리: Paging과 Segmentation, TLB
  16. 요구 페이징과 페이지 교체 알고리즘, Thrashing
  17. File Descriptor와 File System, I-Node
  18. 동기/비동기와 블로킹/논블로킹, I/O Multiplexing

Context Switching

문맥 교환(Context Switching)은 프로세서의 레지스터에 있던 내용을 잃어버리지 않도록 저장해 두고, 다음에 실행할 프로세스의 내용을 적재하는 작업이다. 스케줄러가 A 프로세스의 실행을 중단하고 B 프로세스를 실행하려 할 때 다음 순서로 진행된다.

  1. A 프로세스의 실행 정보를 A의 PCB에 저장한다. Stack의 위치를 가리키는 SP(Stack Pointer) 와, 다음에 실행할 코드의 주소를 가진 PC(Program Counter) 가 대표적이다. 둘 다 CPU 안의 레지스터다.
  2. A 프로세스는 Ready 또는 Blocked 상태로 바뀐다.
  3. B 프로세스의 PCB에서 정보를 읽어 레지스터에 적재한다.
  4. B 프로세스의 상태가 Ready에서 Running으로 바뀌고 실행된다.

이 과정에는 시간 비용(오버헤드)이 들기 때문에, 운영체제 설계에서는 불필요한 문맥 교환을 줄이는 것이 중요하다.

발생하는 시점

  • I/O 요청: I/O 작업을 위해 디스크 등에 접근해야 하는 경우
  • CPU 사용 시간 만료: 할당된 시간을 다 쓴 경우
  • 자식 프로세스 생성(fork)
  • 인터럽트 처리를 기다리는 경우

프로세스와 스레드의 차이

  • 프로세스: Code, Data, Heap, Stack 영역이 프로세스마다 독립적으로 만들어진다. 프로세스끼리 데이터를 주고받으려면 IPC(Inter Process Communication)가 필요하다.
  • 스레드: Stack 영역만 따로 만들고, 나머지 영역(Code, Data, Heap)은 자신이 속한 프로세스의 것을 공유한다.

스레드는 공유하는 영역이 많아 바꿔야 할 정보가 적으므로 Context Switching이 더 빠르다.

Ready Queue에 프로세스가 많을 경우

  • CPU가 다 처리하지 못해 큐가 계속 길어진다.
  • 큐에 있는 프로세스를 돌아가며 실행해야 하므로 스케줄러가 프로세스를 계속 교대시킨다.
  • Context Switching이 과도하게 발생해 성능이 떨어진다.

해결 방안은 Ready Queue에 프로세스가 쓸데없이 쌓이지 않게 하는 것이다.

  • CPU 코어 수를 늘린다.
  • 비동기 I/O를 사용한다.
  • 이벤트 기반 모델로 변경한다.

비동기 I/O와, 이벤트 기반 모델의 바탕이 되는 I/O Multiplexing은 동기/비동기와 블로킹/논블로킹에서 다룬다.