一、处理机调度: 指从就绪队列中按照一定的算法选择一个进程并将处理机分配给他运行,以实现进程的并发执行。
由于内存资源有限,我们不会将用户提交的所有作业全部放入内存,因此就需要对作业调入内存的顺序加以规定,我们将这一过程就称为处理机调度。处理机调度分为三个层次:高级调度、中级调度、低级调度。
1.高级调度(作业调度):从外存中挑选一个(或多个)作业,给他们分配必要资源,并建立相应的PCB,使他们获得竞争处理机的权利。
当引入虚拟存储技术之后,我们可以将一些暂时不能运行的进程调至外存等待,当它重新具备了运行条件且内存有空闲时,再重新调入内存,实际上这就是虚拟存储技术。这么做的好处就是内存利用率和系统吞吐量得到提升。暂时调到外存等待的进程状态称为挂起状态。挂起状态又可以分为就绪挂起状态和阻塞挂起状态。注意:PCB并不会一起被调到外存而是会常驻内存,被挂起的进程的PCB会被放到挂起队列之中。
2.中级调度(内存调度):决定将那个处于挂起的进程重新调入内存,一个内存可能会被调出、调入多次,因此中极调度发生的频率比高级调度的频率高。
3.低级调度(进程调度):从就绪队列中选取一个进程,将处理机分配给他。进程调度是操作系统中最基本的一种调度,在一般的操作系统中必须配置进程调度。因此进程调度的频率最高,一般几十毫秒一次。
二、进程调度的时机切换与过程调度方式:
需要进行进程调度与切换的情况:①当前运行的进程主动放弃处理机。包括以下几种情况:进程正常终止;进程过程中发生异常而终止;进程主动请求阻塞(例如:等待I/O)②当前运行的进程被动放弃处理机。包括以下情况:分给进程的时间片用完;有更紧急的是需要处理;有更高优先级的进程进入就绪队列。
不能进行进程调度与切换的情况:①在处理中断过程中。②进程在操作系统内核程序临界区中。③在原子操作过程中(原语)。
进程调度的方式:非剥夺调度方式(非抢占式)和剥夺调度方式(抢占方式)。前者实现简单,系统开销小但是无法及时处理紧急任务,适合早期的批处理系统;后者可以优先处理更紧急的进程,也可以实现让各进程按时间片轮流执行的功能(通过时钟中断),适用于分时操作系统、实时操作系统。
注意:如果频繁的进行进程调度的话不会大幅增加系统的并发度,因为进程切换是有代价的(对原来运行进程各种数据的保存,对新进程的各种数据的恢复),如果大量的进行进程调度,会使系统大部分时间花在了进程切换,而不是执行进程。
三、进程调度算法的评价指标: CPU利用率、系统吞吐量、周转时间、等待时间、响应时间。
1.CPU利用率 :忙碌的时间/总时间。
2.系统吞吐量 :单位时间完成作业数量
3.周转时间:作业被提交给系统开始,到作业完成为止的时间间隔。
4.平均周转时间:各作业周转时间之和/作业数。
5.带权周转时间:作业周转时间/作业实际运行时间 = (作业完成时间-作业提交时间)/作业实际运行时间。带权周转时间越小越好。
6.平均带权周转时间:各作业带权周转时间之和/作业数。
7.等待时间:作业或者进程等待处理及状态时间之和。时间当然越短越好。对进程来讲,等待时间是指进程建立后,等待被服务的时间之和。对作业来说,不仅要考虑进程建立后的等待时间,还要加上作业在外存后被队列中的等待时间。
8.响应时间:用户提出请求到首次被响应的时间。
四、调度算法: 先来先服务(FCFS)、短作业优先(SJF )、高响应比优先(HRRN)、时间片轮转算法(RR)、优先级调度算法、多级反馈队列调度算法。
1.先来先服务:算法规则是按照作业/进程到达的先后顺序进行服务,为非抢占式算法。优点是公平、算法实现简单;缺点是排在长作业(进程)后的短作业需要等待很长的时间,带权周转时间很大,对短作业来说用户体验不好。
2.短作业优先:分为非抢占式短作业优先(SPF)和抢占式短作业优先(即最短剩余时间优先算法)(SRTN)。优点是:“最短的”平均等待时间、平均周转时间;缺点是对短作业有利,对长作业不利。可能会产生长作业的饿死现象(饿死指的是作业一直得不到服务;如果作业得不到服务称之为饥饿)。
①非抢占式短作业优先:每次调度时选择当前已经到达且运行时间最短的作业/进程。他的平均等待/周转/带权周转时间相比于FCFS算法来讲都要低。
②抢占式短作业优先:每当有进程加入就绪队列时就需要调度,如果新到达的进程剩余时间按比当前运行进程的剩余时间更短,则新进程抢占处理机,当前运行进程回到就绪队列。相比于SPF算法,SRTN算法的平均等待/周转/带权周转时间又会降低一些。
注意:如果题目未说明,那么我们默认所提到的短作业/进程优先算法指的是非抢占式的。
3.高响应比优先算法:非抢占式算法,只有当前运行的进程主动放弃CPU时(正常/异常完成,或主动阻塞),才需要进行调度,调度时计算所有就绪进程的响应比,选择响应比最高的进程,让他上处理机。响应比 = (等待时间 + 要求服务时间) / 要求服务时间。他的优点就是结合了FCFS优点和SJF算法的优点。
以上三个算法主要关心对用户的公平性、平均周转时间以及平均等待时间等评价系统整体的性能指标,但是不会关心响应时间,也不会区分人物的紧急程度,所以他们的交互性很糟糕。因此这三种算法一般适用于早期的批处理系统。
4.时间片轮转算法:按照各进程到达就绪队列的顺序,轮流的让各个进程执行一个时间片,若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放置到就绪队列队尾重新排队。因此我们可以看出该算法属于抢占式算法。通过时钟中断来通知CPU时间片已到。它适用于分时操作系统,更加专注响应时间。
优点就是公平、响应快;缺点是由于高频率的切换,会有一定的开销且不区分任务的紧急程度。
注意:时间片不宜过小也不宜过大。过小会导致进程频繁切换,系统会花大量的时间来处理进程切换,导致实际用于进程执行的时间比例减少;过大会增大进程响应时间,此时时间片轮转算法就会退化为FCFS算法。一般来讲,在设计时间片的时候让进程切换的开销占比不超过1%。
5.时间片轮转算法:调度时选择优先级最高的进程/作业,分为抢占式和非抢占式。区别在于非抢占式只需要在进程主动放弃处理机时进行调度即可,而抢占式还需要在就绪队列变化时检查是否会发生抢占。注意,优先数越大的优先级越高。
就绪队列未必只有一个,可以按照不同的优先级来组织,另外,可以把优先级高的进程排在更靠近队头的位置。
根据优先级是否可变我们将优先级分为静态优先级(创建进程时确定,之后一直不变)和动态优先级(创建进程的时候有一个初始值,之后会根据不同的情况进行动态的调整优先级)。一般来讲,系统进程优先级高于用户进程;前台进程优先级高于后台进程(可以参考我们现在想运行的手机程序与后台程序的关系);I/O型进程(I/O繁忙型进程)优先级高于计算型进程(CPU繁忙型进程)。对于最后一条,因为I/O设备和CPU可以呀并行执行,如果让I/O型进程优先运行的话可以提升资源利用率并且提升系统吞吐量。
6.多级反馈队列调度算法:对其他算法的优点进行均衡。属于抢占式算法。