操作系统-Windows操作系统的线程调度了解这些

Posted yb38156

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统-Windows操作系统的线程调度了解这些相关的知识,希望对你有一定的参考价值。

  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倍的时间配额,被提升的线程用完

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

 

以上是关于操作系统-Windows操作系统的线程调度了解这些的主要内容,如果未能解决你的问题,请参考以下文章

windows 怎样在调度线程到多核

了解多线程

Java多线程的调度策略

作业进程线程多线程多核

《一遍文章让你快速了解JAVA---并发编程基础》

QNX Hypervisor 2.2 用户手册1.7 调度