Scheduling Priorities

Threads are scheduled to run based on their scheduling priority. Each thread is assigned a scheduling priority. The priority levels range from zero (lowest priority) to 31 (highest priority). Only the zero-page thread can have a priority of zero. (The zero-page thread is a system thread responsible for zeroing any free pages when there are no other threads that need to run.)

The system treats all threads with the same priority as equal. The system assigns time slices in a round-robin fashion to all threads with the highest priority. If none of these threads are ready to run, the system assigns time slices in a round-robin fashion to all threads with the next highest priority. If a higher-priority thread becomes available to run, the system ceases to execute the lower-priority thread (without allowing it to finish using its time slice), and assigns a full time slice to the higher-priority thread. For more information, see Context Switches.

The priority of each thread is determined by the following criteria:

  • The priority class of its process
  • The priority level of the thread within the priority class of its process

The priority class and priority level are combined to form the base priority of a thread. For information on the dynamic priority of a thread, see Priority Boosts.

Priority Class

Each process belongs to one of the following priority classes:

IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS

By default, the priority class of a process is NORMAL_PRIORITY_CLASS. Use the CreateProcess function to specify the priority class of a child process when you create it. If the calling process is IDLE_PRIORITY_CLASS or BELOW_NORMAL_PRIORITY_CLASS, the new process will inherit this class. Use the GetPriorityClass function to determine the current priority class of a process and the SetPriorityClass function to change the priority class of a process.

Processes that monitor the system, such as screen savers or applications that periodically update a display, should use IDLE_PRIORITY_CLASS. This prevents the threads of this process, which do not have high priority, from interfering with higher priority threads.

Use HIGH_PRIORITY_CLASS with care. If a thread runs at the highest priority level for extended periods, other threads in the system will not get processor time. If several threads are set at high priority at the same time, the threads lose their effectiveness. The high-priority class should be reserved for threads that must respond to time-critical events. If your application performs one task that requires the high-priority class while the rest of its tasks are normal priority, use SetPriorityClass to raise the priority class of the application temporarily; then reduce it after the time-critical task has been completed. Another strategy is to create a high-priority process that has all of its threads blocked most of the time, awakening threads only when critical tasks are needed. The important point is that a high-priority thread should execute for a brief time, and only when it has time-critical work to perform.

You should almost never use REALTIME_PRIORITY_CLASS, because this interrupts system threads that manage mouse input, keyboard input, and background disk flushing. This class can be appropriate for applications that "talk" directly to hardware or that perform brief tasks that should have limited interruptions.

Priority Level

The following are priority levels within each 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

All threads are created using THREAD_PRIORITY_NORMAL. This means that the thread priority is the same as the process priority class. After you create a thread, use the SetThreadPriority function to adjust its priority relative to other threads in the process.

A typical strategy is to use THREAD_PRIORITY_ABOVE_NORMAL or THREAD_PRIORITY_HIGHEST for the process's input thread, to ensure that the application is responsive to the user. Background threads, particularly those that are processor intensive, can be set to THREAD_PRIORITY_BELOW_NORMAL or THREAD_PRIORITY_LOWEST, to ensure that they can be preempted when necessary. However, if you have a thread waiting for another thread with a lower priority to complete some task, be sure to block the execution of the waiting high-priority thread. To do this, use a wait function, critical section, or the Sleep function, SleepEx, or SwitchToThread function. This is preferable to having the thread execute a loop. Otherwise, the process may become deadlocked, because the thread with lower priority is never scheduled.

To determine the current priority level of a thread, use the GetThreadPriority function.

Base Priority

The process priority class and thread priority level are combined to form the base priority of each thread.

The following table shows the base priority for combinations of process priority class and thread priority value.

Process priority classThread priority levelBase priority
IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE1
THREAD_PRIORITY_LOWEST2
THREAD_PRIORITY_BELOW_NORMAL3
THREAD_PRIORITY_NORMAL4
THREAD_PRIORITY_ABOVE_NORMAL5
THREAD_PRIORITY_HIGHEST6
THREAD_PRIORITY_TIME_CRITICAL15
BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE1
THREAD_PRIORITY_LOWEST4
THREAD_PRIORITY_BELOW_NORMAL5
THREAD_PRIORITY_NORMAL6
THREAD_PRIORITY_ABOVE_NORMAL7
THREAD_PRIORITY_HIGHEST8
THREAD_PRIORITY_TIME_CRITICAL15
NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE1
THREAD_PRIORITY_LOWEST6
THREAD_PRIORITY_BELOW_NORMAL7
THREAD_PRIORITY_NORMAL8
THREAD_PRIORITY_ABOVE_NORMAL9
THREAD_PRIORITY_HIGHEST10
THREAD_PRIORITY_TIME_CRITICAL15
ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE1
THREAD_PRIORITY_LOWEST8
THREAD_PRIORITY_BELOW_NORMAL9
THREAD_PRIORITY_NORMAL10
THREAD_PRIORITY_ABOVE_NORMAL11
THREAD_PRIORITY_HIGHEST12
THREAD_PRIORITY_TIME_CRITICAL15
HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE1
THREAD_PRIORITY_LOWEST11
THREAD_PRIORITY_BELOW_NORMAL12
THREAD_PRIORITY_NORMAL13
THREAD_PRIORITY_ABOVE_NORMAL14
THREAD_PRIORITY_HIGHEST15
THREAD_PRIORITY_TIME_CRITICAL15
REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE16
THREAD_PRIORITY_LOWEST22
THREAD_PRIORITY_BELOW_NORMAL23
THREAD_PRIORITY_NORMAL24
THREAD_PRIORITY_ABOVE_NORMAL25
THREAD_PRIORITY_HIGHEST26
THREAD_PRIORITY_TIME_CRITICAL31

 

 

 

Community Additions

ADD
Show:
© 2014 Microsoft. All rights reserved.