计划优先级

线程计划根据其计划优先级 运行。 为每个线程分配一个计划优先级。 优先级级别的范围为从零 (最低优先级) 到 31 (优先级) 。 只有零页线程的优先级为零。 (零页线程是一个系统线程,负责在没有任何其他线程需要运行时将任何可用页归零)

系统将优先级相同的所有线程视为相等。 系统以循环方式将时间切片分配给优先级最高的所有线程。 如果这些线程都未准备好运行,系统会以轮循机制方式将时间切片分配给具有下一个最高优先级的所有线程。 如果高优先级线程可供运行,系统将停止执行优先级较低的线程 (而不允许它使用其时间切片) 完成,并将一个完整时间切片分配给优先级较高的线程。 有关详细信息,请参阅 上下文切换

每个线程的优先级由以下条件确定:

  • 其进程的优先级类
  • 线程在其进程的优先级类中的优先级级别

优先级类和优先级级别组合在一起构成 线程的基本 优先级。 有关线程的动态优先级的信息,请参阅 Priority Boosts

Priority 类

每个进程都属于以下优先级类之一:

IDLE _ PRIORITY _ 类
低于 _ 正常 _ 优先级 _ 类
NORMAL _ PRIORITY _ CLASS
高于 _ 正常 _ 优先级 _ 类
高 _ 优先级 _ 类
REALTIME _ PRIORITY _ 类

默认情况下,进程的优先级类为 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 _ NORMAL 创建的。 这意味着线程优先级与进程优先级类相同。 创建线程后,使用 SetThreadPriority 函数调整其相对于进程中其他线程的优先级。

典型的策略是,对进程的输入线程使用"高于正常"或"线程优先级最高"的 THREAD PRIORITY,以确保应用程序 _ _ _ _ _ 响应用户。 后台线程(尤其是处理器密集型线程)可以设置为"线程优先级低于正常"或"线程优先级最低",以确保在必要时可以 _ _ _ _ _ 抢占这些线程。 但是,如果有一个线程等待优先级较低的另一个线程来完成某些任务,请确保阻止等待的高优先级线程的执行。 为此,请使用等待函数 、criticalSleep函数 、SleepExSwitchToThread函数。 这比让线程执行循环更可取。 否则,进程可能会死锁,因为永远不会计划优先级较低的线程。

若要确定线程的当前优先级,请使用 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