七 (7.8 线程优先级 - 7.11 关联性)

7.8 线程优先级

 

         优先级将影响调度程序如何选择下一个要运行的线程。每个线程被赋予0(最低)—31(最高)的优先级数。CPU会查看有无其他可调度的线程,首先看有无31的线程,并以循环方式进行调度。当较高优先级线程占用CPU,导致较低优先级线程无法运行,即为饥饿。

注意:1、由于任何时刻系统中大多数线程都是不可调度的,因此不会出现较低优先级线程永远无法运行的情况

          2、较高优先级线程总是抢占低优先级线程,无论低优先级是否正在执行,都会立即暂停,转而执行较高优先级。

 页面清零线程:系统启动时将创建为一一个优先级为0的清零线程。该线程负责在没有其他线程运行时把内存的闲置页面清零。 

 


7.9 从抽象角度看优先级

 

         调度算法对用户运行的各种程序都有显著的影响。Microsoft通过保留动态微调度算法来保证用户的正常运行。 WindoewsAPI在系统的调度程序之上提供一层抽象么从而不会直接调用调度程序。相反,调用的是WINDOWS函数,他会根据底层操作系统的版本来“解释”参数。

        在设计一个应用程序(进程)时,应考虑用户还会运行其他程序,因此应为进程中的线程提供一个适当的优先级类。Windows提供6个优先级类。其中99%为normal级。



选择了进程优先级别,就不需要再考虑应用程序与其他应用程序的关系,应转而关注进程自身的线程。

    Widows提供7个线程相对优先级(注:相对于进程优先级)见下表:


有的线程优先级被是用户无法获取的,这将留给内核模式的程序。


注:进程优先级是一个抽象的概念,进程永远无法调度,能调度的是线程。

 

7.10  优先级编程


         调用CreateProcess,可以在其参数fdwGreate参数中传入需要的优先级标识符。一旦进程创建了,可以调用SetPriorityClass来改变任何进程优先级。

   当线程被创建时,总是默认为normal优先级,不能像创建进程时传递优先级标识符来设定。创建后只能用SetThreadPiority来设置线程的相对优先级(在设置线程相对优先级前用暂停线程)。

         注:windows并没提供返回线程优先级的函数。Microsoft保留了任何时候改变调度算法的权利,因此我们只需要关心相对优先级即可。

 

7.10.1动态提升线程优先级


  线程的相对优先级根据具体的调度算法映射得到的线程优先级称为基本优先级。具体映射如下表(根据系统版本可变):

  有时系统为例相应某个如I/O事件,会临时提升线程的优先级。具体提升情况Microsoft保留了动态调整。另一种动态提升为当一个饥饿线程时间3到4秒时,它会动态提升到15,并运行与该线程运行2个时间片,当两个时间片结束时,线程立即恢复基本优先级。

 

 

7.10.2 为前台进程微调调度程序

 

            当用户使用某个进程的窗口时,该进程即为前台进程,而其他所有为后台进程,显然希望前台进程能快速响应。通过为前台进程微调调度算法,当前台进程为normoal优先级时,分配比一般情况更多的时间片。(用户可通过系统属性对话框设置)

 

7.11 关联性

         在默认情况下,在给线程分配处理器是一般为软关联,即如果其他因素一样,系统将给线程在上一次运行的处理器上运行。这有助于,仍在处理器高速缓存中的数据。

         当有多个CPU时支持设置进程和线程的关联性,既可以控制让哪些CPU运行特定的线程。称为硬关联。子进程将继承关联性。 函数SetProcessAffinityMask和SetThreadAffinityMask设置进程和线程在特定的CPU子集上运行。

 

 




 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值