《Windows核心编程》第7章 线程调度、优先级和关联性

每个线程都有一个上下文,后者保存在线程的内核对象中。这个上下文反映了线程 执行时CPU寄存器的状态。

Windows被称为抢占式多线程操作系统,它可以在任何时刻停止一个线程而另行调度另外一个线程。

如果ResumeThread函数成功,它将返回线程的前一个挂起计数;否则它将返回0xFFFFFFFF。一个线程可以被多次挂起。线程被挂起多少次,就必须恢复多少次,这样才能变为可调度状态。挂起线程可以使用SuspendThread函数,它也返回线程之前的挂起计数。

线程可以通过调用Sleep函数告诉系统,在一段时间内自己不需要调度。关于Sleep函数,需要注意几点:
●    调用Sleep函数,这将使线程自愿放弃属于它的时间片中剩余的部分。
●    系统设置线程不可调度的时间只是“近似于”所设定的毫秒数。
●    可以给Sleep传入参数INFINITE,这是在告诉系统,永远不要调度这个线程。
●    可以给Sleep传入参数0,这是在告诉系统,主调线程放弃了时间片的剩余部分,它强制系统调度其他线程。但是系统也有可能重新调度刚刚调用了Sleep的那个线程。

系统提供名为SwitchToThread函数,如果存在另一个可调度线程,那么系统会让此线程运行。通过这个函数,需要某个资源的线程可以强制一个可能拥有该资源的低优先级的线程放弃资源。调用SwitchToThread和调用Sleep并传入0ms超时类似。区别在于,前者允许执行低优先级线程,后者会立即重新调度主调线程,即使低优先级线程还处于饥饿状态。

如果要想知道一个线程已经获得CPU调度时间量,可以使用GetThreadTimes函数。其函数原型为:BOOL GetThreadTimes(
            HANDLE hThread,             //以下时间都用100ns为单位
            PFILETIME pftCreateTime,//返回线程创建时间的绝对值
            PFILETIME pftExitTime,//返回线程退出时间的绝对值,用100ns为的单位
                PFILETIME pftKernelTime,//返回线程执行内核模式下的操作系统代码所用
                                           时间的绝对值
            PFILETIME pftUserTime//返回线程执行应用代码所用时间的绝对值
            );

我们可以调用GetThreadContext来查看线程的内核对象的内部,并获取当前CPU寄存器的集合。一个线程实际上有两个上下文(CONTEXT):用户模式和内核模式。同样我们可以通过调用SetThreadContext来改变结构中的成员,并把新的寄存器值放回到线程的内核对象中。注意,这里在调用GetThreadContext还是SetThreadContext之前,都应该调用SuspendThread来暂停线程。

较高优先级的线程总是会抢占较低优先级的线程,无论较低优先级的线程是否正在执行。例如,如果有一个优先级为5的线程正在执行,而系统确定有较高优先级的线程已经准备好可以运行,它会立即暂停较低优先级的线程(即使后者的时间片还没有用完),并将CPU分配给较高优先级的线程,该线程获得一个完整的时间片。

系统启动时,将创建一个名为页面清零线程的特殊线程。该线程的优先级为0,它是整个系统中唯一一个优先级为0的线程。页面清零线程负责在没有其他进程需要执行的时候,将系统内存中的所有闲置页面清零。

进程优先级和相对线程优先级与优先级值的映射



进程永远不能调度,能调度的是线程。进程 优先级只是微软提出的一个抽象概念。进程可以通过调用SetPriorityClass/GetPriorityClass来设置或获取自己的优先级。通过命令行界面调用程序时,程序的起始优先级是normal。但如果使用START命令调用程序,可以使用一个开关指定的起始优先级。如下所示命令将以idle优先级运行计算器程序:
C:/>START /LOW CALC.EXE

为了设置/获取线程的相对优先级,可调用函数SetThreadPriority/GetThreadPriority。

系统通过线程的相对优先级加上线程所属进程的优先级来确定线程的优先机值。这个优先级值也被称为线程的基本优先级值。线程的当前优先级低于线程的基本优先级。

函数SetProcessPriorityBoost允许或禁止系统提升一个进程中所有线程的优先级;而函数SetThreadPriorityBoost则允许或禁止提升某个线程的优先级。这两个函数都有相应的用来判断当前是否启用优先级提升的函数:
GetProcessPriorityBoost/GetThreadPriorityBoost。
 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值