七(1-5) 线程的调度、优先级和关联性

基本概念:   

      Windows为抢占式系统,必须使用某种算法确定何时应该调用哪些线程以及需要分配多少时间等。

     线程上下文: 每个线程都有自己的一组CPU寄存器,成为上下文。上下文反映线程上一次执行时CPU寄存器的状态。该上下文保存在一个CONTEXT结构中,该结构本身保存在线程内核对象中。  系统使用CONTEXT结构记住线程状态,在下一次获得CPU时间时就可以从上一次停止处继续。CONTEXT结构是唯一一个特定于CPU的数据结构(CPU上的每一个寄存器都对应一个数据成员,因此CONTEXT的数据成员与CPU有关)。

     上下文切换:大约每过20ms,windows就会查看当前存在的线程,并从可以调度的线程中选择一个,将上次保存 的CPU上下文值加载到CPU寄存器中。 这一过程即为上下文切换。      windows将记录每个线程运行的次数,大约每过20ms(GetSystemTimeAdjustment()的第二个参数的返回值)就进行一次上下文切换,这个过程一直重复,知道系统关闭。   这就是windows的多线程的调度方式:抢占式(系统可能在任何时刻停止当前线程转而执行另一线程,我们可以对此进行一些控制,但是余地不大)

     除了被挂起的线程外还有很多其他的线程不能被调度(因为他们在等待某事件的发生)。

   


7.1  线程的挂起和恢复

        CreateProcess或CreateThread在创建一个新线程时,系统将创建一个内核对象,并将挂起计数设为1 ,在线程初始化后,函数将查看是否有CREATE_SUSPENDED标志被设置,有,则新线程处于被挂起状态;没有,则挂起计数为0,处于可被调度状态(除非该线程在等待某事件的发生)。一个处于挂起状态的线程,可以在它执行任何代码之前设置其环境(如优先级),改变了环境的线程必须使其变为可调度状态(可用ReSumeThred函数实现)。

         一个线程可以被多次挂起,除了在创建时,还可以用SuspendThread(HANDLE hThread);实现(任何线程都可以通过该函数来挂起另一线程)。线程可以将自己挂起,但是不能自己恢复。 一个线程最多被挂起MAXIMUM_SUSPEND_COUNT次。

注意: 在使用SuspendThread(HANDLE hThread)函数挂起另一线程时必须小心,因为我们无法知道此时被挂起线程正在做什么。例如:挂起一个正在分配堆中内存的线程,该线程将锁定堆,从而其他线程访问堆的行为将被中止,直到该线程被恢复。


7.2 进程的挂起和恢复

        windows中并没有挂起恢复进程的概念,因为不会给进程调度CPU时间。这里是指 挂起或恢复一个进程中的所有线程。

我们可以自己实现Suspend_Process函数:枚举该进程中的所有线程,对每个线程一次调用Suspend_Thread和Resume_Thread函数来实现。 

注意:由于在枚举线程集合时,进程中可能有新的线程被创建或线程被销毁!!


7.3  睡眠

void sleep(DWORD dwMilliseconds);使线程被挂起大约 dwMilliseconds毫秒长的时间(sleep函数告诉系统该线程在一段时间内不再需要调度)

注意:1、sleep使线程自愿放弃属于它的时间片剩余部分

 2、睡眠时间“大约“为 dwMilliseconds毫秒,具体时间取决于其他线程的调度(windows不是实时系统)。

         3、给sleep传入参数0,告诉系统放弃了时间片剩余部分。但是当没有相同或较高优先级的可调度线程时,系统还会调度该线程。


7.4  切换到另一个线程

如果存在另一个可调度线程,系统会让线程运行BOOL SwitchToThread函数,此时系统查看是否有继续CPU时间的饥饿线程,如果没有,该函数立即返回,如果有, SwitchToThread函数调度该饥饿线程(该线程可能比主调线程优先级低)。饥饿线程运行一个时间量后,系统调度程序恢复正常运行。( SwitchToThread函数为手动切换?


7.5  在超线程CPU上切换到另一线程

超线程处理器芯片,有多个逻辑CPU,每个都可以运行一个线程。当一个线程中止时,CPU自动执行另个线程,不需要系统干预。



















             

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值