Win32中优先权的概念,用来决定下一个获得CPU时间的线程是谁,较高优先权的线程必然获得较多的CPU时间。关于优先权的完整讨论其实相当复杂,你可以无分轩轾地给予每一个线程相同的优先权,这可能会使你承担不少麻烦,你也可以明智地使用优先权,使自己能够调整程序的执行次序。例如你可以设定你的GUI线程有较高优先权,使它对于用户的反应能够比较平顺一些,或者你可以改变worker线程的优先权,使它们只在系统的闲置时间(idle time ) 里工作。
Win32优先权是以数值表现的,并以进程的“优先权类别(priority class)”,线程的“优先权层次(priority class)”,线程的“优先权等级(priority level)”和操作系统当时采用
的“动态提升(Dynamic Boost)” 作为计算基准。所有因素放在一起,最后获得一个0-31的数值。拥有最高优先权之线程,即为下一个将执行起来的线程,如果你有一大把worker线程,其“优先权类别”和“优先权层级”都相同,那么就每一个轮流执行。如果你有一个线程总是拥有最高优先权,那么它就永远获得COU时间,别人就都别玩了,这就是为什么必须明智而谨慎地使用优先权的原因。
优先权类别( Priority Class)
“优先权类别”是进程的属性之一。这个属性可以表现出这一进程和其他进程比较之下的重要性。Win32提供四种优先权类别,每一个类别对应一个基本的优先权层级。
如下表格展示了四个优先权类别。
优先权类别(Priority Class) | 基础优先权值(base priority) |
HIGH_PRIORITY_CLASS | 13 |
IDLE_PRIORITY_CLASS | 4 |
NORMAL_PRIORITY_CLASS | 7 or 8(有些资料上写7 or 9) |
REALTIME_PRIORITY_CLASS | 24 |
大部分程序使用NORMAL_PRIORITY_CLASS。少数情况下才会考虑使用其他类别。例如,Task Manager就是使用HIGH_PRIORITY_CLASS,所以即使其他程序处于非常忙碌的状态下,它也总是能够有所反应。
如果程序使用IDLE_PRIORITY_CLASS,它就只会在CPU绝对空闲的时候才执行。
最后一个类别是REALTIME_PRIORITY_CLASS。这个类别用以协助解决一些和时间有密切关系的工作。举个例子,如果有个程序必须反应一个设备驱动程序的行为,而该驱动程序用来实时监控(real-time monitoring)真实世界中的一台仪器,那么将该进程设为这个优先权类别,就可以使它甚至优于核心进程和设备驱动程序,这个优先权类别不应该用于标准GUI程序或甚至于典型的服务器程序。
优先权类别适用于进程而非线程。你可以利用SetPriorityClass()和GetPriorityClass()来调整和验证其值。