windows 核心编程 线程的优先级

本文详细介绍了Windows系统中线程的优先级机制,包括不同优先级的含义和调度规则。从0(最低)到31(最高),优先级31的线程会被优先调度。讨论了实时、高、正常、低优先级线程的特性和应用场景,并提到了动态优先级提升的情况。还介绍了如何使用API函数SetThreadPriority和GetThreadPriority来设置和获取线程的优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每个线程都会被赋予一个从0(最低)到31(最高)的优先级号码.当系统确定将哪个线程分配给CPU的时候,它首先观察优先级为31的线程,并以循环的方式对它们进行系统调用.如果优先级为31的线程可以调度,那么就赋予该线程一个CPU时间片.在该线程的时间片结束的时候,系统要查看是否还有另一个优先级为31的线程可以运行,如果有,它将允许该线程被赋予CPU时间片.

只有优先级为31的线程是可以调度的,系统就绝对不会将优先级为0到30的线程分配给CPU.这种情况称为渴求调度(starvation).这里存在一个问题,是否低优先级的线程永远得不到调用,因为在任何一个时间段内,系统中的大多数线程是不能调用的.例如:如果主线程调用GetMessage函数,而系统发现没有线程可以供它使用,那么系统就暂停进程的线程运行,释放该线程的剩余时间片,并且立即将CPU分配给另一个等待运行的线程.高优先级的线程会抢占低优先级的线程.

当系统引导的时候,它会创建一个特殊的线程,称为0页线程.该线程被赋予优先级0,它是整个系统中唯一的一个在优先级0上运行的线程.当系统中没有任何线程需要执行的时候,0页线程负责将系统中的所有空闲的RAM页面置0.

有几个等级的优先级需要特别注意:

实时优先级:进程中线程必须立即对事件作出响应,以便执行关键时间的任务.该进程中的线程还会抢先于操作系统组件之前运行.使用本优先级类时必须极端小心.

高优先级:进程中的线程必须立即对事件作出响应,以便执行关键时间的任务.Task Manager 在这个类上运行,以便用户可以撤销脱离控制的进程.win2k中加的新优先级

高于正常:进程中的线程在正常优先级与高级优先级之间运行win2k中的新优先级

正常:进程中的线程没有特殊的调度需要.

低于正常:进程中的线程在正常优先级与空闲优先级之间运行,win2k中的新优先级

空闲:进程中的线程在系统空闲时运行.该进程通常由屏幕保护程序或者后台实用程序和搜集统计数据的软件应用.

Explorer是在高优先级上运行的.

相对的线程优先级

关键时间,最高,高于正常,正常,低于正常,最低,空闲

进程优先级和线程优先级之间的映射表:

相对

优先级等级

空闲

低于

正常

正常

高于

正常

实时
关键时间15155151531
最高6810121526
高于正常579111425
正常468101324
低于正常35791223
最低24681122
空闲1111116

例如正常的线程被赋予的优先级是8,由于大多数进程属于正常的优先级类,而大多数线程属于正常线程优先级,因此系统中的大多数线程的优先级是8.如果高优先级进程中有一个正常线程,该线程的优先级将是13.如果将进程的优先级改为8,那么线程的优先级就变为4,如果改变了进程的优先级类,线程的相对优先级类不变,但是它的优先级的等级却发生了变化.

下列优先级等级是无法使用的:17,18,19,20,21,27,28,29,30.如果编写一个以内核方式运行的设备驱动程序,可以获得这些优先级的等级,而用户方式的应用程序则不能.另外还要注意,实时优先级中的线程不能低于优先级等级16.同样,非实时优先级中的线程的等级不能高于15.进程的优先级类是个抽象的概念,Microsoft提出这个概念的目的,是为了帮助你将它与可调度程序内部运行情况区分开来.它没有其他目的.

当使用命令外壳启动一个程序的时候,该程序的起始优先级是正常优先级.但是,如果使用Start命令来启动该程序,可以使用一个开关来设定应用程序的起始优先级.

c:/>Start /LOW calc.exe

 Start命令还能识别/BELOWNORMAL,/NORMAL,/ABOVENORMAL,/HIGH和/REALTIME等开关,以便按它们各自的优先级启动一个应用程序.当然,一旦应用程序启动运行,它就可以调用SetPriorityClass函数,将它自己的优先级改为它选择的任何优先级.

若要设置和获得线程的相对优先级,必须调用

BOOL SetThreadPriority(HANDLE hThread,int nPriority);

下面是检索线程的相对优先级的补充函数:

int GetThreadPriority(HANDLE hThread);

动态提高线程的优先级等级,注意,线程的当前优先级等级决不会低于线程的基本优先级等级.此外,导致线程成为可调度线程的设备驱动程序可以决定优先级等级体提高的数量.系统只能为基本优先级等级1到15之间的线程提高其优先级等级.Microsoft提供了两个函数可以关闭系统动态提高优先级的功能.

BOOL SetProcessPriorityBoost(HANDLE hProcess,BOOL DisablePriorityBoost);

BOOL SetThreadPriorityBoost(HANDLE hThread,PBOOL pDisablePriorityBoost);

 另一种情况也会导致系统动态地提高线程地优先级等级.比如有一个优先级为4的线程准备运行但是却不能运行,因为一个优先级为8的线程正在连续被调度.在这种情况下,优先级为4的线程就非常渴望得到CPU时间,当系统发现一个线程在大约3至4s内一直渴望得到CPU时间,它就将这个线程的优先级动态提高到15,并让该线程运行两倍于它的时间量,当到了两倍时间量的时候,该线程的优先级立即返回到它的基本优先级.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值