이번 포스팅에서는 스케줄링이 어떻게 이루어지는지, 그리고 이를 통해 CPU 자원을 어떻게 효율적으로 활용하는지에 대해 알아보겠습니다.
1. CPU 스케줄링이 발생하는 4가지 상황
CPU 스케줄링은 다양한 상황에서 실행됩니다.
아래는 대표적인 네 가지 상황입니다.
- 스레드가 시스템 호출 끝에 I/O를 요청하여 블록 될 때
- 스레드가 I/O 작업을 요청하면, 운영체제는 해당 스레드를 블록 상태로 전환하고, 새로운 스레드를 스케줄링합니다. 이 과정은 CPU의 활용률을 높이기 위한 것입니다.
- 스레드가 자발적으로 CPU를 반환할 때
- 스레드가 yield()와 같은 시스템 호출을 통해 자발적으로 CPU를 반환하면, 운영체제는 현재 스레드를 준비 리스트에 넣고, 다른 스레드를 선택해 CPU를 할당합니다.
- 스레드의 타임 슬라이스가 소진되어 타이머 인터럽트가 발생할 때
- 운영체제는 모든 스레드에게 공평하게 CPU를 할당하기 위해 타임 슬라이스(time slice)를 사용합니다. 타임 슬라이스가 끝나면 현재 스레드는 강제로 중단되고, 다른 스레드가 선택됩니다.
- 더 높은 우선순위의 스레드가 요청한 I/O 작업이 완료되었을 때
- 특정 스레드의 I/O 작업이 완료되면, 운영체제는 현재 실행 중인 스레드를 중단시키고, 우선순위가 높은 스레드를 실행합니다.
2. CPU 스케줄링과 디스패치(Dispatch)
CPU 스케줄링은 운영체제의 커널 코드 내에서 이루어지며, 별도의 스레드나 프로세스로 실행되지 않습니다.
스케줄링 코드는 시스템 호출이나 인터럽트 서비스 루틴이 끝나는 마지막 단계에서 실행됩니다.
- 디스패쳐(Dispatcher): 디스패쳐는 스케줄러에 의해 선택된 스레드를 실제로 실행하는 작업을 수행하는 코드입니다. 이 과정에서 컨텍스트 스위칭이 이루어지고, CPU가 새로 선택된 스레드를 실행하게 됩니다. 디스패쳐는 커널 모드에서 사용자 모드로 전환하며, 새 스레드가 이전에 중단된 위치에서 실행을 재개하도록 합니다.
스케줄러와 디스패쳐는 모두 실행 시간이 짧도록 최적화되어 있어야 하며, 시스템의 효율성을 극대화하는 데 중요한 역할을 합니다.
3. 선점 스케줄링과 비선점 스케줄링
스레드의 강제 중단 여부에 따라 CPU 스케줄링은 선점 스케줄링과 비선점 스케줄링으로 나뉩니다.
- 비선점 스케줄링 (Non-preemptive Scheduling):
- 현재 실행 중인 스레드를 강제로 중단시키지 않는 방식입니다. 스레드가 CPU를 할당받으면, 완료되거나 I/O 요청 등으로 인해 더 이상 CPU를 사용할 수 없을 때까지 스레드가 계속 실행됩니다.
- 비선점 스케줄링은 스레드가 자발적으로 CPU를 양보하거나, 종료되거나, 블록 상태로 전환될 때 스케줄링이 이루어집니다.
- 선점 스케줄링 (Preemptive Scheduling):
- 현재 실행 중인 스레드를 강제로 중단시키고 다른 스레드에 CPU를 할당하는 방식입니다.
- 선점 스케줄링은 타임 슬라이스가 끝나거나, 더 높은 우선순위의 스레드가 준비 상태로 전환될 때 실행됩니다.
현대의 대부분의 범용 운영체제는 선점 스케줄링을 사용하여 공평한 CPU 분배와 시스템 응답성을 보장합니다.
4. 기아(Starvation)와 에이징(Aging)
스케줄링 과정에서 일부 스레드가 오랜 시간 동안 CPU를 할당받지 못하는 기아(starvation) 현상이 발생할 수 있습니다.
이러한 문제를 방지하기 위해 에이징(aging) 기법이 사용됩니다.
- 기아 (Starvation):
- 스레드가 스케줄링에서 오랫동안 선택되지 못하고, 준비 리스트에 머무르는 상황을 말합니다. 주로 우선순위 기반의 스케줄링 시스템에서 발생하며, 높은 우선순위의 스레드가 계속 들어오는 경우 낮은 우선순위의 스레드가 기아 상태에 빠질 수 있습니다.
- 에이징 (Aging):
- 기아 문제를 해결하기 위한 방법으로, 스레드가 준비 리스트에 머무르는 시간이 길어질수록 그 스레드의 우선순위를 점차 높이는 기법입니다. 이를 통해 시간이 지남에 따라 모든 스레드가 CPU를 할당받을 수 있도록 보장합니다.
결론
CPU 스케줄링은 운영체제의 성능과 사용자 경험을 좌우하는 중요한 요소입니다.
다양한 상황에서 스케줄링이 어떻게 이루어지는지 이해함으로써, CPU 자원을 효율적으로 활용하고, 공정하게 분배할 수 있습니다. 또한, 기아 문제와 같은 스케줄링의 잠재적 문제를 해결하기 위한 에이징 기법도 매우 중요한 역할을 합니다.
'운영체제' 카테고리의 다른 글
CPU Burst와 I/O Burst: 운영체제 스케줄링의 핵심 개념 (0) | 2024.08.23 |
---|---|
멀티 스레드 구현: N:1, 1:1, N:M 방식의 이해 (0) | 2024.08.21 |
커널 레벨 스레드와 사용자 레벨 스레드의 차이점 이해하기 (0) | 2024.08.20 |
스레드 주소 공간과 컨텍스트 (0) | 2024.08.19 |
프로세스와 스레드: 실행 단위의 진화 (0) | 2024.08.18 |