개요
프로그래머가 자신의 프로그램이 동작하는 운영체제의 스케줄링 방식을 알고있다면 버그, 성능 등에 대해 더욱 논리적인 판단이 가능할 것입니다.
특히 멀티스레드 프로그램을 만든다면 스레드 간 스케줄링 방식을 이해함으로서 스레드 간 경합, 기아현상 등에 대해서 이해가 쉬워집니다.
또한 싱글스레드 프로그램이더라도 Windows에서는 시스템 스레드, I/O 처리, 메시지 큐 등 운영체제에 의해 실행 흐름이 간접적으로 영향을 받기 때문에, 스레드 스케줄링에 대한 이해는 안정성과 응답성을 확보하는 데 중요합니다.
스케줄러
스케줄링은 wait상태에 있는 thread 중 다음에 실행될 thread를 고르는 것이고 이를 행하는 것이 스케줄러(short-term)입니다.
Windows의 스케줄링은 priority(우선순위) + RR(Round Robin) 방식입니다.
기본적으로 높은 우선순위의 thread를 먼저 실행하며 같은 우선순위에 여러 thread가 있는 경우에는 퀀텀을 소모해 번갈아가며 실행합니다.
https://learn.microsoft.com/ko-kr/windows/win32/procthread/scheduling-priorities
일정 우선 순위 - Win32 apps
스레드는 예약 우선 순위에 따라 실행되도록 예약됩니다.
learn.microsoft.com
thread의 우선순위는 process우선순위, thread우선순위의 조합으로 이루어지며 각 값에 대한 것은 위의 링크를 확인하시면 됩니다.
또한 Windows의 스케줄러는 Preemptive하기 때문에 현재 실행중인 스레드가 대기중인 스레드보다 우선순위가 낮다면 교체됩니다.
기아현상(Starvation)
위에서 언급했듯이 스케줄러는 priority를 기반으로 스케줄링하기 때문에 우선순위가 높은 스레드가 ready에 계속 존재한다면 우선순위가 낮은 스레드는 영원히 실행될 수 없습니다. 이러한 상황을 기아 (Starvation) 현상이라고 합니다.
이를 위해 Windows의 Balance Set Manager는 자체적으로 오랫동안 실행되지 못한 스레드의 우선순위를 일시적으로 상승시켜 낮은 priority의 스레드가 CPU를 할당받을 수 있도록 합니다.
레디 큐(Ready Queue)
아시다시피 스레드의 상태는 Ready, Running, Waiting(Blocked), (New, Terminated)이 존재합니다.
이 때 Ready 상태의 스레드들은 Ready Queue에서 대기하며 CPU의 자원을 할당받기를 대기하고 있습니다.
그런데 Ready Queue는 멀티코어 CPU에서 하나가 아니라 논리 프로세서마다 존재합니다.

제 PC의 CPU의 경우 12개의 Ready Queue가 존재한다고 볼 수 있습니다.
스케줄러는 이 레디큐 중 부하, 선호도 등을 고려하여 적절한 레디큐에 대기시킵니다.
또한 추가적으로 스케줄러는 만약에 어떤 레디큐는 비어있지만, 어떤 레디큐는 여러 스레드가 대기중이라면 해당 스레드를 가져와 비어있는 큐에 넣어줄 수 있습니다.
디스패처(Dispatcher)
우리가 일반적으로 알고있는 스케줄링은 실제로는 스케줄러의 기능과 디스패처의 기능으로 나뉘어집니다.
스케줄러의 역할은 CPU의 ready queue에서 어떤 thread를 다음에 실행시킬지 결정하며, 실제로 교체하는 작업은 디스패처가 실행합니다.
추가적으로 스케줄러와 디스패처가 별도로 OS에 인스턴스처럼 존재한다고 오해할 수 있지만,
스케줄러와 디스패처는 코드처럼 존재해 CPU가 이를 실행시키는 것입니다.
따라서 CPU마다 ready queue가 존재하고 여러 thread를 병렬적으로 switching할 수 있는 것입니다.
퀀텀과 타이머 인터럽트
현재 running중인 스레드가 스케줄러에 의해 교체되기 위해서는 주어진 퀀텀을 모두 소모하거나, 퀀텀을 모두 소모하지 않았더라도 입출력 등으로 인해 Block되거나 premmption이 발생해야합니다.
이처럼 스레드 교체는 반드시 퀀텀 소진에 의해서만 발생하는 것은 아니지만, 선점형 OS에서 퀀텀은 CPU 시간을 공정하게 분배하기 위한 가장 기본적인 시간 단위로 사용됩니다.
퀀텀의 경우 항상 정해진 시간마다 차감되는 것이 아닙니다.
커널모드로 전환 시 그 사이에 지나간 시간에 대비해 퀀텀을 감소시킵니다.
감소시킨 후 주어진 퀀텀을 모두 소모했다면 스케줄링을 하게 됩니다.
따라서 자주 커널모드로 전환한다면 퀀텀 감소가 자주일어나므로 비교적으로 자주 스케줄링이 일어날 수 있습니다.
타이머 인터럽트가 가장 자주 발생하기 때문에 이전 포스팅에서 언급했던 시간해상도를 조정하면 프로그램이 실행되는 CPU의 타이머 인터럽트가 더욱 자주 발생하고 스케줄링도 정밀하게 진행될 수 있습니다.
https://basaeng.tistory.com/28
컴퓨터의 시간측정
개요코드의 성능 측정을 위해 시작 끝 지점의 시간을 구해서 사용하거나, n초 후에 어떤 로직을 실행해야 하는 등 코드를 만들 때 시간을 측정해야 하는 경우가 있다. 이 때 시간을 어떻게 받아
basaeng.tistory.com
'CS > CA, OS' 카테고리의 다른 글
| 메모리관리, 페이징(Paging) (0) | 2025.06.21 |
|---|---|
| 컴퓨터의 CPU (3) - 캐시 메모리 (1) | 2025.05.10 |
| 컴퓨터의 시간측정 (0) | 2025.04.29 |
| 컴퓨터의 CPU (2) - 레지스터 (0) | 2025.04.19 |
| 컴퓨터의 프로세스 (0) | 2025.04.05 |