Context Switching
문맥 교환의 과정과 발생 시점, 프로세스와 스레드의 전환 비용 차이, 준비 큐가 길어질 때의 문제와 해결 방안을 정리한다.
시리즈 · 운영체제7 / 18
- 운영체제의 유형
- System Call과 Dual Mode
- 인터럽트와 폴링
- 프로세스와 PCB, 프로세스의 상태 변화
- 프로세스 주소 공간과 Stack이 높은 주소부터 할당되는 이유
- 스레드: 사용자·커널 수준 스레드와 Thread Pool, Fork-Join
- Context Switching
- 프로세스 스케줄링: 단계와 알고리즘
- Thread Scheduling: 경합 범위 PCS와 SCS
- 경쟁 상태와 상호 배제: Thread Safe, 데커·피터슨 알고리즘
- 뮤텍스와 세마포, 모니터
- 교착 상태: 발생 조건과 해결 방법
- 메모리 계층 구조와 캐시 메모리
- 메모리 관리: 주소 바인딩과 연속 메모리 할당
- 가상 메모리: Paging과 Segmentation, TLB
- 요구 페이징과 페이지 교체 알고리즘, Thrashing
- File Descriptor와 File System, I-Node
- 동기/비동기와 블로킹/논블로킹, I/O Multiplexing
Context Switching
문맥 교환(Context Switching)은 프로세서의 레지스터에 있던 내용을 잃어버리지 않도록 저장해 두고, 다음에 실행할 프로세스의 내용을 적재하는 작업이다. 스케줄러가 A 프로세스의 실행을 중단하고 B 프로세스를 실행하려 할 때 다음 순서로 진행된다.
- A 프로세스의 실행 정보를 A의 PCB에 저장한다. Stack의 위치를 가리키는 SP(Stack Pointer) 와, 다음에 실행할 코드의 주소를 가진 PC(Program Counter) 가 대표적이다. 둘 다 CPU 안의 레지스터다.
- A 프로세스는 Ready 또는 Blocked 상태로 바뀐다.
- B 프로세스의 PCB에서 정보를 읽어 레지스터에 적재한다.
- 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은 동기/비동기와 블로킹/논블로킹에서 다룬다.