1、处理机调度与死锁第三章 处理机调度与死锁第1节 处理机调度引论作业、进程状态及其转换图一、处理机的分级调度1、从上图中可以看出:(1) 一个用户作业从建立到最后执行(正常或非正常)结束,中间可能要经历各种处理机调度。(2) 系统的调度是分层次的。2、处理机调度的层次一般来说,处理机调度可分为4级:作业调度、交换调度、进程调度、线程调度。(1) 作业调度(高级调度) -P85在每次执行作业调度时,都须做出以下两个决定: 接纳多少个作业 接纳哪些作业(2) 进程调度(低级调度) -P85根据算法,确定就绪队列中哪个进程应该获得处理机,然后再由分派程序执行把处理机分配给该进程的具体操作(进程切换)。
2、(3) 交换调度(中级调度)为了提高内存利用率和系统吞吐量,应使那些暂时没机会运行的进程不再占用宝贵的内存资源,而将它们调至外存上去等待,把此时的进程状态称为就绪驻外存状态或挂起状态;当挂起进程重又具备运行条件、且内存又稍有空闲时,由中级调度来决定把外存上的那些又具备运行条件的就绪进程,重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待进程调度。在以上三级调度中:交换调度主要涉及内存管理和扩充,一般将它归于存储管理中;一般只在多道批处理系统中才有作业调度,而在分时和实时系统中一般只有进程调度、交换调度和线程调度;其中,进程调度是最基本的调度,是OS处理机调度中主要讨论的内容。二、选择/设
3、计调度方式和调度算法的原则以下列举的是设计OS处理机调度的一系列原则,有的是面向用户的,有的是面向系统的。在设计OS时,选择什么样的调度方式和调度算法,取决于系统的设计目标和OS的类型。通常要在面向系统和面向用户的各原则之间选择并取得平衡。1、面向用户的原则(1) 周转时间短原则 周转时间T:作业完成时间 作业提交时间可把n个作业(一批作业)的平均周转时间描述为: 带权周转时间:作业的周转时间T与系统为它提供服务的时间TS(单道环境作业需要的运行时间)之比,即:W=T / TS。而n个作业的平均带权周转时间则可表示为:平均带权周转时间能更公平地描述系统的性能。(2) 响应时间快原则 -P87(
4、3) 截止时间有保证原则 -P87(4) 优先权准则采取策略,让某些紧急、重要的任务能及时得到处理。2、面向系统的原则(1) 系统高吞吐量原则(与周转时间短原则一致)(2) 处理机高利用率原则 -P86(3) 各类资源平衡利用原则 -P86(4) 公平性原则 -P86(5) 策略强制执行原则 -P86第2节 作业与作业调度一、作业的概念在多道批处理系统中,我们讨论作业调度的问题。1、什么是作业 P87-882、作业控制块JCB是系统管理作业的数据结构,在系统收容一个作业时被创建。其中包含的内容: -P883、作业运行的三种状态 -P88二、作业调度的主要任务 -P89三、作业调度算法1、先来先
5、服务算法(FCFS/FIFO)它是一种简单的、基础的算法,既可以用在作业调度,也可以用在进程/线程调度。它优先考虑在系统中等待时间最长的作业(进程)。算法描述:OS的调度程序每次从后备(就绪)队列中选取一组(一个)最先进入队列的作业(进程),将其读入内存,建立进程,插入就绪队列(为之分配处理机使之投入运行,该进程一直运行直到完成或因某事件而进入阻塞)。进程FCFS算法举例:它比较有利于长作业(进程),而不利于短作业(进程)。这种算法常和其他算法结合使用。2、短作业(进程)优先调度算法(SJF)类似FCFS,它既可以用在作业调度,也可以用在进程/线程调度。算法描述:OS的调度程序每次从后备(就绪
6、)队列中选取一组(一个)估计运行时间最短的作业(进程),将其读入内存,建立进程,插入就绪队列(为之分配处理机使之投入运行,该进程一直运行直到完成或因某事件而进入阻塞)。它是一种有利于短作业(进程)的调度算法。它能有效地提高系统的吞吐量和平均带权周转时间。但是,它也存在不容忽视的缺点:(1) 对长作业(进程)不利:会增加长作业(进程)的带权周转时间,更严重的是,如果有一长作业(进程)进入系统的后备队列(就绪队列),由于调度程序总是优先调度那些短作业(进程),即使是后进来的,将导致长作业(进程)长期不被调度(进程饥饿)。(2) 必须预知作业(进程)的运行时间。由于作业(进程)的长短只是根据用户所提
7、供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。(3) 该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理。第3节 进程调度一、关于进程调度1、进程调度的任务 -P912、进程调度机制 排队器:按算法将就绪进程组织成一个或几个队列; 分派器:摘下排在队列最前面的一个进程; 上下文切换器:实施进程上下文切换。进程调度机制示意图3、进程调度方式进程调度进一步分为抢占式和非抢占式两种调度方式。 非抢占方式(Non-preemptive Mode)一旦OS将处理机分配给某进程,便让该进程一直执行,直到该进程完
8、成或因某事件而阻塞,主动放弃处理机时,进程调度程序才被激活,去完成将处理机分配给其他进程的工作。不允许某进程抢占已经分配出去的处理机。在采用非抢占调度方式时,可能引起进程调度的因素可归结为这样几个: 正在执行的进程执行完毕,或因发生某事件而不能再继续执行; 执行中的进程因提出I/O请求而暂停执行; 在进程通信或同步过程中执行了某种原语操作,如P操作等。这种调度方式的优点是实现简单、系统开销小,适用于大多数的批处理系统环境。但它难以满足紧急任务的要求-立即执行,因而可能造成难以预料的后果。显然,在有比较严格的实时要求的系统(包括分时系统)中,不宜采用这种调度方式。 抢占方式(Preemptive
9、 Mode)允许OS的调度程序根据某种原则,暂停某个正在正常执行的进程(将它送回就绪队列),将已经分配给该进程的处理机收回,重新分配给另一个进程。抢占原则有: -P92 优先权原则 短进程优先原则 时间片原则二、进程调度算法1、基于时间片的轮转调度算法(RR)基本思想:把CPU的时间划分成一定长度的时间片,并且按顺序赋给就绪队列中的每一个进程,使进程轮流占有CPU。当一个进程的本轮时间片用完时,OS的进程调度程序被激活,去剥夺执行进程的CPU使用权,将该进程送回就绪队列;再去调度另一个进程运行。简单轮转法算法描述:系统将所有就绪进程按FCFS规则排队;将处理机时间分成等长的时间片,将时间片轮流
10、分配给就绪队列中的进程。这样,在一段时间内,就绪队列中所有进程均有机会获得一个时间片的处理机时间来运行。在简单轮转法中,时间片长度的选取非常重要,它会直接影响系统开销和响应时间。 -P93与时间片大小有关的因素: 系统响应时间要求 就绪进程个数 CPU能力2、优先权调度算法优先权:进程使用CPU的紧迫程度。(1) 非抢占式优先权算法算法描述:系统把处理机分配给优先权最高的就绪进程,该进程将一直执行下去,直至完成、或因发生某事件使该进程放弃处理机,系统方可再将处理机重新分配给下一优先权最高的就绪进程。这种调度算法主要用于批处理系统中;也可用于某些对实时性要求不严的实时系统中。(2) 抢占式优先权
11、算法算法描述:系统把处理机分配给优先权最高的就绪进程,使之执行。在其执行期间,只要又有另一个优先权更高的进程到达就绪队列,调度程序就立即停止当前进程(原优先权最高的进程)的执行,将其送回就绪队列,然后将处理机分配给新到达的优先权最高的进程。在采用这种调度算法时,每当系统中有新进程i到达就绪队列时,OS的进程调度程序被激活,它将i的优先权Pi与正在执行的进程j的优先权Pj进行比较。如果PiPj,原进程j便继续执行,新到进程i插入就绪队列;但如果是PiPj,则立即停止j进程的执行,做进程切换,使i进程投入执行。显然,这种抢占式的优先权调度算法,能很好地满足紧迫作业的要求,故而常用于要求比较严格的实
12、时系统中,以及对性能要求较高的批处理和分时系统中。3、优先权的确定(1) 静态优先权静态优先权是在创建进程时确定的,且在进程的整个运行期间保持不变。一般地,优先权是利用某一范围内的一个整数来表示的,例如,07或0255中的某一整数, 又把该整数称为优先数。一般数字越大优先权越高,也可以反过来。确定进程优先权的依据有如下三个方面: -P94 进程类型。 进程对资源的需求。 用户要求(应用的需求)。(2) 动态优先权优先权可以是静态的,也可以是动态的。动态优先权是指,在创建进程时赋予优先权初值,进程优先权可以随进程的推进或随其等待时间的增加而变化的,以便获得更好的调度性能。每次调度前OS计算就绪队
13、列中所有进程的优先权,将优先权最高的进程投入运行。 (3) 动态优先级调度举例-高响应比优先调度算法优先权的变化规律可描述为响应比,这种动态优先权的定义,可以兼顾系统和用户两方面:= 1 + 等待时间/要求服务时间 如果进程的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而该算法有利于短作业和提高系统吞吐量。 当要求服务的时间相同时,进程的优先权决定于其等待时间,等待时间愈长,其优先权愈高,因而它实现的是先来先服务。 对于长进程,进程的优先级可以随等待时间的增加而提高,当其等待时间足够长时,优先级便可升到很高,从而也可获得处理机,不会出现进程饥饿。动态优先权调度算法,结合抢占式调度方式,
14、可获得较好的调度性能。4、多级反馈轮转法多级反馈队列调度算法示意图算法描述:在内存中设置多个就绪队列,每个就绪队列按FCFS的方式组织;每个就绪队列被赋予不同的优先级和不同长度的时间片,优先级最高的第一级队列,时间片最小。随着优先级的降低,队列的时间片逐步加大(就绪队列再按优先权排队)。调度: 一个新创建的就绪进程,进入第一级队列; 调度从第一级队列开始。如果第一级队列空,就去调度第二级队列,如此类推;(调度总是发生在目前优先级最高的非空队列上) 当时间片到后,没有执行完的运行态进程被剥夺CPU,插入下一级就绪队列末尾; 等待队列中的阻塞进程,一旦等待的事件发生,则回到原来的就绪队列末尾; 当
15、有一个优先级更高的进程就绪时,可以抢占CPU,被抢占的进程回到原来的就绪队列末尾。算法的性能分析:这是简单时间片轮转+静态优先权调度+抢占式策略的算法。 所有类型的用户进程都会在很短的时间内启动,并会有所响应; 终端型用户进程、短批处理作业的进程,能在较短的时间内完成; 系统吞吐率高; 长进程,能够最终得到处理。第4节 实时调度一、实时调度的特点1、实时系统:要求计算机在用户任务允许的时限范围内给出响应信号。2、实时事件的分类:可分为硬实时任务和软实时任务。其中,前者要求计算机系统必须在给定的截止时限内完成(开始)任务,后者允许计算机系统在给定的时限左右处理完毕,可以有一定的延时。二、实现实时
16、调度的基本条件1、提供必要的信息(首次就绪时间、开始截止时间/完成截止时间、处理时间、资源要求、优先级) -P97-982、系统处理能力强(系统可能调度) -P983、一般采用抢占式调度机制4、具有快速切换机制 -P98三、实时调度算法的分类1、非抢占式调度算法: 非抢占式轮转调度算法 非抢占式优先权调度算法2、抢占式调度算法: 基于时钟中断的抢占式优先权调度算法 -P99 立即抢占优先权调度算法 -P99四、常用实时调度算法(一般都是优先权调度算法,只是确定优先权的策略不同)1、最早(开始)截止时间优先(EDF)算法 P99图 3-6 EDF算法用于非抢占调度方式2、最低松弛度优先(LLF)
17、算法进程“松弛度”的定义:松弛度 = 完成截止时刻 当前时刻 进程还需要的运行时间松弛度反映了任务的紧迫程度。此算法是根据任务紧迫(或松弛)的程度,来确定任务的优先级(是动态的)。它主要用于抢占调度方式中。每当CPU空出、有新就绪进程进入或到达时间单位时计算各进程的松弛度。图 3-8 A和B任务每次的完成截止时间例如:如图3-8,在一个实时系统中,有两个周期性实时任务A和B,任务A要求每 20 ms执行一次,执行时间为 10 ms;任务B只要求每50 ms执行一次,执行时间为 25 ms。在刚开始时(t1=0),A1必须在20ms时完成,而它本身运行又需10 ms,可算出A1的松弛度为10ms
18、;B1必须在50ms时完成,而它本身运行就需25 ms,可算出B1的松弛度为25 ms,故调度程序应先调度A1执行。在t2=10 ms时,A2的松弛度可按下式算出:A2的松弛度 = 完成截止时间-本身的运行时间-当前时间 = 40 ms-10 ms-10 ms = 20 ms 类似地,可算出B1的松弛度为15ms,调度程序应选择B1运行。t3=30 ms时,A2的松弛度已减为0,B1的松弛度为15 ms,于是调度程序应抢占B1的处理机而调度A2运行.图 3-8 利用ELLF算法进行调度的情况根据系统的情况,每隔10ms,或CPU空闲时,系统计算一次所有就绪、执行状态进程的松弛度,再采用抢占式调
19、度。从以上讨论可以看出,抢占式动态优先级调度算法可以较好地满足实时系统的要求,但计算进程的优先级,会占用较大的系统开销,因此要求系统有较强的能力。五、关于优先级倒置及其解决方案1、优先级倒置的形成: P102-103,图3-10优先级低的反而先执行-低优先级进程由于先占用了高优先级进程所需的临界资源,而阻塞高优先级进程,这样就会出现“优先级倒置”现象。如果阻塞时间延长,实时进程可能会错过其实时规定的期限,有较大的危害。2、优先级倒置的解决方案(1) 当进程进入临界区后,CPU就不能被剥夺;(2) 优先级继承:当优先级高的进程A被阻塞在资源X的临界区外时,已分配到资源X、优先级低的进程B自动继承
20、A的高优先级,能尽早运行完毕,释放资源X,使得A尽快有机会运行。 P102,图3-11第5节 死锁产生的原因和必要条件一、死锁的定义1、死锁的引例: 设系统有一台打印机(R1)一台扫描仪(R2),两进程共享这两台设备。 用信号量S1表示R1是否可用,用信号量S2表示R2是否可用, S1、S2初值为1。(R1和R2都是非剥夺性资源)这两个进程在并发执行过程中,可能会发生死锁。(Why?) 能避免死锁的发生吗?(How?)2、死锁的定义指多个进程由于竞争资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进。即:一组并发进程中,每个进程都在无限等待被该组中另一进程所占有的资源,因而都永
21、远无法得到所需资源、向前推进,这种现象称为进程死锁,这一组进程就被称为死锁进程。陷入死锁状态的进程称为死锁进程,而需要死锁进程已占用的资源或者需要与它们进行某种合作的其它进程就会相继陷入死锁,大量系统资源浪费,最终可能导致整个系统处于瘫痪状态。3、资源的分类 根据使用性质:可剥夺性资源和不可非剥夺性资源。 根据使用方式:共享资源和独占资源。 根据使用期限:永久(可再用)资源和临时性(可消耗性)资源。二、产生死锁的原因1、资源竞争系统提供的某类资源个数少于并发进程所需要的该类资源的总数,引起它们对资源的竞争而产生死锁,这是死锁产生的根本原因。 (1) 竞争非剥夺性资源造成死锁 P106图3-12
22、(2) 竞争临时性资源 P106图3-132、进程间推进顺序不当 P107进程在运行过程中,请求和释放资源的顺序不当,导致进程死锁。图 3-14 进程推进顺序对死锁的影响三、产生死锁的必要条件 P107-1081、互斥条件2、不可剥夺条件3、请求和保持(部分分配)条件4、环路等待条件当以上4个条件中有一个不满足,死锁就可以解除。四、处理死锁的基本方法 P1081、预防死锁2、避免死锁3、检测死锁4、解除死锁第6节 死锁的预防与避免一、预防死锁在系统设计时确定资源分配算法,设定限制,破坏产生死锁的四个必要条件之一。 资源一次性分配;(第一种协议P108) 用完前面的、释放,再分配后面的;(第二种
23、协议P109)以上两种方法,旨在破坏请求和保持条件。 资源可剥夺;即当某进程新申请的资源得不到满足时释放已占有的资源(破坏不可剥夺条件) 资源有序分配;系统给每类资源赋予一个编号,每一个进程按编号递增的顺序申请得到资源(破坏环路等待条件)二、避免死锁1、避免死锁的定义(方法的总体思想)系统的初始状态是一个安全状态;在系统运行过程中,OS对进程发出的每一次系统目前能够满足的资源申请进行动态检查,判断:资源分配后系统是否会进入不安全状态,从而决定是否进行本次资源分配。若分配后系统会进入不安全状态,则这次资源分配暂不进行,而提出资源申请的进程进等待队列;否则就进行分配。这样,系统在每次资源分配完成后
24、,都还处于安全状态。2、安全状态与不安全状态安全状态是指,对于系统中的所有并发进程,系统能按某种进程推进顺序(存在一个进程安全推进序列)来为每个进程分配其所需资源,直至进程的最大需求,使每个进程都可顺序完成。若系统当前不存在这样一个进程序列,则称系统处于不安全状态。(1) 安全序列-是一个进程推进运行的序列一组有n个并发进程。一个进程推进序列P1,P2 ,P3 , ,Pn是安全的,即:在这一时刻,对于序列中每一个进程Pi(1in),它继续运行直到完成尚需要的资源量,不超过:系统当前剩余资源量 + 排在它前面的所有进程当前占有资源量之和。当系统中的所有并发进程目前存在一个进程推进的安全序列,系统
25、就处于安全状态;否则,就处于不安全状态。(2) 安全序列和安全状态举例假定系统中有三个并发进程A、B和C,共有12台磁带机。进程A总共要求10台磁带机,B和C分别要求4台和9台。假设在T0时刻,进程A、B和C已分别获得5台、2台和2台磁带机,尚有3台空闲。(状态如下表所示)显然,此时刻存在一个安全序列BAC。3、由安全状态向不安全状态的转换如果不按照安全序列分配资源、推进进程,系统就可能会由安全状态进入不安全状态。例如,在T0时刻以后,C又请求1台磁带机,若此时系统把剩余3台中的1台分配给C,则系统便进入不安全状态。因为,此时也无法再找到一个安全序列。例如,把其余的2台分配给B,这样,B在完成
26、后只能释放出4台,既不能满足A尚需5台的要求,也不能满足C尚需6台的要求,致使它们都无法推进到完成,彼此都在等待对方释放资源,即陷入僵局,结果导致死锁。安全状态与不安全状态:安全状态、不安全状态、死锁状态4、避免死锁的银行家算法该算法综合考虑,给n个并发执行的进程分配m类临界资源,每类资源可能有若干个。(1) 算法中的数据结构 可利用资源向量Available这是一个含有m个元素的一维数组,其中的每一个数组元素代表系统中某一类资源当前的空闲数目。其初始值是系统中所配置的该类全部可用资源的数目;其数值随该类资源的分配和回收而动态地改变。如Availablej = K,则表示系统中目前j类资源空闲
27、K个。 最大需求矩阵Max矩阵的每一行是一个进程的最大需求向量,它的第j个元素代表这个进程运行完成需要j类资源的最大数量;如果Maxi,j = K,则表示进程i需要j类资源的最大数目为K。由系统中目前并发执行的n个进程的最大需求向量组成Max,这是一个nm的矩阵。它定义了系统中n个进程中的每一个进程对系统的m类资源的最大需求。 已分配矩阵Allocation矩阵的每一行是一个进程的已分配资源向量,它的第j个元素代表目前系统已经分配给该进程j类资源的数量;如果Allocationi,j = K,则表示进程i当前已获得j类资源的数目为K。由系统中目前并发执行的n个进程的已分配资源向量组成Alloc
28、ation,这也是一个nm的矩阵。它定义了系统中每一类资源当前已分配给每一进程的资源数。 需求矩阵Need矩阵的每一行是一个进程的还需要资源向量,它的第j个元素代表该进程继续运行至完成还需要j类资源的数量;如果Needi,j=K,则表示进程i还需要j类资源K个,方能完成其任务。这也是一个nm的矩阵,用以表示每一个进程尚需的各类资源数。上述三个矩阵存在如下关系:Needi,j= Maxi,j Allocationi,j以上四个数据结构描述了系统当前资源分配的一个状态。 资源请求向量Requesti进程i的一次资源请求用资源请求向量Requesti来描述。如果Requestij = K,表示这一次
29、请求中,进程i申请j类型的资源K个。(2) 银行家算法每当进程i发出一个资源请求后(对应地,有一个请求向量Requesti) ,系统按下述步骤进行检查:步骤1:检查请求的合理性:如果Requestij Needi,j,则合理,转向步骤2;否则认为出错,因为它所申请的资源数已超过它所宣布的最大值;步骤2:检查请求的可行性:如果Requestij Availablej,便转向步骤3;否则,表示系统目前尚无足够资源,进程i须等待;步骤3:系统对进程i进行资源预分配-修改下面数据结构中的数值:Availablej= Availablej - Requestij;Allocationi,j= Alloc
30、ationi,j + Requestij;Needi,j= Needi,j - Requestij;步骤4:调用安全性检查算法,检查此次资源预分配后,系统是否仍处于安全状态。若是,才正式将资源分配给进程i,以完成本次分配;否则,将本次的预分配作废,撤消步骤3对数据结构的修改(做步骤3计算的逆运算),恢复原来的资源分配状态,让进程i等待。(3) 关于银行家算法的总结描述: 收到一次资源请求; 验证该请求的合理性;如果不合理,申请资源进程被报错; 验证该请求的可行性;如果不可行,申请资源进程进入等待队列; 预分配资源(只修改资源描述的数据结构,不真正分配资源); 调用安全性检查算法,检查预分配后系统状态的安全性; 如果安全,真正实施资源分配;如果不安全,取消预分配,申请资源进程进入等待队列。(4) 安全性检查算法-通过找一个安全序列,判断系统目前是否安全:步骤1:另设置两个向量,并给它们赋初值:1 工作向量Work,它是一个含有m个分量的一维数组,它表示系统目前可提供给进程继续运行使用的各类资源(空闲的)数目,在开始执行安全性检查算法时,赋初值Work:= Available;2 完成向量Finish,它是一个含有n
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1