Windows CPU Scheduling

本文深入探讨Windows操作系统中的CPU调度机制,包括优先级驱动的抢占式调度方法、线程状态及调度场景等内容。介绍了Windows如何根据线程优先级进行调度,以及不同线程状态之间的转换。

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

 这学期开始学习OS课程,老师要求准备一个关于CPU Scheduling方面的内容在讨论课上讲以下,于是早早准备好,然后就是等待那一节课的到来,每天偶尔想起都会有一丝紧张,今天尤其如此,因为下午就要上台讲了。可是在走上讲台的那一刻感觉却是那么平静,讲的内容也还算顺利,没有出现卡车,不过下来后才发现我居然没有用麦克,看了还是有点紧张^-^.

下面就是这次准备的主要内容:

 

Windows 操作系统中的CPU调度
Agenda
    Overview of Windows Scheduling
    Priority Levels
    Thread States
    Dispatcher Database
    Scheduling Scenarios
Overview
    Windows中采用的是优先级驱动的抢占式调度方法。
                   在就绪队列中,具有最高优先级的线程总是处于运行态。
                   当一个线程被调度执行时,它将获得一个时间量(quantum)。这个时间量的大小因系统和进程而异:系统设置的不同(short or long quantum),前台进程还是后台进程,或者使用内核中的作业对象(job object)来修改。
                   一个线程在其执行的时间量内随时都可能被高优先级的线程抢占。
    Windows中的调度算法是在内核中实现的,但是并不存在一个独立的“调度”模块或程序,因为内核中的这些代码分布在和调度有关的各个事件处理中。所有的这些调度处理统称为内核的调度程序(dispatcher)。
    调度发生在一下时刻:
– 一个线程成为就绪态(ready);
– 一个线程离开运行态(running);
– 一个线程的优先级发生改变;
    在每次调度时,Windows必须决定下一个要运行的线程,当Windows选择了一个线程去执行时,首先要进行上下文切换(context switch)。
    说明:Windows中的调度是以线程为单位的,这更体现了进程是不运行的,它只是为它所包含线程的运行提供资源和上下文环境。因此在调度时我们并不考虑线程具体属于那个进程。例如进程A有10个执行线程,进程B有2个执行线程,并且这12个线程具有相同的优先级,那么这12个线程将各占用CPU时间的1/12,而不是进程A和B各占用CPU时间的50%.
Priority
    Windows内核中采用32级优先等级,从0级到31级,如下图所示:
     
    在Windows API中提供给用户的优先级只有一下6级:
– Real-time
– High
– Above Normal
– Normal
– Below Normal
– Idle
    每个进程只有一个基本优先级,而每个线程都有两个优先级:基本优先级(base)和当前优先级(current)。
    调度则是根据线程的当前优先级进行的。
    对处于可变等级(variable levels,0~15)的线程,在特定情况下Windows会提高其优先级;而处于实时等级(real-time levels,16~31)的线程在其存在期内保持不变的优先级。
    默认情况下,线程初始的优先级继承自它所归属的进程,而进程的优先级则继承自创建它的进程。
    当然也可以通过函数或命令改变进程和线程的初始优先级,同时在创建后也可以改变其优先级。
    改变进程的优先级将改变它所包含线程的优先级,但是线程间的相对优先级不会发生改变。
    改变进程中某个线程的优先级时,除非这个程序是你写的或者你对这个程序中每个线程做什么以及相互间的重要性很清楚,否则不要更改,因为改变它们间的相对优先级很可能造成程序的非正常运行。
    通常,进程的基本优先级(也就是线程创建时的基本优先级)默认设置为优先级范围的中间值(24,13,10,8,6 or 4)。
    Windows的一些系统进程的基本优先级要比默认优先级要稍高,例如Session Manager(smss.exe), local security authentication server(lsass.exe)等。
    对处于可变优先级的线程在其时间片结束时,Windows调度程序会降低它的优先级,但是不会降到该线程的基本优先级之下。降低线程的优先级可以限制CPU-bound线程对CPU的长时间占用。
    当一个处于等待状态的可变优先级线程所等待的操作完成时,Windows调度程序将提升该线程的优先级。提升的程度取决于线程所等待的操作,例如一个等待键盘输入的线程获得的提高要比一个等待磁盘操作的线程获得的提高要多,这样才能使交互线程的响应时间更短,使I/O-bound线程保持I/O处于忙碌状态,同时让CPU-bound线程在后台使用CPU。
    Windows 2000 和 Windows XP 中线程状态转换如下:
