处理机调度与死锁程序员
在多道程序系统中,调度的实质是一种资源分配,处理机调度是对处理机资源进行分配。处理机调度算法是指根据处理机分配策略所规定的处理机分配算法。在多道批处理系统中,一个做业从提交到得到处理机执行,直至做业运行完毕,可能须要经历多级处理机调度,下面先来了解处理机调度的层次。算法
1. 高级调度(High Level Scheduling)安全
2. 低级调度(Low Level Scheduling)数据结构
3. 中级调度(Intermediate Scheduling)并发
1. 处理机调度算法的共同目标post
(1) 资源利用率。为提升系统的资源利用率,应使系统中的处理机和其它全部资源都尽量地保持忙碌状态,其中最重要的处理机利用率可用如下方法计算:性能
(2) 公平性。公平性是指应使诸进程都得到合理的CPU 时间,不会发生进程饥饿现象。公平性是相对的,对相同类型的进程应得到相同的服务;但对于不一样类型的进程,因为其紧急程度或重要性的不一样,则应提供不一样的服务。线程
(3) 平衡性。因为在系统中可能具备多种类型的进程,有的属于计算型做业,有的属于I/O型。为使系统中的CPU和各类外部设备都能常常处于忙碌状态,调度算法应尽量保持系统资源使用的平衡性。设计
(4) 策略强制执行。对所制订的策略其中包括安全策略,只要须要,就必须予以准确地执行,即便会形成某些工做的延迟也要执行。3d
2. 批处理系统的目标
(1) 平均周转时间短。
对每一个用户而言,都但愿本身做业的周转时间最短。但做为计算机系统的管理者,则老是但愿能使平均周转时间最短,这不只会有效地提升系统资源的利用率,并且还可以使大多数用户都感到满意。应使做业周转时间和做业的平均周转时间尽量短。不然,会使许多用户的等待时间过长,这将会引发用户特别是短做业用户的不满。可把平均周转时间描述为:
为了进一步反映调度的性能,更清晰地描述各进程在其周转时间中,等待和执行时间的具体分配情况,每每使用带权周转时间,即做业的周转时间T与系统为它提供服务的时间Ts之比,即W=T /Ts。而平均带权周转时间则可表示为:
(2) 系统吞吐量高。因为吞吐量是指在单位时间内系统所完成的做业数,于是它与批处理做业的平均长度有关。事实上,若是单纯是为了得到高的系统吞吐量,就应尽可能多地选择短做业运行。
(3) 处理机利用率高。对于大、中型计算机,CPU价格十分昂贵,导致处理机的利用率成为衡量系统性能的十分重要的指标;而调度方式和算法又对处理机的利用率起着十分重要的做用。若是单纯是为使处理机利用率高,应尽可能多地选择计算量大的做业运行。由上所述能够看出,这些要求之间是存在着必定矛盾的。
3. 分时系统的目标
(1) 响应时间快。
(2) 均衡性。
4. 实时系统的目标
(1) 截止时间的保证。
(2) 可预测性。
在多道批处理系统中,做业是用户提交给系统的一项相对独立的工做。操做员把用户提交的做业经过相应的输入设备输入到磁盘存储器,并保存在一个后备做业队列中。再由做业调度程序将其从外存调入内存。
1. 做业和做业步
(1) 做业(Job)。
(2) 做业步(Job Step)。
2. 做业控制块(Job Control Block,JCB)
为了管理和调度做业,在多道批处理系统中,为每一个做业设置了一个做业控制块JCB,它是做业在系统中存在的标志,其中保存了系统对做业进行管理和调度所需的所有信息。一般在JCB中包含的内容有:做业标识、用户名称、用户帐号、做业类型(CPU 繁忙型、I/O 繁忙型、批量型、终端型)、做业状态、调度信息(优先级、做业运行时间)、资源需求(预计运行时间、要求内存大小等)、资源使用状况等。
3. 做业运行的三个阶段和三种状态
做业从进入系统到运行结束,一般须要经历收容、运行和完成三个阶段。相应的做业也就有“后备状态”、“运行状态”和“完成状态”。
(1) 收容阶段。
(2) 运行阶段。
(3) 完成阶段。
做业调度的主要任务是,根据JCB中的信息,检查系统中的资源可否知足做业对资源的需求,以及按照必定的调度算法,从外存的后备队列中选取某些做业调入内存,并为它们建立进程、分配必要的资源。而后再将新建立的进程排在就绪队列上等待调度。所以,也把做业调度称为接纳调度(Admission Scheduling)。在每次执行做业调度时,都需作出如下两个决定。
1. 接纳多少个做业
2. 接纳哪些做业
1. 先来先服务(first-come first-served,FCFS)调度算法
FCFS是最简单的调度算法,该算法既可用于做业调度,也可用于进程调度。当在做业调度中采用该算法时,系统将按照做业到达的前后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的做业,而无论该做业所需执行时间的长短,从后备做业队列中选择几个最早进入该队列的做业,将它们调入内存,为它们分配资源和建立进程。而后把它放入就绪队列。
2. 短做业优先(short job first,SJF)的调度算法
因为在实际状况中,短做业(进程)占有很大比例,为了能使它们能比长做业优先执行,而产生了短做业优先调度算法。
1) 短做业优先算法
SJF算法是以做业的长短来计算优先级,做业越短,其优先级越高。做业的长短是以做业所要求的运行时间来衡量的。SJF算法能够分别用于做业调度和进程调度。在把短做业优先调度算法用于做业调度时,它将从外存的做业后备队列中选择若干个估计运行时间最短的做业,优先将它们调入内存运行。
2) 短做业优先算法的缺点
SJF调度算法较之FCFS算法有了明显的改进,但仍然存在不容忽视的缺点:
(1) 必须预知做业的运行时间。在采用这种算法时,要先知道每一个做业的运行时间。即便是程序员也很难准确估计做业的运行时间,若是估计太低,系统就可能按估计的时间终止做业的运行,但此时做业并未完成,故通常都会偏长估计。
(2) 对长做业很是不利,长做业的周转时间会明显地增加。更严重的是,该算法彻底忽视做业的等待时间,可能使做业等待时间过长,出现饥饿现象。
(3) 在采用FCFS算法时,人—机没法实现交互。
(4) 该调度算法彻底未考虑做业的紧迫程度,故不能保证紧迫性做业能获得及时处理。
1. 优先级调度算法(priority-scheduling algorithm,PSA)
咱们能够这样来看做业的优先级,对于先来先服务调度算法,做业的等待时间就是做业的优先级,等待时间越长,其优先级越高。对于短做业优先调度算法,做业的长短就是做业的优先级,做业所需运行的时间越短,其优先级越高。但上述两种优先级都不能反映做业的紧迫程度。
2. 高响应比优先调度算法(Highest Response Ratio Next,HRRN)
在批处理系统中,FCFS算法所考虑的只是做业的等待时间,而忽视了做业的运行时间。而SJF算法正好与之相反,只考虑做业的运行时间,而忽视了做业的等待时间。高响应比优先调度算法则是既考虑了做业的等待时间,又考虑做业运行时间的调度算法,所以既照顾了短做业,又不导致长做业的等待时间过长,从而改善了处理机调度的性能。
高响应比优先算法是如何实现的呢? 若是咱们能为每一个做业引入一个动态优先级,即优先级是能够改变的,令它随等待时间延长而增长,这将使长做业的优先级在等待期间不断地增长,等到足够的时间后,必然有机会得到处理机。该优先级的变化规律可描述为:
因为等待时间与服务时间之和就是系统对该做业的响应时间,故该优先级又至关于响应比RP。据此,优先又可表示为:
进程调度是OS中必不可少的一种调度。所以在三种类型的OS中,都无一例外地配置了进程调度。此外它也是对系统性能影响最大的一种处理机调度,相应的,有关进程调度的算法也较多。
1. 进程调度的任务
进程调度的任务主要有三:
(1) 保存处理机的现场信息。
(2) 按某种算法选取进程。
(3) 把处理器分配给进程。
2. 进程调度机制
为了实现进程调度,在进程调度机制中,应具备以下三个基本部分,如图3-1所示。
(1) 排队器。
(2) 分派器。
(3) 上下文切换器。
图3-1 进程调度机制
3. 进程调度方式
1) 非抢占方式(Nonpreemptive Mode)
在采用这种调度方式时,一旦把处理机分配给某进程后,就一直让它运行下去,决不会由于时钟中断或任何其它缘由去抢占当前正在运行进程的处理机,直至该进程完成,或发生某事件而被阻塞时,才把处理机分配给其它进程。
2) 抢占方式(Preemptive Mode)
这种调度方式容许调度程序根据某种原则,去暂停某个正在执行的进程,将已分配给该进程的处理机从新分配给另外一进程。在现代OS中普遍采用抢占方式,这是由于:对于批处理机系统,能够防止一个长进程长时间地占用处理机,以确保处理机能为全部进程提供更为公平的服务。在分时系统中,只有采用抢占方式才有可能实现人—机交互。在实时系统中,抢占方式能知足实时任务的需求。但抢占方式比较复杂,所需付出的系统开销也较大。
1. 轮转法的基本原理
在轮转(RR)法中,系统将全部的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔必定时间(如30 s)便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,并令其执行一个时间片。当它运行完毕后,又把处理机分配给就绪队列中新的队首进程,也让它执行一个时间片。这样,就能够保证就绪队列中的全部进程在肯定的时间段内,都能得到一个时间片的处理机时间。
2. 进程切换时机
在RR调度算法中,应在什么时候进行进程的切换,可分为两种状况:① 若一个时间片还没有用完,正在运行的进程便已经完成,就当即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片。② 在一个时间片用完时,计时器中断处理程序被激活。若是进程还没有运行完毕,调度程序将把它送往就绪队列的末尾。
3. 时间片大小的肯定
在轮转算法中,时间片的大小对系统性能有很大的影响。
图3-2示出了时间片大小对响应时间的影响,其中图(a)是时间片略大于典型交互的时间,而图(b)是时间片小于典型交互的时间。图3-3示出了时间片分别为q =1 和q=4 时对平均周转时间的影响。
图3-2 时间片大小对响应时间的影响
图3-3 q =1 和q=4 时进程的周转时间
1. 优先级调度算法的类型
优先级进程调度算法,是把处理机分配给就绪队列中优先级最高的进程。这时,又可进一步把该算法分红以下两种。
(1) 非抢占式优先级调度算法。
(2) 抢占式优先级调度算法。
2. 优先级的类型
1) 静态优先级
静态优先级是在建立进程时肯定的,在进程的整个运行期间保持不变。优先级是利用某一范围内的一个整数来表示的,例如0~255中的某一整数,又把该整数称为优先数。肯定进程优先级大小的依据有以下三个:
(1) 进程类型。
(2) 进程对资源的需求。
(3) 用户要求。
2) 动态优先级
动态优先级是指在建立进程之初,先赋予其一个优先级,而后其值随进程的推动或等待时间的增长而改变,以便得到更好的调度性能。
如前所述的各类调度算法,尤为在应用于进程调度时,因为系统中仅设置一个进程的就绪队列,即低级调度算法是固定的、单一的,没法知足系统中不一样用户对进程调度策略的不一样要求,在多处理机系统中,这种单一调度策略实现机制的缺点更显突出,由此,多级队列调度算法可以在必定程度上弥补这一缺点。
1. 调度机制
多级反馈队列调度算法的调度机制可描述以下:
(1) 设置多个就绪队列。
图3-4是多级反馈队列算法的示意图。
图3-4 多级反馈队列调度算法
(2) 每一个队列都采用FCFS算法。当新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,即可撤离系统。不然,即它在一个时间片结束时还没有完成,调度程序将其转入第二队列的末尾等待调度;若是它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,依此类推。当进程最后被降到第n队列后,在第n队列中便采起按RR方式运行。
(3) 按队列优先级调度。调度程序首先调度最高优先级队列中的诸进程运行,仅当第一队列空闲时才调度第二队列中的进程运行;换言之,仅当第1~(i-1)全部队列均空时,才会调度第i队列中的进程运行。若是处理机正在第i队列中为某进程服务时又有新进程进入任一优先级较高的队列,此时须当即把正在运行的进程放回到第i队列的末尾,而把处理机分配给新到的高优先级进程。
2. 调度算法的性能
在多级反馈队列调度算法中,若是规定第一个队列的时间片略大于多数人机交互所需之处理时间时,便能较好地知足各类类型用户的须要。
(1) 终端型用户。
(2) 短批处理做业用户。
(3) 长批处理做业用户。
1. 保证调度算法
保证调度算法是另一种类型的调度算法,它向用户所作出的保证并非优先运行,而是明确的性能保证,该算法能够作到调度的公平性。一种比较容易实现的性能保证是处理机分配的公平性。若是在系统中有n个相同类型的进程同时运行,为公平起见,须保证每一个进程都得到相同的处理机时间1/n。
在实施公平调度算法时系统中必须具备这样一些功能:
(1) 跟踪计算每一个进程自建立以来已经执行的处理时间。
(2) 计算每一个进程应得到的处理机时间,即自建立以来的时间除以n。
(3) 计算进程得到处理机时间的比率,即进程实际执行的处理时间和应得到的处理机时间之比。
(4) 比较各进程得到处理机时间的比率。如进程A的比率最低,为0.5,而进程B的比率为0.8,进程C的比率为1.2等。
(5) 调度程序应选择比率最小的进程将处理机分配给它,并让该进程一直运行,直到超过最接近它的进程比率为止。
2. 公平分享调度算法
分配给每一个进程相同的处理机时间,显然,这对诸进程而言,是体现了必定程度的公平,但若是各个用户所拥有的进程数不一样,就会发生对用户的不公平问题。
在实时系统中,可能存在着两类不一样性质的实时任务,即HRT任务和SRT任务,它们都联系着一个截止时间。为保证系统能正常工做,实时调度必须能知足实时任务对截止时间的要求。为此,实现实时调度应具有必定的条件。
1. 提供必要的信息
为了实现实时调度,系统应向调度程序提供有关任务的信息:
(1) 就绪时间,是指某任务成为就绪状态的起始时间,在周期任务的状况下,它是事先预知的一串时间序列。
(2) 开始截止时间和完成截止时间,对于典型的实时应用,只须知道开始截止时间,或者完成截止时间。
(3) 处理时间,一个任务从开始执行,直至完成时所需的时间。
(4) 资源要求,任务执行时所需的一组资源。
(5) 优先级,若是某任务的开始截止时间错过,势必引发故障,则应为该任务赋予“绝对”优先级;若是其开始截止时间的错过,对任务的继续运行无重大影响,则可为其赋予“相对”优先级,供调度程序参考。
2. 系统处理能力强
在实时系统中,若处理机的处理能力不够强,则有可能因处理机忙不过,而导致某些实时任务不能获得及时处理,从而致使发生难以预料的后果。假定系统中有m个周期性的硬实时任务HRT,它们的处理时间可表示为Ci,周期时间表示为Pi,则在单处理机状况下,必须知足下面的限制条件系统才是可调度的:
提升系统处理能力的途径有二:一是采用单处理机系统,但须加强其处理能力,以显著地减小对每个任务的处理时间;二是采用多处理机系统。假定系统中的处理机数为N,则应将上述的限制条件改成:
3. 采用抢占式调度机制
在含有HRT任务的实时系统中,普遍采用抢占机制。这样即可知足HRT任务对截止时间的要求。但这种调度机制比较复杂。
4. 具备快速切换机制
为保证硬实时任务能及时运行,在系统中还应具备快速切换机制,使之能进行任务的快速切换。该机制应具备以下两方面的能力:
(1) 对中断的快速响应能力。对紧迫的外部事件请求中断能及时响应,要求系统具备快速硬件中断机构,还应使禁止中断的时间间隔尽可能短,以避免耽误时机(其它紧迫任务)。
(2) 快速的任务分派能力。为了提升分派程序进行任务切换时的速度,应使系统中的每一个运行功能单位适当的小,以减小任务切换的时间开销。
能够按不一样方式对实时调度算法加以分类:① 根据实时任务性质,可将实时调度的算法分为硬实时调度算法和软实时调度算法;② 按调度方式,则可分为非抢占调度算法和抢占调度算法。
1. 非抢占式调度算法
(1) 非抢占式轮转调度算法。
(2) 非抢占式优先调度算法。
2. 抢占式调度算法
可根据抢占发生时间的不一样而进一步分红如下两种调度算法:
(1) 基于时钟中断的抢占式优先级调度算法。
(2) 当即抢占(Immediate Preemption)的优先级调度算法。
图3-5中的(a)、(b)、(c)、(d)分别示出了四种状况的调度时间。
图3-5 实时进程调度
1. 非抢占式调度方式用于非周期实时任务
图3-6示出了将该算法用于非抢占调度方式之例。
图3-6 EDF算法用于非抢占调度方式
2. 抢占式调度方式用于周期实时任务
图3-7示出了将该算法用于抢占调度方式之例。在该例中有两个周期任务,任务A和任务B的周期时间分别为20 ms和50 ms,每一个周期的处理时间分别为10 s和25 s。
图3-7 最先截止时间优先算法用于抢占调度方式之例
该算法在肯定任务的优先级时,根据的是任务的紧急(或松弛)程度。任务紧急程度愈高,赋予该任务的优先级就愈高,以使之优先执行。
该算法主要用于可抢占调度方式中。假如在一个实时系统中有两个周期性实时任务A和B,任务A要求每20 s执行一次,执行时间为10 s,任务B要求每50 s执行一次,执行时间为25 s。由此可知,任务A和B每次必须完成的时间分别为:A一、A二、A三、…和B一、B二、B三、…,见图3-8。
图3-8 A和B任务每次必须完成的时间
图3-9示出了具备两个周期性实时任务的调度状况。
图3-9 利用ELLF算法进行调度的状况
1. 优先级倒置的造成
当前OS普遍采用优先级调度算法和抢占方式,然而在系统中存在着影响进程运行的资源而可能产生“优先级倒置”的现象,即高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞。咱们经过一个例子来讲明该问题。
假如P3最早执行,在执行了P(mutex)操做后,进入到临界区CS-3。在时刻a,P2就绪,由于它比P3的优先级高,P2抢占了P3的处理机而运行,如图3-10所示。
图3-10 优先级倒置示意图
2. 优先级倒置的解决方法
一种简单的解决方法是规定:假如进程P3在进入临界区后P3所占用的处理机就不容许被抢占。
图3-11示出了采用动态优先级继承方法后,P一、P二、P3三个进程的运行状况。
图3-11 采用了动态优先级继承方法的运行状况
在系统中有许多不一样类型的资源,其中能够引发死锁的主要是,须要采用互斥访问方法的、不能够被抢占的资源,即在前面介绍的临界资源。系统中这类资源有不少,如打印机、数据文件、队列、信号量等。
1. 可重用性资源和消耗性资源
1) 可重用性资源
可重用性资源是一种可供用户重复使用屡次的资源,它具备以下性质:
(1) 每个可重用性资源中的单元只能分配给一个进程使用,不容许多个进程共享。
(2) 进程在使用可重用性资源时,须按照这样的顺序:① 请求资源。若是请求资源失败,请求进程将会被阻塞或循环等待。② 使用资源。进程对资源进行操做,如用打印机进行打印;③ 释放资源。当进程使用完后本身释放资源。
(3) 系统中每一类可重用性资源中的单元数目是相对固定的,进程在运行期间既不能建立也不能删除它。
2) 可消耗性资源
可消耗性资源又称为临时性资源,它是在进程运行期间,由进程动态地建立和消耗的,它具备以下性质:
① 每一类可消耗性资源的单元数目在进程运行期间是能够不断变化的,有时它能够有许多,有时可能为0;
② 进程在运行过程当中,能够不断地创造可消耗性资源的单元,将它们放入该资源类的缓冲区中,以增长该资源类的单元数目。
③ 进程在运行过程当中,能够请求若干个可消耗性资源单元,用于进程本身的消耗,再也不将它们返回给该资源类中。
2. 可抢占性资源和不可抢占性资源
1) 可抢占性资源
可把系统中的资源分红两类,一类是可抢占性资源,是指某进程在得到这类资源后,该资源能够再被其它进程或系统抢占。
2) 不可抢占性资源
另外一类资源是不可抢占性资源,即一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。
1. 竞争不可抢占性资源引发死锁
一般系统中所拥有的不可抢占性资源其数量不足以知足多个进程运行的须要,使得进程在运行过程当中,会因争夺资源而陷入僵局。
咱们可将上面的问题利用资源分配图进行描述,用方块表明可重用的资源(文件),用圆圈表明进程,见图3-12所示。
图3-12 共享文件时的死锁状况
2. 竞争可消耗资源引发死锁
如今进一步介绍竞争可消耗资源所引发的死锁。图3-13示出了在三个进程之间,在利用消息通讯机制进行通讯时所造成的死锁状况。
图3-13 进程之间通讯时的死锁
3. 进程推动顺序不当引发死锁
除了系统中多个进程对资源的竞争会引起死锁外,进程在运行过程当中,对资源进行申请和释放的顺序是否合法,也是在系统中是否会产生死锁的一个重要因素。
1) 进程推动顺序合法
在进程P1和P2并发执行时,若是按图3-14中的曲线①所示的顺序推动:P1:Request(R1)→P1:Request(R2)→P1:Releast(R1)→P1:Release(R2)→P2:Request(R2)→P2:Request(R1)→P2:Release(R2)→P2:Release(R1),两个进程可顺利完成。相似地,若按图中曲线②和③所示的顺序推动,两进程也能够顺利完成。咱们称这种不会引发进程死锁的推动顺序是合法的。
2) 进程推动顺序非法
若并发进程P1和P2按图3-14中曲线④所示的顺序推动,它们将进入不安全区D内。此时P1保持了资源R1,P2保持了资源R2,系统处于不安全状态。此刻,若是两个进程继续向前推动,就可能发生死锁。例如,当P1运行到P1:Request(R2)时,将因R2已被P2占用而阻塞;当P2运行到P2:Request(R1)时,也将因R1已被P1占用而阻塞,因而发生了进程死锁,这样的进程推动顺序就是非法的。
图3-14 进程推动顺序对死锁的影响
1. 死锁的定义
在一组进程发生死锁的状况下,这组死锁进程中的每个进程,都在等待另外一个死锁进程所占有的资源。
2. 产生死锁的必要条件
虽然进程在运行过程当中可能会发生死锁,但产生进程死锁是必须具有必定条件的。综上所述不难看出,产生死锁必须同时具有下面四个必要条件,只要其中任一个条件不成立,死锁就不会发生:
(1) 互斥条件。
(2) 请求和保持条件。
(3) 不可抢占条件。
(4) 循环等待条件。
3. 处理死锁的方法
目前处理死锁的方法可归结为四种:
(1) 预防死锁。
(2) 避免死锁。
(3) 检测死锁。
(4) 解除死锁。
预防死锁的方法是经过破坏产生死锁的四个必要条件中的一个或几个,以免发生死锁。因为互斥条件是非共享设备所必须的,不只不能改变,还应加以保证,所以主要是破坏产生死锁的后三个条件。
为了能破坏“请求和保持”条件,系统必须保证作到:当一个进程在请求资源时,它不能持有不可抢占资源。该保证可经过以下两个不一样的协议实现:
1. 第一种协议
该协议规定,全部进程在开始运行以前,必须一次性地申请其在整个运行过程当中所需的所有资源。
2. 第二种协议
该协议是对第一种协议的改进,它容许一个进程只得到运行初期所需的资源后,便开始运行。
为了能破坏“不可抢占”条件,协议中规定,当一个已经保持了某些不可被抢占资源的进程,提出新的资源请求而不能获得知足时,它必须释放已经保持的全部资源,待之后须要时再从新申请。这意味着进程已占有的资源会被暂时地释放,或者说是被抢占了,从而破坏了“不可抢占”条件。
一个能保证“循环等待”条件不成立的方法是,对系统全部资源类型进行线性排序,并赋予不一样的序号。
避免死锁一样是属于事先预防的策略,但并非事先采起某种限制措施,破坏产生死锁的必要条件,而是在资源动态分配过程当中,防止系统进入不安全状态,以免发生死锁。这种方法所施加的限制条件较弱,可能得到较好的系统性能,目前经常使用此方法来避免发生死锁。
在死锁避免方法中,把系统的状态分为安全状态和不安全状态。当系统处于安全状态时,可避免发生死锁。反之,当系统处于不安全状态时,则可能进入到死锁状态。
1. 安全状态
在该方法中,容许进程动态地申请资源,但系统在进行资源分配以前,应先计算这次资源分配的安全性。
2. 安全状态之例
假定系统中有三个进程P一、P2和P3,共有12台磁带机。进程P1总共要求10台磁带机,P2和P3分别要求4台和9台。假设在T0时刻,进程P一、P2和P3已分别得到5台、2台和2台磁带机,尚有3台空闲未分配,以下表所示:
3. 由安全状态向不安全状态的转换
若是不按照安全序列分配资源,则系统可能会由安全状态进入不安全状态。
最有表明性的避免死锁的算法是Dijkstra的银行家算法。起这样的名字是因为该算法本来是为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能知足全部客户须要的状况。在OS中也可用它来实现避免死锁。
1. 银行家算法中的数据结构
为了实现银行家算法,在系统中必须设置这样四个数据结构,分别用来描述系统中可利用的资源、全部进程对资源的最大需求、系统中的资源分配,以及全部进程还须要多少资源的状况。
(1) 可利用资源向量Available。
(2) 最大需求矩阵Max。
(3) 分配矩阵Allocation。
(4) 需求矩阵Need。
2. 银行家算法
设Requesti是进程Pi的请求向量,若是Request [j]=K,表示进程Pi须要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:
(1) 若是Request [j]≤Need[i, j],便转向步骤(2); 不然认为出错,由于它所须要的资源数已超过它所宣布的最大值。
(2) 若是Request [j]≤Available[j],便转向步骤(3); 不然,表示尚无足够资源,Pi须等待。
(3) 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j] = Available[j] equest [j];
Allocation[i, j] = Allocation[i, j] equest [j];
Need[i, j] = Need[i, j] equest [j];
(4) 系统执行安全性算法,检查这次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;不然,将本次的试探分配做废,恢复原来的资源分配状态,让进程Pi等待。
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都知足,则表示系统处于安全状态;不然,系统处于不安全状态。
4. 银行家算法之例
假定系统中有五个进程{P0, P1, P2, P3, P4}和三类资源{A, B, C},各类资源的数量分别为十、五、7,在T0时刻的资源分配状况如图3-15所示。
图3-15 T0时刻的资源分配表
(1) 0时刻的安全性:利用安全性算法对T0时刻的资源分配状况进行分析(如图3-16所示)可知,在T0时刻存在着一个安全序列{P1, P3, P4, P2, P0},故系统是安全的。
图3-16 T0时刻的安全序列
(2) 1请求资源:P1发出请求向量Request1(1, 0, 2),系统按银行家算法进行检查:
① Request1(1, 0, 2)≤Need1(1, 2, 2);
② Request1(1, 0, 2)≤Available1(3, 3, 2);
③ 系统先假定可为P1分配资源,并修改Available,Allocation1和Need1向量,由此造成的资源变化状况如图3-15中的圆括号所示;
④ 再利用安全性算法检查此时系统是否安全,如图3-17所示。
图3-17 P1申请资源时的安全性检查
(3) 4请求资源:P4发出请求向量Request4(3,3,0),系统按银行家算法进行检查:
① Request4(3,3,0)≤Need4(4,3,1);
② Request4(3,3,0)>Available(2,3,0),让P4等待。
(4) 0请求资源:P0发出请求向量Request0(0,2,0),系统按银行家算法进行检查:
① Request0(0,2,0)≤Need0(7,4,3);
② Request0(0,2,0)≤Available(2,3,0);
③ 系统暂时先假定可为P0分配资源,并修改有关数据,如图3-18所示。
图3-18 为P0分配资源后的有关资源数据
(5) 进行安全性检查:可用资源Available(2,1,0)已不能知足任何进程的须要,故系统进入不安全状态,此时系统不分配资源。
若是在系统中,既不采起死锁预防措施,也未配有死锁避免算法,系统极可能会发生死锁。在这种状况下,系统应当提供两个算法:
① 死锁检测算法。该方法用于检测系统状态,以肯定系统中是否发生了死锁。
② 死锁解除算法。当认定系统中已发生了死锁,利用该算法可将系统从死锁状态中解脱出来。
为了能对系统中是否已发生了死锁进行检测,在系统中必须:
① 保存有关资源的请求和分配信息;
② 提供一种算法,它利用这些信息来检测系统是否已进入死锁状态。
1. 资源分配图(Resource Allocation Graph)
系统死锁,可利用资源分配图来描述。
该图是由一组结点N和一组边E所组成的一个对偶G N, E),它具备下述形式的定义和限制:
(1) 把N分为两个互斥的子集,即一组进程结点P={P1, P2, …, Pn}和一组资源结点R={R1, R2, …, Rn},N ∪R。在图3-19所示的例子中,P P1, P2},R R1, R2},N R1, R2}∪{P1, P2}。
(2) 凡属于E中的一个边e∈E,都链接着P中的一个结点和R中的一个结点,e Pi, Rj}是资源请求边,由进程Pi指向资源Rj,它表示进程Pi请求一个单位的Rj资源。E Rj, Pi}是资源分配边,由资源Rj指向进程Pi,它表示把一个单位的资源Rj分配给进程Pi。图3-19中示出了两个请求边和两个分配边,即E (P1, R2), (R2, P2), (P2, R1), (R1, P1)}。
图3-19 每类资源有多个时的状况
2.死锁定理
咱们能够利用把资源分配图加以简化的方法(图3-19),来检测当系统处于S状态时,是否为死锁状态。简化方法以下:
(1) 在资源分配图中,找出一个既不阻塞又非独立的进程结点Pi。在顺利的状况下,Pi可得到所需资源而继续运行,直至运行完毕,再释放其所占有的所有资源,这至关于消去Pi的请求边和分配边,使之成为孤立的结点。在图3-20(a)中,将P1的两个分配边和一个请求边消去,便造成图(b)所示的状况。
图3-20 资源分配图的简化
(2) 1释放资源后,即可使P2得到资源而继续运行,直至P2完成后又释放出它所占有的所有资源,造成图(c)所示的状况,即将P2的两条请求边和一条分配边消去。
(3) 在进行一系列的简化后,若能消去图中全部的边,使全部的进程结点都成为孤立结点,则称该图是可彻底简化的;若不能经过任何过程使该图彻底简化,则称该图是不可彻底简化的。
3.死锁检测中的数据结构
死锁检测中的数据结构相似于银行家算法中的数据结构:
(1) 可利用资源向量Available,它表示了m类资源中每一类资源的可用数目。
(2) 把不占用资源的进程(向量Allocation=0)记入L表中,即Li∪L。
(3) 从进程集合中找到一个Requesti≤Work的进程,作以下处理:① 将其资源分配图简化,释放出资源,增长工做向量Work =Work + Allocation i。② 将它记入L表中。
(4) 若不能把全部进程都记入L表中,便代表系统状态S的资源分配图是不可彻底简化的。所以,该系统状态将发生死锁。
1. 终止进程的方法
1) 终止全部死锁进程
这是一种最简单的方法,便是终止全部的死锁进程,死锁天然也就解除了,但所付出的代价可能会很大。由于其中有些进程可能已经运行了很长时间,已接近结束,一旦被终止真可谓“功亏一篑”,之后还得从头再来。还可能会有其它方面的代价,在此再也不一一列举。
2) 逐个终止进程
稍微温和的方法是,按照某种顺序,逐个地终止进程,直至有足够的资源,以打破循环等待,把系统从死锁状态解脱出来为止。但该方法所付出的代价也可能很大。由于每终止一个进程,都须要用死锁检测算法肯定系统死锁是否已经被解除,若未解除还需再终止另外一个进程。另外,在采起逐个终止进程策略时,还涉及到应采用什么策略选择一个要终止的进程。选择策略最主要的依据是,为死锁解除所付出的“代价最小”。但怎么样才算是“代价最小”,很难有一个精确的度量。
2. 付出代价最小的死锁解除算法
一种付出代价最小的死锁解除算法如图3-21所示。
图3-21 付出代价最小的死锁解除算法
习题 8:
1. 高级调度与低级调度的主要任务是什么? 为何要引入中级调度?
2. 处理机调度算法的共同目标是什么? 批处理系统的调度目标又是什么?
3. 何谓做业、做业步和做业流?
4. 在什么状况下须要使用做业控制块JCB,其中包含了哪些内容?
5. 在做业调度中应如何肯定接纳多少个做业和接纳哪些做业?
6. 为何要引入高响应比优先调度算法? 它有何优势?
7. 试说明低级调度的主要功能。
8. 在抢占调度方式中,抢占的原则是什么?
9. 在选择调度方式和调度算法时,应遵循的准则是什么?
10. 在批处理系统、分时系统和实时系统中,各采用哪几种进程(做业)调度算法?
11. 何谓静态和动态优先级? 肯定静态优先级的依据是什么?
12. 试比较FCFS和SJF两种进程调度算法。
13. 在时间片轮转法中,应如何肯定时间片的大小?
14. 经过一个例子来讲明一般的优先级调度算法为何不能适用于实时系统?
15. 为何说多级反馈队列调度算法能较好地知足各方面用户的须要?
16. 为何说传统的几种调度算法都不能算是公平调度算法?
17. 保证调度算法是如何作到调度的公平性的?
18. 公平分享调度算法又是如何作到调度的公平性的?
19. 为何在实时系统中,要求系统(尤为是CPU)具备较强的处理能力?
20. 按调度方式可将实时调度算法分为哪几种?
21. 什么是最先截止时间优先调度算法? 举例说明之。
22. 什么是最低松弛度优先调度算法? 举例说明之。
23. 何谓“优先级倒置”现象,可采起什么方法来解决?
24. 试分别说明可重用资源和可消耗资源的性质。
25. 试举例说明竞争不可抢占资源所引发的死锁。
26. 为了破坏“请求和保持”条件而提出了两种协议,试比较这两种协议。
27. 何谓死锁? 产生死锁的缘由和必要条件是什么?
28. 在解决死锁问题的几个方法中,哪一种方法最易于实现? 哪一种方法使资源利用率最高?
29. 请详细说明可经过哪些途径预防死锁。
30. 在银行家算法的例子中,若是P0发出的请求向量由Request(0, 2, 0)改成Request(0, 1, 0),问系统能否将资源分配给它?
31. 在银行家算法中,若出现下述资源分配状况,试问:
(1) 该状态是否安全?
(2) 若进程P2提出请求Request(1, 2, 2, 2)后,系统可否将资源分配给它?