处理机调度的层次和调度算法的目标
CPU利用率
平均周转时间
作业的周转时间T与系统为它提供服务的时间Ts之比
所谓周转时间,即作业被提交给系统开始,到作业完成为止这之间的时间间隔。
平均带权周转时间
作业与作业调度
作业是一个比程序更广泛的概念,包括程序,数据,作业说明书。
是指在一次应用业务处理过程中,从输入开始到输出结束,用户要求计算机所做的有关该次业务处理的全部工作。
先来先服务(FCFS, FIRST COME FIRST SERVED)作业调度算法
FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。即先到先调度
系统按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。然后把它放入就绪队列。
短作业优先(SJF, SHORT JOB FIRST)作业调度算法
SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的
缺点:
- 必须预知作业的运行时间。
- 对长作业非常不利,长作业的周转时间会明显地增长。更严重的是,该算法完全忽视作业的等待时间,可能使作业等待时间过长,出现饥饿现象。
- 在采用FCFS算法时,人—机无法实现交互。
- 该调度算法完全未考虑作业的紧迫程度,故不能保证紧迫性作业能得到及时处理。
优先级调度算法和高响应比优先调度算法
优先级调度算法(priority-scheduling algorithm,PSA)
对于先来先服务调度算法,作业的等待时间就是作业的优先级,等待时间越长,其优先级越高。对于短作业优先调度算法,作业的长短就是作业的优先级,作业所需运行的时间越短,其优先级越高。但上述两种优先级都不能反映作业的紧迫程度。
在优先级算法中,基于作业的紧迫程度,由外部赋予作业响应的优先级,调度算法是根据优先级进行调度的。
高响应比优先调度算法(Highest Response Ratio Next,HRRN)
在高响应比优先调度算法中,为每个作业引入一个动态优先级,即优先级是可以改变的,令它随等待时间延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可描述为:
由于等待时间与服务时间之和就是系统对该作业的响应时间,故该优先级又相当于响应比RP。据此,优先权又可表示为:
例题
FCFS算法:
SJF算法:
HRRN算法:
进程调度
为了实现进程调度,在进程调度机制中,应具有如下三个基本部分:排队器、分派器、上下文切换器
进程调度方式
非抢占式方式
一旦把处理机分配给某进程后,就一直让它运行下去,决不会因为时钟中断或任何其它原因去抢占当前正在运行进程的处理机,直至该进程完成,或发生某事件而被阻塞时,才把处理机分配给其它进程。
抢占式方式
这种调度方式允许调度程序根据某种原则,去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。在现代OS中广泛采用抢占方式。
优点所在:
- 对于批处理机系统,可以防止一个长进程长时间地占用处理机,以确保处理机能为所有进程提供更为公平的服务。
- 在分时系统中,只有采用抢占方式才有可能实现人—机交互。
- 在实时系统中,抢占方式能满足实时任务的需求。但抢占方式比较复杂,所需付出的系统开销也较大。
轮转调度算法
在轮转(RR)法中,系统将所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔一定时间(如30 ms)便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,并令其执行一个时间片。
进程切换时机:
- 若一个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片。
- 在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送往就绪队列的末尾。
在轮转算法中,时间片的大小对系统性能有很大的影响。
例题
例:有一个内存中只能装入两道作业的批处理系统,作业调度采用短作业优先的调度算法,进程调度采用以优先数为基础的抢占式调度算法。有如下表所示的作业序列,表中所列的优先数是指进程调度的优先数,且优先数越小优先级越高。求:
(1)列出所有作业进入内存的时刻以及结束的时刻。
(2)计算作业的平均周转时间。
注意作业调度和进程调度采用算法的不同!
例:假设一个系统中有5个进程,它们的到达时间和服务时间如下表所示,忽略I/O以及其他开销时间,若分别按FCFS、非抢占及抢占的短作业优先(SIF)、高响应比优先(HRRN)、时间片轮转(RR,时间片=1)、多级反馈队列调度算法(FB, 第i级队列的时间片=2i-1)以及立即抢占的多级反馈队列调度算法(FB, 第i级队列的时间片=2i-1)进行CPU调度,请给出各进程的完成时间、周转时间、带权周转时间、平均周转时间和平均带权周转时间。
实时调度
最早截止时间优先EDF(Earliest Deadline First)算法
该算法是根据任务的截止时间确定任务的优先级,截止时间越早,优先级越高。
下图展示出了将该算法用于抢占调度方式之例。在该例中有两个周期任务,任务A和任务B的周期时间分别为20 ms和50 ms,每个周期的处理时间分别为10 ms和25 ms。
最低松弛度优先LLF(Least Laxity First)算法
算法在确定任务的优先级时,根据的是任务的紧急(或松弛)程度。任务紧急程度愈高,赋予该任务的优先级就愈高,以使之优先执行。
所谓松弛度,例如一个任务在200ms内必须完成,而他本身所需的运行时间为100ms,则该任务的**紧急程度(松弛度)**为100ms
该算法主要用于可抢占调度方式中。假如在一个实时系统中有两个周期性实时任务A和B,任务A要求每20 ms执行一次,执行时间为10 ms,任务B要求每50 ms执行一次,执行时间为25 ms。由此可知,任务A和B每次必须完成的时间分别为:A1、A2、A3、…和B1、B2、B3、…,见下图:
利用LLF算法进行调度的情况:
注意点:
- 该算法主要用于可抢占调度方式中,当一任务的最低松弛度减为0时,它必须立即抢占CPU,以保证按截止时间的要求完成任务。
- 计算关键时间点的各进程周期的松弛度,当进程在当前周期截止时间前完成了任务,则在该进程进入下个周期前,无需计算它的松弛度。
- 当出现多个进程松弛度相同且为最小时,按照“最近最久未调度”的原则进行进程调度。
例题
例:若有3个周期性任务,任务A要求每20ms执行一次,执行时间为10ms;任务B要求每50ms执行一次,执行时间为10ms;任务C要求每50ms执行一次,执行时间为15ms。应如何按最低松弛度优先算法对它们进行CPU调度?
解:
死锁概述
可抢占性资源和不可抢占性资源
可抢占性资源:
- 可把系统中的资源分成两类,一类是可抢占性资源,是指某进程在获得这类资源后,该资源可以再被其它进程或系统抢占。
不可抢占性资源:
- 另一类资源是不可抢占性资源,即一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。
死锁的定义、必要条件
死锁的定义
在一组进程发生死锁的情况下,这组死锁进程中的每一个进程,都在等待另一个死锁进程所占有的资源。
每个进程均占有其他进程所需的资源,同时又需要被其他进程所占有的资源。
产生死锁的必要条件
- 互斥条件:指在一段时间内,某资源只能被一个进程占用,如果此时还有其他的进程请求该资源,则该请求进程只能等待
- 请求和保持条件:若进程已保持了至少一个资源,又对其他资源发起请求,但被阻塞,但对自己保持的资源也不予释放。
- 不可抢占条件:进程已获得的资源不得被抢占,只能自己释放。
- 循环等待条件:多个进程循环等待一个资源。
避免死锁
银行家算法(重要)
银行家算法中的数据结构
- 可利用资源向量Available:该数组每一个元素代表系统中的一类可利用的资源数目
- 最大需求矩阵Max:这是个n*m的矩阵,代表系统中n个进程中每个进程对m类资源的最大需求量
- 分配矩阵Allocation:这是个n*m的矩阵,代表系统中每一类资源已经分配给每一个进程的资源数
- 需求矩阵Need:这是个n*m的矩阵,代表系统中每一个进程对每一类资源尚需的资源数
银行家算法
设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:
- (1) 如果Requesti[j]≤Need[i, j],便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
- (2) 如果Requesti[j]≤Available[j],便转向步骤(3); 否则,表示尚无足够资源,Pi须等待。
- (3) 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j] = Available[j] - Requesti[j];
Allocation[i, j] = Allocation[i, j] + Requesti[j];
Need[i, j] = Need[i, j] - Requesti[j];
- 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
安全性算法
(1) 设置两个向量:
- 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work:= Available;
- Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]:= false;当有足够资源分配给进程时,再令Finish[i]:= true。
(2) 从进程集合中找到一个能满足下述条件的进程:
- ① Finish[i]=false;
- ② Need[i, j]≤Work[j];
若找到,执行步骤(3),否则,执行步骤(4)。
(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
- Work[j] = Work[j]+Allocation[i, j];
- Finish[i] =true;
- go to step 2;
(4) 如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
例题+习题
例:假定系统中有五个进程{P0, P1, P2, P3, P4}和三类资源{A, B, C},各种资源的数量分别为10、5、7,在T0时刻的资源分配情况如图所示。
T0时刻的安全性:利用安全性算法对T0时刻的资源分配情况进行分析(如图3-16所示)可知,在T0时刻存在着一个安全序列{P1, P3, P4, P2, P0},故系统是安全的。
**银行家算法的安全序列唯一吗?如何快速找出?**不是唯一的!
怎么快速找出:
- 找所有进程中need最少的,然后看available是否满足,满足后此进程排第一
- 接着在找第二个need最少的,然后依次…
- 如果过程中发现不能满足need<available,则换一条路
- 这样就能快速找出一条序列
习题1
习题2