操作系统(5)处理器调度管理

时间:2022-01-19 18:34:18

1、高级调度:即作业调度。控制多道程序的道数,被选择进入主存的作业越多,每个作业所获得的CPU时间就越少。

中级调度:即平衡调度。当主存资源紧缺时,会把暂时不能运行的进程换出主存,此时这个线程处于”挂起“状态,不参与低级调度。

低级调度:即进程/线程调度。根据某种原则决定就绪队列中的哪个进程/内核级线程获得处理器,并将处理器让出给它使用。低级调度执行十分频繁,这部分代码要精心设计,并常驻主存。

2、选择调度算法的原则:

1)资源利用率:CPU利用率=CPU有效时间/CPU总的运行时间。

CPU总的运行时间=CPU有效工作时间+CPU空闲等待时间。

在一定的I/O操作等待时间的比率下,运行程序的道数越多,CPU空闲时间所占的百分比越低。

2)吞吐率:单位时间内CPU处理作业个数。

3)公平性:确保每个进程都能获得合理的CPU份额和其他资源份额,不会出现饥饿现象。

4)响应时间:从交互式进程提交一个请求(命令)至得到响应之间的时间间隔。

5)周转时间:批处理用户从向系统提交作业开始,到作业完成为止的时间间隔。

注意:批处理系统的调度性能用作业周转时间和带权作业周转时间来衡量,此时间越短则系统效率越高,作业的吞吐率越高。

3、作业和进程的关系:

作业是用户提交给操作系统计算的一个独立任务。每个作业必须经过若干相对独立且相互关联的顺序加工步骤才能得到结果,其中,每个加工步骤称为作业步。

作业是任务实体,进程是完成任务的执行实体。没有作业任务,进程无事可做;没有进程,作业任务无法完成。

4、批处理作业的输入:采用脱机控制方式,作业由程序、数据和作业说明书组成。

批处理作业的建立:为每个作业尽力一个作业控制块JCB,所有JCB组成作业表。

批处理作业的调度:选择作业,分配资源,创建进程,作业控制,后续处理。

5、低级调度的主要功能:调度和分派。

前者实现调度策略,确定就绪态进程/线程竞争使用处理器的次序的裁决原则,即进程/线程合适应该放弃CPU和选择哪个进程/线程来执行。

后者实现调度机制,确定如何时分复用CPU,处理上下文交换细节,完成进程/线程同CPU的绑定及放弃的实际工作。

6、需要执行低级调度的事件:

创建新进程/线程。进程/线程终止。进程/线程阻塞自己。进程/线程运行过程中发生中断或异常。进程/线程执行系统调度。进程/线程所请求的I/O操作完成。进程/线程耗尽时间片。进程/线程改变优先级等等。

调度机制由3个模块组成:

1)队列管理程序:将PCB/TCB指针放入等待CPU资源的进程/线程列表中。

2)上下文切换程序:发生线程/进程切换时,其将当前运行进程/线程的上下文信息保存在其PCB/TCB中。

3)分派程序:当一个进程/线程让出CPU资源后,分派程序被激活。

7、低级调度的基本类型:
1)抢先式:高优先级进程/线程剥夺低优先级的。当运行进程/线程的时间片用完后被剥夺。

2)非抢先式:一旦某个进程/线程开始运行后便不再让出处理器,除非此进程/线程运行结束,或主动放弃处理器,或因发生某个事件而不能继续执行。

注意:内核关键程序是非剥夺式的,用户进程是剥夺式的。

8、1)先来先服务算法FCFS:

非剥夺式调度。按照作业进入系统后备作业队列的先后次序来挑选作业。同样适用于进程/线程调度。在进行处理器调度时,允许作业调度与进程/线程调度分别采用不同的调度算法。

2)最短作业优先算法SJF:

以进入系统的作业锁要求的CPU运行时间的长短为标准,总是选取预计计算时间最短的作业投入运行。非剥夺式。

3)最短剩余时间优先算法SRTF:

它确保一旦新的短作业进入系统或新进程/线程就绪能够很快得到服务。

4)响应比最高者优先算法HRRF:

非剥夺式。要考虑作业的等待时间,和作业处理时间。

响应比=作业周转时间/作业处理时间。

     =(作业等待时间=作业处理时间)/作业处理时间=1+作业等待时间/作业处理时间。

注意:作业处理时间由用户给出,是一个常量。作业等待时间开始于时间点0。

5)优先级调度算法:

总是选择就绪队列中的优先级最高者投入运行。

外部指定法:用户提出优先级。内部指定法:由系统综合考虑有关因素来确定进程/线程的优先级。

优先级通常用0~4095的整数表示。静态优先级在进程/线程创建时即确定,且生命周期内不再改变。但会产生饥饿现象,受某些低优先级进程/线程无限期地被推迟执行。动态优先级是各进程/线程的优先级随时间而改变,

