时间片和优先级调度如何配合

本文详细介绍了Windows操作系统中线程调度的基本原理,包括自愿切换、抢占式调度、时间片用完及线程终止等场景,并解释了线程优先级提升的具体情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/phunxm/archive/2009/12/27/5083405.aspx

.

Windows 在线程优先级上是以 谁将得到CPU” 为基准的,但这个方法是实际上如何工作的呢?下面的部分将解释在线程的级别上,由优先级驱动的,抢占式的多任务的调度是如何工作的。注意到Windows 在处理线程调度决策上,单处理器系统和多处理器系统是不同的,这将在后续部分解释。

1 )自愿切换

线程可能调用Win32 的某些阻塞函数如WaitForSingleObject WaitForMultipleObjects 来等待某个对象(如事件、信号量、I/O 完成的端口、进程、线程、窗口信息等),从而进入等待状态,自动放弃对CPU 的占用。该线程进入同优先级就绪队列的末尾,而CPU 将上下文切换到就绪队列中的下一个线程并开始执行。

以 下就餐的情景能很好的帮助你理解线程的自动切换:在餐厅,你点了一个尚未准备好的汉堡包,为了不阻碍其他的就餐者,你就文明地站到一边,让下一个食客点 菜。这时候,你的汉堡包正在准备中。汉堡包准备好之前,你站到了其优先级的就绪队列的尾部。这样似乎有些不公平,因为你先点的,所以当汉堡包准备好了的时 候,服务员一般会先给你端过来。

同样在操作系统中,为兼顾公平,大部分线程等待的对象受信后,一般会使用一个临时增强优先级,以让线程可以马上执行。

那么线程剩余的时间片又如何呢?当线程进入等待状态时,时间片的值并不重新设置。实际上,前面已经解释过,当线程的等待状态结束时,它的时间片被减少了1 个时间量单位,相当于1/3 个时钟间隔。而优先级等于或高于14 的线程,等待状态结束后,它们的时间量会被重新设置。

2 )抢占式调度

这种调度情况是指一个低优先级的线程被一个较高优先级的线程强抢占。有2 个原因会导致这种情况的发生:

l          较高优先级的线程的等待状态结束,也就是另外一个线程在等待的事件发生。

l          线程的优先级被提高或降低。

在上述的任何一个情况下,Windows 都必须决定当前运行的线程是否仍然继续运行,还是被一个更高优先级的线程抢占运行。

注意 :用户模式下的线程可以抢占内核模式下的线程。其实,线程运行在什么模式下并没有关系。线程的优先级才是决定因素。

当线程被抢占,它被放到了它运行的优先级的就绪队列的头。如果是实时优先级的线程,它的时间量会被重置成一个完整的时间片。如果是动态范围的优先级的线程,它再次运行时,就完成它上次剩余的时间片。

抢占就可以粗略地比喻你的汉堡包已经准备好时,突然总统走来要订一个汉堡包。当总统在拿他的午餐时,并不要求你去队尾,出于一种尊重,你只需站到一边。一旦总统离开,你可以马上获得汉堡包,立即享用。

3 )时间片用完

当一个运行的线程使用完它的时间量,Windows 必须决定是否要降低线程的优先级,和是否让另外一个线程使用处理器。

如果线程的优先级被降低,Windows 寻找一个更适合的线程进行调度。一个更适合的线程是指优先级比当前运行的线程的新的优先级更高的,在就绪队列中的线程。如果线程的优先级没有被降低,而且又有同样优先级的线程在就绪队列中,Windows 将在队列中选择下一个线程,而将先前运行的线程放到了队列的尾部,并赋予它一个新的时间片值,将其状态从运行改为就绪。如果没有另外一个同样优先级的线程准备好运行,线程将继续执行它下一个时间片。

4 )终止

当线程调用了ExitThread 从主函数中返回,或者被TerminateThread 杀掉,它都结束运行,运行状态改为终止状态。如果该线程对象没有打开的句柄,就会从进程的线程队列中被删除,其相关的数据结构将会释放并重新被分配。

线程优先级的提升

在五种情况下,Windows 会提升线程当前优先级的值:

  • 完成I/O 操作时;
  • 等待执行体事件或者信号量受信后;
  • 前台进程的线程完成等待操作后;
  • 因为窗口行为,GUI 线程被唤醒时;
  • 当线程准备好运行,但却一直不能运行。(CPU 饥饿)

这些调整的目的是为了提高系统整体的吞吐量和响应能力,同时也为了解决潜在的不公平的调度现象。正象任意的调度算法一样,这些调整并不是完美的,并不是所有的应用程序都会从中得到好处。Windows 从不提升那些在实时范围内(16-31 )的线程的优先级。因此,在谈到实时范围内的线程时,调度通常是可预知的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值