Windows操作系统支持内核级线程,调度单位是线程,它采用基于动态优先级的,抢占式调度,并结合时间配额的调整来完成调度

一、几个前提知识点

就绪线程按优先级进入相应的就绪队列

系统总是选择优先级最高的就绪线程运行

同一优先级的各个线程按时间片轮转方式进行调度


多CPU系统中允许多个线程并行运行

二、调度时机

线程调度的引发条件,除了前面提到的公共的4种情况外还有以下两种

一个线程的优先级改变

一个线程改变了它的亲和处理机集合(线程可以被处理的处理机的集合,比如这个集合中增加了一个新的处理机)

前面提到的4种情况也列出来:

线程正常终止 或 由于某种错误而终止

新线程创建 或 一个等待线程变为就绪态

当一个线程由运行态线程变为就绪态

当一个线程由运行态进入阻塞态

三、线程优先级(重要)

Windows使用的三类共32个线程优先级:(优先级和优先数自行查阅概念)

实时优先级:16-31(一旦确定优先级不再改变)

可变优先级:1-15(优先级可以在一定范围内升高或降低,分为基本优先级和当前优先级)

系统线程:0(物理内存清零的操作等)

四、时间配额:加粗加硬,理解这个概念非常重要

时间配额不是一个时间长度值,而是一个被称为配额单位的整数值

一个线程用完了自己的时间配额时,如果没有其他相同优先级的线程,Windows将重新给该线程分配一个新的时间配额使其继续运行

五、调度策略

1、主动切换

一个正在运行态的线程由于等待I/O结果进入阻塞态,让出CPU,调度程序从就绪队列选择一个新的线程上CPU运行

2、抢占

如果刚才被阻塞的线程被唤醒,由于他的优先级高,会抢占CPU取运行,被抢占的线程回到就绪队列

当线程被抢占时,它被放回相应优先级的就绪队列的队首

处于实时优先级的线程被抢占时,时间配额被重置为一个完整的时间配额

处于可变优先级的线程被抢占时,时间配额不变,重新得到CPU后将运行剩下的时间配额

3、时间配额用完

时间配额用完的线程,如果优先级降低了,Windows将选择一个优先级更高的线程上CPU

优先级没有降低的情况下,

如果队列中有其他的就绪线程,则选择下一个线程执行,A回到原来就绪队列的末尾

如果队列中没有其他的就绪线程,系统会给当前线程重新分配一个新的时间配额,让他继续运行

六、优化方案

提升优先级的情况(只针对可变优先级1-15的线程)

线程处于就绪态超过了一定的时间还没有运行 (俗称饥饿)

完成I/O操作的线程

前台进程中的线程完成一个等待操作

由于窗口活动而唤醒窗口线程

信号量或事件等待结束

特别的,"饥饿线程"的优先级提升

系统线程"平衡集管理器"每秒钟扫描一次就绪队列,发现是否存在等待时间超过300个时钟中断间隔的线程

平衡集管理器将这些线程的优先级提升到15,并分配它一个长度值为正常值4倍的时间配额,被提升的线程用完

它的时间配额后立即衰减到它原先的基本优先级

标签: none

相关文章推荐

添加新评论,含*的栏目为必填