예약 우선 순위

스레드는 일정 우선 순위에 따라 실행되도록 예약됩니다. 각 스레드에는 예약 우선 순위가 할당됩니다. 우선 순위 수준은 0(가장 낮은 우선 순위)에서 31(가장 높은 우선 순위)에 이르기까지 다양합니다. 0페이지 스레드만 우선 순위가 0일 수 있습니다. (0페이지 스레드는 실행해야 하는 다른 스레드가 없는 경우 무료 페이지를 0으로 만드는 시스템 스레드입니다.)

시스템은 동일한 우선 순위의 모든 스레드를 동일하게 처리합니다. 시스템은 우선 순위가 가장 높은 모든 스레드에 라운드 로빈 방식으로 시간 조각을 할당합니다. 이러한 스레드 중 어느 것도 실행할 준비가 되어 있지 않은 경우 시스템은 다음으로 우선 순위가 높은 모든 스레드에 라운드 로빈 방식으로 시간 조각을 할당합니다. 우선 순위가 높은 스레드를 실행할 수 있게 되면 시스템은 우선 순위가 낮은 스레드를 더 이상 실행하지 않고(시간 조각을 사용하여 완료할 수 없음) 우선 순위가 높은 스레드에 풀 타임 조각을 할당합니다. 자세한 내용은 컨텍스트 전환을 참조하세요.

각 스레드의 우선 순위는 다음 기준에 따라 결정됩니다.

  • 프로세스의 우선 순위 클래스
  • 프로세스의 우선 순위 클래스 내 스레드의 우선 순위 수준

우선 순위 클래스와 우선 순위 수준이 결합되어 스레드의 기본 우선 순위를 형성합니다. 스레드의 동적 우선 순위에 대한 자세한 내용은 우선 순위 향상을 참조하세요.

우선 순위 클래스

각 프로세스는 다음 우선 순위 클래스 중 하나에 속합니다.

IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS

기본적으로 프로세스의 우선 순위 클래스는 NORMAL_PRIORITY_CLASS. CreateProcess 함수를 사용하여 자식 프로세스를 만들 때 자식 프로세스의 우선 순위 클래스를 지정합니다. 호출 프로세스가 IDLE_PRIORITY_CLASS 또는 BELOW_NORMAL_PRIORITY_CLASS 경우 새 프로세스는 이 클래스를 상속합니다. GetPriorityClass 함수를 사용하여 프로세스의 현재 우선 순위 클래스를 확인하고 SetPriorityClass 함수를 사용하여 프로세스의 우선 순위 클래스를 변경합니다.

화면 보호기 또는 디스플레이를 주기적으로 업데이트하는 애플리케이션과 같이 시스템을 모니터링하는 프로세스는 IDLE_PRIORITY_CLASS 사용해야 합니다. 이렇게 하면 우선 순위가 높지 않은 이 프로세스의 스레드가 우선 순위가 높은 스레드를 방해하지 않습니다.

주의하여 HIGH_PRIORITY_CLASS 사용합니다. 스레드가 장시간 가장 높은 우선 순위 수준에서 실행되는 경우 시스템의 다른 스레드는 프로세서 시간을 얻지 않습니다. 여러 스레드가 동시에 높은 우선 순위로 설정되면 스레드의 효율성이 손실됩니다. 우선 순위가 높은 클래스는 시간이 중요한 이벤트에 응답해야 하는 스레드에 대해 예약되어야 합니다. 애플리케이션이 우선 순위가 높은 클래스가 필요한 작업을 수행하는 경우 나머지 작업이 정상 우선 순위인 경우 SetPriorityClass 를 사용하여 애플리케이션의 우선 순위 클래스를 일시적으로 높입니다. 그런 다음, 시간이 중요한 작업이 완료된 후 이를 줄입니다. 또 다른 전략은 모든 스레드가 대부분의 시간을 차단하여 중요한 작업이 필요할 때만 스레드를 깨우는 우선 순위가 높은 프로세스를 만드는 것입니다. 중요한 점은 우선 순위가 높은 스레드가 짧은 시간 동안 실행되어야 하며, 수행해야 하는 시간이 중요한 경우에만 실행되어야 한다는 것입니다.

