windows 核心编程 线程的优先级

原创 2007年09月20日 14:48:00

每个线程都会被赋予一个从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是在高优先级上运行的.

相对的线程优先级

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

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

相对

优先级等级

空闲

低于

正常

正常

高于

正常

实时
关键时间 15 15 5 15 15 31
最高 6 8 10 12 15 26
高于正常 5 7 9 11 14 25
正常 4 6 8 10 13 24
低于正常 3 5 7 9 12 23
最低 2 4 6 8 11 22
空闲 1 1 1 1 1 16

例如正常的线程被赋予的优先级是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,并让该线程运行两倍于它的时间量,当到了两倍时间量的时候,该线程的优先级立即返回到它的基本优先级.

Windows核心编程学习六:进程优先级组和线程优先级

注:源码为学习《Windows核心编程》的一些尝试,非原创。若能有助于一二访客,幸甚。 1.基本框架 使用CreateDialog和MAKEINTERESOURCE /* * Fi...
  • guzhou_diaoke
  • guzhou_diaoke
  • 2013年04月22日 21:55
  • 3985

Windows核心编程笔记(七) 线程调度 优先级 关联性

首先线程与系统时钟间隔参见http://blog.csdn.net/wangpengk7788/article/details/54287947 在抢占式多任务操作系统中,线程的运行是有限制的,系统会...
  • wangpengk7788
  • wangpengk7788
  • 2017年01月09日 14:15
  • 724

Windows下设置应用程序的优先级

说起来,这个功能很早就见到过了,一直感觉没什么用。今天老婆要我把一个6G多的mpeg2文件转成wmv格式,这可真是耗资源啊,我的小本本CPU立马就蹦到100%,几乎啥也干不了,再一看时间,要20个小时...
  • FeiSan
  • FeiSan
  • 2007年07月06日 16:15
  • 1966

进程的优先级设置与获取,进程时间

进程的优先级设置与获取:值越小优先级越高        #include        #include        int niece(int add)        int getp...
  • u010261063
  • u010261063
  • 2016年09月28日 08:32
  • 317

Windows核心编程学习笔记--进程和线程的优先级

线程调度、优先级和关联性  From:http://blog.csdn.net/drecik__/article/details/8095467     每个线程都有一个CONTEXT结构,保存在线...
  • disappearedgod
  • disappearedgod
  • 2014年03月28日 18:38
  • 960

改变进程和线程的优先级(Windows)

Windows平台上的关于进程和线程创建和修改优先级方法 1. 设置线程的优先级      SetThreadPriority 2. 创建线程函数      CreateThread...
  • yongqiangyue
  • yongqiangyue
  • 2012年07月31日 15:39
  • 772

Windows线程优先级提升策略

Windows线程优先级提升策略 Windows实现了一个基于优先级的抢先式多处理及调度系统。通常线程可在任何可用处理机上运行,但可限制某线程只能在某处理机上运行。要了解线程优先级的变化,首先我们应该...
  • tuohuang0303
  • tuohuang0303
  • 2010年07月11日 20:30
  • 709

《windows核心编程系列 》六谈谈线程调度、优先级和关联性

http://blog.csdn.net/ithzhang/article/details/8046723转载请注明出处! 线程调度、优先级和关联性      每个线程都有一个CONTEXT结...
  • ithzhang
  • ithzhang
  • 2012年10月08日 08:06
  • 8733

获取当前线程,线程id,设置优先级等函数接口

WINBASEAPIHANDLEWINAPIGetCurrentThread(    VOID    );  WINBASEAPIDWORDWINAPIGetCurrentThreadId(    V...
  • jackychu
  • jackychu
  • 2008年09月26日 11:14
  • 6415

Windows C/C++ 学习线程调度、线程优先级和亲缘性

每一个线程在它的线程内核对象中有一个上下文结构,反映了线程最后一次执行的 CPU 寄存器状态,每隔大约 20ms(可以使用 GetSystemTimeAdjustment 获得,我测得这个间隔大约为 ...
  • flyingleo1981
  • flyingleo1981
  • 2013年05月22日 14:12
  • 1782
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows 核心编程 线程的优先级
举报原因:
原因补充:

(最多只允许输入30个字)