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. 设置线程的优先级      SetThreadPriority 2. 创建线程函数      CreateThread...

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

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

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

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

Windows核心编程笔记(5)----线程调度,优先级

1、操作系统线程调度过程 每个线程都有一个上下文CONTEXT结构体,保存在线程的内核对象中,这个上下文中保存了线程上一次执行时CPU寄存器 的状态。每隔固定时间,Windows会查看所有当前存在...
  • mfcing
  • mfcing
  • 2015年01月28日 11:12
  • 1681

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

线程调度、优先级和关联性  From:http://blog.csdn.net/drecik__/article/details/8095467     每个线程都有一个CONTEXT结构,保存在线...

Windows定义了6个优先级类别

改变线程的优先级 在Windows中,每个线程都与一个优先级设置相关。线程的优先级决定了线程接收的CPU时间的多少。低优先级的线程接收比较少的时间,高优先级的线程接收比较多的时间。当然,线程接收的C...
  • zhubo22
  • zhubo22
  • 2012年10月15日 11:09
  • 1528

Windows微秒级定时方法

在做硬件相关的程序时,需要大量的数据传输,当数据发送量大于设备接口接收量时会造成字节bit位覆盖的问题(比如单根串口线每次发送或者接收一个bit如果发送速度大于接收速度会造成前一个bit位被下一个bi...

关于线程调度和线程调度消耗的讨论贴

关于线程调度和线程切换 背景知识: 调度:就是选出下一个要在cpu上执行的线程。优先级:“剥夺”式调度的依据,windows将线程的优先级分为32个级别,0最低,31最高就绪队列:window...

Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)

Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)

Windows核心编程<读书笔记七>线程的调度、优先级以及亲缘性 【含有代码】

【文起】亲爱的,已经12月份了,相聚的日子已经很临近临近了。爱你蟹儿,加油 线程的调度、优先级以及亲缘性 1、  系统只调度可以调度的线程。如果线程的暂停次数大于1,说明该线程已经暂停运行,不会给...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows 核心编程 线程的优先级
举报原因:
原因补充:

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