目录
1 处理机调度概述
在多道程序系统中,调度的实质是一种资源分配,处理机调度是对处理机进行分配。处理机调度算法是指根据处理机分配策略所规定的处理机分配算法。在多道批处理系统中,一个作业从提交到获得处理机执行,直至作业运行完毕,可能需要经历多级处理机调度。下面先来了解处理机调度的层次。
1.1 处理机调度的层次
1.1.1 高级调度 (长程调度/作业调度)
主要功能是根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进
程、分配必要的资源,并将它们放入就绪队列。
高级调度主要用于多道批处理系统中。
1.1.2 低级调度 (短程调度/进程调度)
其主要功能是,根据某种算法,决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。
低级调度是最基本的一种调度,在多道批处理、分时和实时系统中,都必须配置这种调度。
1.1.3 中级调度 (中程调度/内存调度)
引入中级调度的主要目的是提高内存利用率和系统吞吐量。
其主要功能是,把那些暂时不能运行的进程调至外存等待,此时进程的状态称为就绪驻外存状态(或挂起状态)。当具备运行条件且内存稍有空闲时,由中级调度来决定把外存上的那些已具备运行条件的就绪进程再重新调入内存,并修改它们的状态为就绪状态,挂在就绪队列上等待。
1.2 作业和作业调度
1.2.1 作业
作业是一个比程序更为广泛的概念,它不仅包含了通常的程序和数据,而且配有一份作业说明书,系统根据该说明书对程序的运行进行控制。在多道批处理系统中,会将作业作为基本单位从外存调入内存。
响应比=作业响应时间/作业执行时间= (作业执行时间+作业等待时间)/作业执行时间
1.2.2 作业控制块
作业控制块(job control block,JCB)是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。JCB中包含的内容通常有:作业标志、用户名称、用户账号、作业类型(CPU繁忙型、I/O繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业运行时间)、资源需求情况(预计运行时间、要求内存大小)、资源使用情况等
1.2.3 作业调度的主要任务
作业调度(接纳调度)的主要任务是,根据JCB中的信息,检查系统中的资源能否满足作业的需求,以及按照一定的调度算法从外存的作业后备队列中选取某些作业调入内存,并为它们创建进程和分配必要的资源,将新创建的进程排在就绪队列上等待调度。
在每次执行作业调度时都须做出以下两个决定:(1)接纳多少个作业(2)接纳哪些作业
1.3 进程调度
1.3.1 进程调度任务
①保存CPU现场信息。②按某种算法选取进程。③把CPU分配给进程。
1.3.2 进程调度机制
(1)排队器。为了提高进程调度的效率,应事先将系统中的所有就绪进程,按照一定的策
略排成一个或多个队列,以便调度程序能最快地找到它们。以后每当有一个进程转变为就绪状
态时,排队器便将它插入相应的就绪队列。
(2)分派器。分派器将进程调度程序所选定的进程从就绪队列中取出,然后进行从分派器
到新选进程间的上下文切换,以将CPU分配给新选进程。
(3)上下文切换器。在对处理机进行切换时,会发生两对上下文的切换操作:①第一对
上下文切换时,OS将保存当前进程的上下文,即把当前进程的CPU寄存器内容保存到该进程的
PCB内的相应单元,而装入分派程序的上下文,则可以方便分派程序运行;②第二对上下文切
换是移出分派程序的上下文,把新选进程的CPU现场信息装入CPU的各个相应寄存器中,以便
新选进程运行。
1.3.3 进程调度方式
(1)非抢占调度方式
在采用非抢占调度方式时,一旦把处理机分配给某进程,就会一直让它运行下去,而决
不会因为时钟中断或其他原因去抢占该进程的处理机,直至该进程完成或发生某事件而被阻塞
可能会引起进程调度的因素可归结为:①正在执行的进程运行完毕,或因发生某事件而使其无法继续运行;②正在执行的进程因提出I/O请求而暂停执行;③在进程通信或同步过程中执行了某种原语操作,如Block原语。
优点:实现简单、系统开销小,其适用于大多数批处理系统。
缺点:它不能用于分时系统和大多数实时系统。
(2)抢占调度方式。
抢占调度方式允许调度程序根据某种原则去暂停某个正在执行的进程,并将已分配给该进程
的处理机重新分配给另一进程。
优点:防止一个长进程长时间地占用处理机,以确保处理机能为所有进程提供更为公平的服务。在分时系统中,只有采用抢占调度方式才有可能实现人机交互。在实时系统中,抢占调度方式能满足实时任务的需求。
缺点:方式比较复杂,所须付出的开销也较大。
主要原则有:①优先级原则②短进程优先原则③时间片原则
1.4 处理机调度算法的目标
1.4.1 处理机调度算法的目标
(1)资源利用率 ![]()
(2)公平性
(3)平衡性
(4)策略强制执行
1.4.2 批处理系统中处理机调度算法的目标
(1)平均周转时间短
周转时间(作业周转时间),是指从作业被提交给系统开始到作业完成为止的这段时间间隔。
平均周转时间表示为: ![]()
平均带权周转时间可表示为:![]()
(2)系统吞吐量高
(3)处理机利用率高
1.4.3 分时系统中处理机调度算法的目标
(1)保证响应时间快。
(2)保证均衡性。
1.4.4 实时系统中处理机调度算法的目标
(1)保证满足截止时间的要求。
(2)保证可预测性。
2 调度算法
2.1 先来先服务调度算法
先来先服务(first come first server,FCFS)既可用于作业调度,也可用于进程调度。
系统将按照作业到达的先后次序来进行调度(优先考虑在系统中等待时间最长的作业),从就绪的进程队列中选择一个最先进入该队列的进程,并为之分配处理机,使之投入运行。在该进程一直运行到完成或发生某事件而阻塞后,进程调度程序才会将处理机分配给其他进程。
2.2 短作业优先调度算法
短作业优先(short job first,SJF)调度算法可以分别用于作业调度和进程调度。
作业调度:从外存的作业后备队列中选择估计运行时间最短的作业,并优先将它调入内存运行;
进程调度:从就绪队列中选择估计运行时间最短的进程,并为之分配CPU运行。
2.2.1 SJF 调度算法的缺点
①必须预先知道作业的运行时间。
②对长作业非常不利,长作业的周转时间会明显增长。完全忽视作业的等待时间,可能会出现饥饿现象。
③无法实现人机交互。
④没有考虑作业的紧迫程度。
2.3 优先级调度算法
2.3.1 优先级调度算法的类型
优先级调度算法,是把处理机分配给就绪队列中优先级最高的进程。
(1)非抢占式优先级调度算法。该算法规定,一旦把处理机分配给就绪队列中优先级最高
的进程,该进程便会一直执行下去直至完成,或者当该进程因发生某事件而放弃处理机时,系
统方可将处理机重新分配给优先级次高的进程。
(2)抢占式优先级调度算法。该算法规定,在把处理机分配给优先级最高的进程并使之执
行时,只要出现了另一个优先级更高的进程,调度程序就会将处理机分配给新到的优先级更高
的进程。常用于对实时性要求较高的系统中。
2.3.2 优先级的类型
- 静态优先级
静态优先级是在创建进程时确定的,其在进程的整个运行期间保持不变。
确定进程优先级大小的依据:①进程类型②进程对资源的需求③用户要求
优点:简单易行,系统开销小,
缺点:不够精确,可能会出现优先级低的进程长期未被调度的情况。
(2)动态优先级。动态优先级是指在创建进程之初,先赋予进程一个优先级,然后优先
级会随进程的推进或等待时间的增加而改变,以便获得更好的调度性能。
优点:当采用抢占式优先级调度算法时,若再规定当前进程的优先级随运行时间的推移而下降,则可防止一个长作业长期垄断处理机。
2.3.3 高响应比优先调度算法
高响应比优先(highest response ratio next,HRRN)调度算法是优先级调度算法的一个特例,通常用于作业调度。
优点:HRRN调度算法则是既考虑了作业的等待时间,又考虑了作业的运行时间,因此其既照顾了短作业,又不会致使长作业的等待时间过长,从而改善了处理机调度的性能。
缺点:每次调度之前都需要先计算响应比,会增加系统的开销。
2.4 轮转调度算法
在分时系统中,最简单也是较常用的进程调度算法是基于时间片的轮转(round robin,RR调度算法。该算法采取了非常公平的处理机分配方式,即让就绪队列上的每个进程每次仅运行一个时间片。如果就绪队列上有n个进程,则每个进程每次大约可获得1/n的处理机时间。
2.4.1 基本原理
在RR调度算法中,系统会将所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每
隔一定时间(如30ms)便产生一次中断,去激活进程调度程序进行调度,把处理机分配给队首
进程,并令其执行一个时间片。当它运行完后,再把处理机分配给就绪队列中新的队首进程,
同样地让它也执行一个时间片。这样,就可以保证就绪队列中的所有进程,在确定的时间段
内,都能获得一个时间片的处理机时间。
2.4.2 进程切换时机
①若一个时间片尚未用完而正在运行的进程便已经完成,则立即激活调度程序,将已经运行完成的进程从就绪队列中删除,再调度就绪队列中新的队首进程运行,并启动一个新的时间片。
②当一个时间片用完时,计时器中断处理程序会被激活,此时,如果进程尚未运行完毕,调度程序就把它送往就绪队列的末尾。
3.时间片大小的确定
在RR调度算法中,时间片的大小对系统性能有很大的影响。若选择很小的时间片,则将有
利于短作业,因为它能在该时间片内完成。但是,若时间片选择得太小,则意味着系统会频繁
地执行进程调度和进程上下文的切换,这无疑会增加系统的开销;若时间片选择得太大,且为
使每个进程都能在一个时间片内完成,RR调度算法便会退化为FCFS调度算法,无法满足短作业
和交互式用户的需求。一个较为可取的时间片大小是略大于一次典型的交互所需要的时间,使
大多数交互式进程能在一个时间片内完成,从而可以获得很小的响应时间。

2.5 多级队列调度算法
多级队列调度算法将系统中的进程就绪队列从一个拆分为若干个,将不同类型或性质的进程固定分配在不同的就绪队列,不同的就绪队列采用不同的调度算法,一个就绪队列中的进程 可以设置不同的优先级,不同的就绪队列本身也可以设置不同的优先级。
2.6 多级反馈队列调度算法
多级反馈队列(multileved feedback queue)调度算法,不必事先知道各种进程所需的执行时间,还可以较好地满足各种进程的需要,因而它是目前公认的一种较好的进程调度算法。
1.多级反馈队列调度算法的调度机制
(1)设置多个就绪队列。
(2)每个队列都采用FCFS调度算法。
(3)按队列优先级调度。
2.多级反馈队列调度算法的性能
在多级反馈队列调度算法中,如果规定第一个队列的时间片略大于多数人机交互所需的处
理时间,则能较好地满足各类用户的需要。①终端型用户。由于终端型用户提交的作业多属于
交互型作业,通常较小,系统只要能使这些作业在第一队列规定的时间片内完成,便可使终端
型用户感到满意。②短批处理作业用户。对于这类作业,如果可在第一队列中执行完成,则能
获得与终端型作业一样的响应时间。对于稍长的短作业,也只须在第二和第三队列各执行一个
时间片即可完成,其周转时间仍然较短。③长批处理作业用户。对于这类作业,其将依次在第
1, 2, …, n个队列中运行,然后再按RR方式运行,用户不必担心其作业长期得不到处理。
2.7 基于公平原则的调度算法
1.保证调度算法
保证调度算法明确的性能保证,该算法可以做到调度的公平性。
在实施公平调度算法时,系统必须具有下列功能:①跟踪计算每个进程自创建以来已经执
行的处理时间;②计算每个进程应获得的处理机时间,即自创建以来的时间除以n;③计算进
程获得处理机时间的比率,即进程实际执行的处理时间和应获得的处理机时间之比;④比较各
进程获得处理机时间的比率;⑤调度程序应选择比率最小的进程,将处理机分配
给它,并让它一直运行,直到它的比率超过最接近它的进程的比率为止。
2.公平分享调度算法
在公平分享调度算法中,调度的公平性主要是针对用户的,即所有用户能获得相同的处理
机时间或所要求的时间比例。调度以进程为基本单位,必须考虑每个用户所拥有
的进程数目。
3 死锁
3.1 死锁的定义
如果一组进程中的每个进程都在等待仅由该组进程中的其他进程才能引发的事件发生,那么该
组进程是死锁的。
3.2 产生死锁的四个必要条件
只要其中任意一个条件不成立,死锁就不会发生。
(1)互斥条件。进程对所分配到的资源进行排他性使用,即在一段时间内,某资源只能被
一个进程占用。如果此时还有其他进程请求该资源,则请求进程只能等待,直至占有该资源的
进程用毕释放。
(2)请求和保持条件。进程已经占有了至少一个资源,但又提出了新的资源请求,而该被
请求的资源已被其他进程占有,此时请求进程被阻塞,同时其对自己已占有的资源保持不放。
(3)不可抢占条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时
由其自己释放。
(4)循环等待条件。该条件指在发生死锁时,必然存在一个“进程—资源”循环链,
即进程集合{P0, P1, P2, …, Pn}中的P0正在等待已被P1占用的资源,P1正在等待已被P2占用的资
源,……,Pn正在等待已被P0占用的资源。
3.3 死锁的处理方法
3.3.1 预防死锁
这是一种较简单和直观的事先预防方法。该方法是通过设置某些限制条 件,去破坏产生死锁的4个必要条件中的一个或几个来预防死锁的。预防死锁是一种较易实现的方法,已被广泛使用。
3.3.1.1 破坏“请求和保持”条件
为了能够破坏“请求和保持”条件,系统必须保证做到:当一个进程在请求资源时,它不能持有不可抢占资源。
3.3.1.2 破坏“不可抢占”条件
为了能破坏“不可抢占”条件,协议中规定,当一个已经保持了某些不可抢占资源的进程提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着进程已占有的资源会被暂时释放,或者说是被抢占了,从而破坏了“不可抢占”条件。
3.3.1.3 破坏“循环等待”条件
一个能保证“循环等待”条件不成立的方法是,对系统的所有资源类型进行线性排序,并赋予它们不同的序号。这种预防死锁策略和前两种策略相比,其资源利用率和系统吞吐量都有比较明显的改善。
3.3.2 避免死锁
该方法同样属于事先预防方法,但它并不需要通过事先采取各种限制措施来破坏产生死锁的4个必要条件,而是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免发生死锁。
3.3.3 检测死锁
这种方法无须事先采取任何限制性措施,允许进程在运行过程中发生死
锁。但可通过检测机构及时地检测出死锁的发生,然后采取适当措施把进程从死锁中解脱出来。
3.3.4 解除死锁
该方法是指,当检测到系统中已发生死锁时就采取相应措施,将进程从死锁状态中解脱出来。通常采用的措施是撤销一些进程,回收它们的资源,将回收的资源分配给已处于阻塞状态的进程,使这些进程能够继续运行。
上述4种方法,从(1)到(4)对死锁的防范程度逐渐减弱,但对应的资源利用率却逐渐提高,且进程因资源因素而阻塞的频度逐渐下降(即进程并发程度逐渐提高)。
3.4 系统安全状态
在避免死锁方法中,把系统的状态分为安全状态和不安全状态两种。当系统处于安全状态
时可避免发生死锁,而当系统处于不安全状态时,则可能会进入死锁状态。
1.安全状态
在避免死锁方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此
次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则可将资源分配给进程,否
则,令进程等待。所谓安全状态,是系统能按某种进程推进顺序(P1, P2, …, Pn),为每个进程
Pi分配其所需的资源,直至满足每个进程对资源的最大需求,进而使每个进程都可顺利完成的一
种系统状态。此时,称进程推进顺序(P1, P2, …, Pn)为安全序列。如果系统无法找到这样一个
安全序列,则称系统处于不安全状态。虽然并非所有不安全状态都必然会转为死锁状态,但当
系统进入不安全状态后,就有可能进入死锁状态。而只要系统处于安全状态,其就不会进入死
锁状态。因此,避免死锁的实质在于,使系统在进行资源分配时不进入不安全状态。
·如果不按照安全序列分配资源,则系统可能会由安全状态进入不安全状态。
3.5 利用银行家算法避免死锁
3.5.1 算法中的数据结构
为了实现银行家算法,必须在系统中设置4个数据结构,它们分别描述:系统中可利用的资
源、所有进程对资源的最大需求、系统中的资源分配情况以及所有进程还需要多少资源。
(1)可利用资源向量Available。
这是一个含有m个元素的数组,其中的每个元素代表一类可利用的资源数目,其初值是系统中所配置的该类全部可用资源的数目,该数目会随对应资源的分配和回收而动态改变。如果Available[ j]=K,则表示系统中现有Rj类资源K个。
(2)最大需求矩阵Max。
这是一个n×m的矩阵,它定义了系统中n个进程中的每个进程对m类资源的最大需求。如果Max[i, j]=K,则表示进程i需要Rj类资源的最大数目为K。
(3)分配矩阵Allocation。
这是一个n×m的矩阵,它定义了系统中每类资源当前已分配给每一进程的资源数。如果Allocation[i, j]=K,则表示进程i当前已分得Rj类资源的数目为K。
(4)需求矩阵Need。
这是一个n×m的矩阵,用于表示每个进程尚需的各类资源数。如果Need[i, j]=K,则表示进程i还需要Rj类资源K个方能完成其任务。
上述3个矩阵间存在下列关系: Need[i, j]=Max[i, j]-Allocation[i, j]
3.5.2 银行家算法
设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]。
(4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若是,则正式将
资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状
态,让进程Pi等待。
3.5.3 安全性算法
系统所执行的安全性算法可描述如下。
(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,则表示系统处于安全状态;否则,系统处于不
安全状态。
3.5.4 银行家算法举例
(1)t0时刻的安全性:利用安全性算法对t0时刻的资源分配情况进行分析可知,在t0时刻存在着一个安全序列{P1, P3, P4, P2, P0},故系统是安全的。如下图所示:
4 相关例题
4.1 选择题
4.2 填空题
4.3 简答题
答:如果一组进程中的每个进程都在等待仅由该组进程中的其他进程才能引发的事件发生,那么该组进程是死锁的。产生死锁的四个必要条件是:资源互斥使用、保持和等待、非剥夺性、循环等待。
4.4 计算题
1、在单 CPU环境下,设有 4 道作业,它们的提交时间及执行时间(单位:小时)如下:

答:1. 若采用先来先服务调度算法,则其调度顺序为 1、2、3、4。
平均周转时间= (2.0 +2.8 +3.l +3.3)/4 =2.8平均带权周转时间= (l.0 +2.8 +6.2 +11.0)/4 =5.252.若采用短作业优先调度算法,则其调度顺序为 1、4、3、2。![]()
平均周转时间= (2.0+l.8+2.4+3.6)/4=2.45平均带权周转时间= (1.0+6+4.8+3.6)/4=3.85
2、在银行家算法中,若出现下述的资源分配情况:
| Process | Allocation | Need | Available |
| A B C D | A B C D | A B C D | |
| P0 | 0 0 3 2 | 0 0 1 2 | 1 6 2 2 |
| P1 | 1 0 0 0 | 1 7 5 0 | |
| P2 | 1 3 5 4 | 2 3 5 6 | |
| P3 | 0 3 3 2 | 0 6 5 2 | |
| P4 | 0 0 1 4 | 0 6 5 6 |
该系统是否安全?如果进程P2此时提出资源申请(1,2,2,2),系统能否将资源分配给它?为什么?
答:1. 如图,在当前这一时刻,存在一安全序列<P0,P3,P1,P2,P4>,所以当前状态是安全的。
进程
Work
Need
Allocation
Work+Allocation
Finish
A B C D
A B C D
A B C D
A B C D
P0
1 6 2 2
0 0 1 2
0 0 3 2
1 6 5 4
T
P3
1 6 5 4
0 6 5 2
0 3 3 2
1 9 8 6
T
P1
1 9 8 6
1 7 5 0
1 0 0 0
2 9 8 6
T
P2
2 9 8 6
2 3 5 6
1 3 5 4
3 12 13 10
T
P4
3 12 13 10
0 6 5 6
0 0 1 4
3 12 14 14
T
2.若进程p2提出请求Request(1,2,2,2):
Request(1,2,2,2)〈Need(2,3,5,6), Request(1,2,2,2)〈Available(1,6,2,2),
可尝试分配给P2,Need变为(1,1,3,4),Allocation变为(2,5,7,6),Available变为 (0,4,0,0),Available=0 4 0 0,已经不能满足P0、P1、 P2、 P3、 P4的任何请求, 造成死锁。所以不能分配给P2。



676

被折叠的 条评论
为什么被折叠?



