0 优先级保留供零页线程使用,
系统不允许任何其他线程拥有0 优先级。另外,下列优先级等级是无法使用的:1 7 、1 8 、1 9 、
2 0 、2 1 、2 7 、2 8 、2 9 和3 0 。如果编写一个以内核方式运行的设备驱动程序,可以获得这些优先
级等级,而用户方式的应用程序则不能。另外还要注意,实时优先级类中的线程不能低于优先
级等级1 6 。同样,非实时优先级类中的线程的等级不能高于1 5 。
注意有些人常常搞不清进程优先级类的概念。他们认为这可能意味着进程是可以调
度的。但是进程是根本不能调度的,只有线程才能被调度。进程优先级类是个抽象概
念,M i c r o s o f t 提出这个概念的目的,是为了帮助你将它与调度程序的内部运行情况区
分开来。它没有其他目的。
注意一般来说,大多数时候高优先级的线程不应该处于可调度状态。当线程要进行
某种操作时,它能迅速获得C P U 时间。这时线程应该尽可能少地执行C P U 指令,并返
回睡眠状态,等待再次变成可调度状态。相反,低优先级的线程可以保持可调度状态,
执行大量的C P U 指令来进行它的操作。如果按照这些原则来办,整个操作系统就能正
确地对用户作出响应。
每个线程都会被赋予一个从0 (最低)到3 1 (最高)的优先级号码。当系统确定将哪个线
程分配给C P U 时,它首先观察优先级为3 1 的线程,并以循环方式对它们进行调度。如果优先级
为3 1 的线程可以调度,那么就将该线程赋予一个C P U 。在该线程的时间片结束时,系统要查看
是否还有另一个优先级为3 1 的线程可以运行,如果有,它将允许该线程被赋予一个C P U 。
只要优先级为3 1 的线程是可调度的,系统就绝对不会将优先级为0 到3 0 的线程分配给C P U 。
这种情况称为渴求调度(s t a r v a t i o n )。当高优先级线程使用大量的C P U 时间,从而使得低优先
级线程无法运行时,便会出现渴求情况。在多处理器计算机上出现渴求情况的可能性要少得多,
因为在这样的计算机上,优先级为3 1 和优先级为3 0 的线程能够同时运行。系统总是设法使C P U
保持繁忙状态,只有当没有线程可以调度的时候,C P U 才处于空闲状态。
人们可能认为,在这样的系统中,低优先级线程永远得不到机会运行。不过正像前面指出
的那样,在任何一个时段内,系统中的大多数线程是不能调度的。例如,如果进程的主线程调
用G e t M e s s a g e 函数,而系统发现没有线程可以供它使用,那么系统就暂停进程的线程运行,释
放该线程的剩余时间片,并且立即将C P U 分配给另一个等待运行的线程。
如果没有为G e t M e s s a g e 函数显示可供检索的消息,那么进程的线程将保持暂停状态,并且
决不会被分配给C P U 。但是,当消息被置于线程的队列中时,系统就知道该线程不应该再处于
暂停状态。此时,如果没有更高优先级的线程需要运行,系统就将该线程分配给一个C P U 。
现在考虑另一个问题。高优先级线程将抢在低优先级线程之前运行,不管低优先级线程正
在运行什么。例如,如果一个优先级为5 的线程正在运行,系统发现一个高优先级的线程准备
要运行,那么系统就会立即暂停低优先级线程的运行(即使它处于它的时间片中),并且将
C P U 分配给高优先级线程,使它获得一个完整的时间片。
还有,当系统引导时,它会创建一个特殊的线程,称为0 页线程。该线程被赋予优先级0 ,
它是整个系统中唯一的一个在优先级0 上运行的线程。当系统中没有任何线程需要执行操作时,
0 页线程负责将系统中的所有空闲R A M 页面置0 。