Windwos核心编程 - 线程调度、优先级和关联性(1)

1. 上下文

      每个线程都有一个上下文(Context),上下文保存在线程的内核对象中,这个上下文反映了线程上一次执行时的CPU寄存器状态。Window大约每隔20ns会扫描所有的线程的内核对象,然后在可调度的线程中挑一个,并将该线程上次保存在线程上下文的值转入CPU寄存器,这一过程称为上下文切换。

2.线程的挂起和恢复

     在线程内核对象中有一个值表示线程的挂起计数,当线程的挂起计数为0时,线程就成为可调度的。一个线程可以被多次挂起,如果一个线程被挂起三次,则在它有资格让系统为它分配CPU之前必须被恢复三次。当试图挂起一个线程时,必须小心,因为不知道线程在做什么,假如线程正在分配堆中的内存,线程将锁定堆,当其它线程要访问堆的时候,它们的执行将被中止。

3.睡眠

    线程可以告诉系统,自己在一段时间内不需要调度了,可调用Sleep实现,关于Sleep,有几点需要注意:

1)调用Sleep,将使线程放弃属于它的时间片中剩下的部分;

2)系统设置线程不可调度的时间是不太准确的,因为Windows不是实时操作系统,实际情况取决于其它线程的运行情况。

3)可给Sleep传入0,这是告诉系统,线程放弃时间片的剩余部分,强制系统调度其他线程。

4.切换到其它线程

    调用SwitchToThread函数,如果存在另一个可调度的线程,系统会让该线程运行。如果没有其他线程可运行,则函数将返回FALSE。SwithcToThread与Sleep传入0类似,区别是:SwithcToThread允许执行低优先级的线程,Sleep会立即重新调度主调线程,即使低优先级的线程还处于饥饿状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值