基本原则是:正在运行的进程/线程随着占有CPU时间的增加,逐渐降低其优先级;就绪队列中等待CPU的进程/线程随着等待时间的增加,逐渐提高其优先级,等待时间足够长的进程/线程会因其优先级不断提高而被调度运行。

6)轮转调度算法RR:

剥夺式调度。即时间片调度算法。通常为10ms~20ms。就绪队列中的每个进程/线程轮流地运行一个时间片,当时间片耗尽时,就强迫当前运行进程/线程让出处理器,转而排列到就绪队列尾部,等候下一轮调度。

7)多级反馈队列调度算法MLFQ:

由系统建立多个就绪队列,每个队列对应于一个优先级,第一个队列的优先级最高,第二个队列的优先级次之,气候队列的优先级逐个降低。

注意:此算法会导致饥饿发生,解决办法是对于低优先级队列中等待时间足够长的进程提升其优先级,从而让他获得运行机会。

8)彩票调度算法:

为进程/线程发放针对各种资源(如CPU时间)的彩票,当调度程序需要做出决策时,随机选出一张彩票,彩票的持有者将获得相应的系统资源。在这种情况下,所有进程/线程都是平等的。

9、实时调度算法:

1)单比率调度算法。2)限期调度算法。3)最少裕度法。

10、多处理机调度的设计要点:

1)为进程分配处理机。

2)在单个处理机上是否使用多道程序设计技术。

3)实际指派进程的方法。

11、多处理机调度算法:

1)负载共享调度算法。2)群调度算法。3)专用处理机调度算法。4)动态调度算法。

12、进程优先级:

调用CreateProcess时,根据被创建进程的类型向它指派优先级,通常默认值NORMAL_PRIORITY_CLASS表示,进程被分为4种类型:空闲进程(优先级为4),普通进程(优先级为7或9),高优先级进程(优先级为13),实时进程(优先级为24)。这也是进程的相应线程开始运行时的优先级。

注意:实时进程的优先级通常为24,用于核心态系统进程,完成存储管理、高速缓存管理、本地和网络文件系统及设备驱动程序的功能。

13、线程优先级:

范围0~31。Windows的调度是基于内核级的抢占式调度,包括多个优先级层次。每个优先级都对应于一个就绪队列,每个线程队列中的线程按照时间片方式轮转调度。

1)线程实时优先级(优先数为16~31)。2)线程可变优先级(优先数为1~15)。

3)系统线程优先级(0),仅用于对系统中空闲物理页面进行清0的零页线程。

14、线程调度程序和数据结构:

内核维护一组”调度程序数据结构“,负责记录各线程的状态。最主要的是调度器的就绪队列,此队列由一组子队列组成,每个优先级都有一个队列,共32个。

为了加快调度速度,Windows维护一个称为就绪位图的32为掩码,和一个称为空闲位图的32为掩码。

15、线程调度策略:

1)主动切换:线程因进入等待态而主动放弃处理器,许多Win32等待函数的调用都使得线程等待某个对象,包括事件、互斥信号量、资源信号量、I/O操作、进程、窗口消息等。

2)抢占:当一个高优先级线程进入就绪态时,正处于运行态的低优先级线程将被抢占。注意:在用户态运行的线程可抢占在内核态运行的线程。当线程被抢占时,它被放在相应优先级就绪队列的队首,而非队尾。

3)时间配额耗尽:当处于运行态的线程用完其时间配额时,Windows必须确定是否需要降低此线程的优先级,再确定是否需要调度另一个线程进入运行态。

4)结束:当线程完成运行时,其状态从运行态转换为终止态。线程完成原因可能是通过调用ExitThread而从主函数中返回,或被其他线程通过调用TerminateThread来终止。如果处于终止态的线程对象上没有为关闭的句柄,则此线程将被从进程的线程列表中删除,相关的数据结构将被释放。

16、线程优先级提升:

系统永远不会提升实时优先级范围内的线程优先级,因此,在实时优先级范围内的线程调度总是可预测的。

1)I/O操作完成后的优先级提升:通过内核函数IoCompleteRequest来指定优先级的提升幅度。

2)信号量或等待事件结束后的优先级提升

3)前台线程完成等待操作后的优先级提升

4)图形用户接口线程被唤醒后的优先级提升

5)对处理器饥饿线程的优先级提升

17、每个线程都有一个亲合掩码,描述此线程可在哪些处理器上运行,这个亲合掩码是从进程的亲合掩码继承而来的。线程的首选处理器和最近使用的处理器。

18、空闲线程:优先级为0,其功能是在一个循环中检测是否有工作要进行:处理所有待处理的中断请求。检查是否有待处理的DPC请求,如果有,则清除相应的软件中断并执行DPC。检查是否有就绪线程可进入运行态,如果有,则调度线程运行,否则调用硬件抽象层的处理器空闲例程,执行相应的电源管理功能。