计划优先级
线程计划根据其 计划优先级运行。 为每个线程分配计划优先级。 优先级级别范围从零 (最低优先级) 到 31 (优先级最高的) 。 只有零页线程的优先级为零。 (当没有需要运行的其他线程时,零页线程是一个系统线程,负责为任何可用页面零 ) 。
系统将所有优先级相同且优先级相同的线程视为相等。 系统以轮循机制方式将时间切片分配给优先级最高的所有线程。 如果这些线程都未准备好运行,系统会以轮循机制方式将时间切片分配给具有下一个最高优先级的所有线程。 如果高优先级线程可供运行,则系统停止执行低优先级线程 (,而不允许它完成使用时间切片) ,并将全职切片分配给高优先级线程。 有关详细信息,请参阅 上下文切换。
每个线程的优先级取决于以下条件:
- 其进程的优先级类
- 其进程的优先级类中线程的优先级级别
优先级类和优先级级别组合在一起,构成线程 的基本优先级 。 有关线程的动态优先级的信息,请参阅 优先级提升。
Priority 类
每个进程都属于以下优先级类之一:
- 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,以确保在必要时可以抢占它们。 但是,如果有线程正在等待另一个优先级较低的线程来完成某些任务,请确保阻止执行等待的高优先级线程。 为此,请使用 等待函数、 关键部分或 睡眠 函数、 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 |