마우스 입력, 키보드 입력 및 백그라운드 디스크 플러시를 관리하는 시스템 스레드를 중단하므로 REALTIME_PRIORITY_CLASS 거의 사용하지 않아야 합니다. 이 클래스는 하드웨어에 직접 "통신"하거나 중단이 제한되어야 하는 간단한 작업을 수행하는 애플리케이션에 적합할 수 있습니다.

우선 순위 수준

다음은 각 우선 순위 클래스 내의 우선 순위 수준입니다.

THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL

모든 스레드는 THREAD_PRIORITY_NORMAL 사용하여 만들어집니다. 즉, 스레드 우선 순위는 프로세스 우선 순위 클래스와 동일합니다. 스레드를 만든 후 SetThreadPriority 함수를 사용하여 프로세스의 다른 스레드를 기준으로 우선 순위를 조정합니다.

일반적인 전략은 프로세스의 입력 스레드에 THREAD_PRIORITY_ABOVE_NORMAL 또는 THREAD_PRIORITY_HIGHEST 사용하여 애플리케이션이 사용자에게 응답하는지 확인하는 것입니다. 백그라운드 스레드, 특히 프로세서 집약적인 스레드는 필요할 때 선점할 수 있도록 THREAD_PRIORITY_BELOW_NORMAL 또는 THREAD_PRIORITY_LOWEST 설정할 수 있습니다. 그러나 우선 순위가 낮은 다른 스레드가 일부 작업을 완료하기를 기다리는 스레드가 있는 경우 대기 중인 우선 순위가 높은 스레드의 실행을 차단해야 합니다. 이렇게 하려면 대기 함수, 중요 섹션 또는 Sleep 함수, SleepEx 또는 SwitchToThread 함수를 사용합니다. 스레드가 루프를 실행하도록 하는 것이 좋습니다. 그렇지 않으면 우선 순위가 낮은 스레드가 예약되지 않으므로 프로세스가 교착 상태가 될 수 있습니다.

스레드의 현재 우선 순위 수준을 확인하려면 GetThreadPriority 함수를 사용합니다.

기본 우선 순위

프로세스 우선 순위 클래스와 스레드 우선 순위 수준이 결합되어 각 스레드의 기본 우선 순위를 형성합니다.

다음 표에서는 프로세스 우선 순위 클래스와 스레드 우선 순위 값의 조합에 대한 기본 우선 순위를 보여 줍니다.

프로세스 우선 순위 클래스 스레드 우선 순위 수준 기본 우선 순위
IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 2
THREAD_PRIORITY_BELOW_NORMAL 3
THREAD_PRIORITY_NORMAL 4
THREAD_PRIORITY_ABOVE_NORMAL 5
THREAD_PRIORITY_HIGHEST 6
THREAD_PRIORITY_TIME_CRITICAL 15
BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 4
THREAD_PRIORITY_BELOW_NORMAL 5
THREAD_PRIORITY_NORMAL 6
THREAD_PRIORITY_ABOVE_NORMAL 7
THREAD_PRIORITY_HIGHEST 8
THREAD_PRIORITY_TIME_CRITICAL 15
NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 6
THREAD_PRIORITY_BELOW_NORMAL 7
THREAD_PRIORITY_NORMAL 8
THREAD_PRIORITY_ABOVE_NORMAL 9
THREAD_PRIORITY_HIGHEST 10
THREAD_PRIORITY_TIME_CRITICAL 15
ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 8
THREAD_PRIORITY_BELOW_NORMAL 9
THREAD_PRIORITY_NORMAL 10
THREAD_PRIORITY_ABOVE_NORMAL 11
THREAD_PRIORITY_HIGHEST 12
THREAD_PRIORITY_TIME_CRITICAL 15
HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 11
THREAD_PRIORITY_BELOW_NORMAL 12
THREAD_PRIORITY_NORMAL 13
THREAD_PRIORITY_ABOVE_NORMAL 14
THREAD_PRIORITY_HIGHEST 15
THREAD_PRIORITY_TIME_CRITICAL 15
REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE 16
THREAD_PRIORITY_LOWEST 22
THREAD_PRIORITY_BELOW_NORMAL 23
THREAD_PRIORITY_NORMAL 24
THREAD_PRIORITY_ABOVE_NORMAL 25
THREAD_PRIORITY_HIGHEST 26
THREAD_PRIORITY_TIME_CRITICAL 31