Thread State
   
    Ready 等待执行的线程。调度程序每次选取下一个要执行的线程也是从处于就绪状态的线程中选择。
    Standby 下一个将被执行的线程。系统中每一个处理机上只能有一个处于备用状态的线程。当然备用线程也可能在执行前被抢占。
    Running 正在执行的线程。
    Waiting 线程等待其他对象的同步执行,等待I/O操作…
    Transition 线程已经准备好执行了,但是它的核心栈被移出内存。一旦它的核心栈被移入内存,它就会成为就绪态。
    Terminated 线程运行结束
    Initialized 线程被创建
Dispatcher Database
    为了实现线程的调度,Windows内核管理了一组称为调度数据库(Dispatcher Database)的数据结构。调度数据库中记录着哪些线程正等待执行,哪些线程正在哪个处理机上运行。
    Windows系统中为每个优先级都维护一个就绪队列
    为了加速线程的选择,Windows维护了一个32位的位掩码(a 32-bit bit mask)。其中的每一位的置位(即1)表示该优先级的就绪队列中至少有一个等待线程。
Dispatch
    Windows系统中哪个线程将得到CPU完全是基于线程的优先级,而在实际中又是如何实现的?优先级驱动的抢占式多任务又是如何在线程级别上实现的?
    Voluntary Switch
    Preemption
    Quantum End
    Termination
Voluntary Switch
    一个线程会因等待某些资源而通过进入等待状态来主动让出CPU占用权。
         例如:等待一个事件的发生,互斥,信号量,I/O操作的完成,等待某个进程,线程,Windows消息等。
         下图展示了一个线程进入等待状态,Windows选取一个新的线程来执行的过程:
Preemption
    一个高优先级的线程进入就绪态后,会抢占正在执行的低优先级的线程。
    这一情况的发生有以下两个原因:
– 高优先级线程等待的操作已经完成;
– 某个线程的优先级被提升;
    以上任一情况发生时Windows就必须决定是让当前线程继续运行还是被抢占。
    用户态的线程同样可以抢占核心态的线程。即线程的执行模式并不影响调度,只有线程的优先级是决定因素。
    当一个线程被抢占后,它会被放在其优先级的就绪队列的头部,如下图所示:
     
Quantum End
    当一个线程使用完为其分配的CPU时间后,Windows就要决定是否降低其优先级,以及是否要调度一个新的线程到处理机上执行。
    如果一个线程的优先级被降低后,Windows就要寻找一个更合适的线程来执行。
    如果线程的优先级没有降低,但是在同优先级的就绪队列中还有其他线程,Windows将选取队列中的第一个线程来执行,而将该线程放到队列尾部(如下图所示)。如果没有同优先级的就绪线程,该线程将获得一个新的时间片。
 
Termination
    当一个线程执行结束时,它将从执行态进入终态,同时该线程也将从其归属进程的线程列表终删除,与之有关的数据结构也将被释放,调度程序将会从就绪队列中再选取一个线程来执行。
    如果此时CPU上已经没有执行线程了,调度程序就会调度Idle线程执行。在Windows中用工具可以看到Idle线程的优先级是0,实际上Idle线程时没有优先级的,因为它只有在系统中没有其他线程时才会被调度执行。此外,要注意每个Windows系统中只有1个0优先级的线程--the zero page thread.
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值