处理机调度与死锁

处理机调度的基本概念

作业和进程

1)
a)作业是用户向计算机提交任务的任务实体
b)进程是完成用户任务的执行实体,是资源分配的基本单位。没有作业任务,进程无事可干;没有进程,作业任务无法完成。

2)
a)作业建立完毕后,是放在外存等待运行
b)进程一经创建,总由相应的部分存于内存

3)
一个作业可有多个进程组成,且必须至少由一个进程组成,反之则不然。

4)
a)作业的概念更多地用在批处理系统中
b)进程的概念几乎可以用在所有的多道程序系统中

1.高级、中级和低级调度

  • 高级调度

    高级调度又称为长程调度或作业调度,它的调度对象是作业。其主要功能根据某种算法,决定将外存上处于后备队列中的哪几个作业调度内存,为它们创建内存,分配必要的资源,并将它们放入就绪队列。

  • 低级调度

    低级调度又称为进程调度或短程调度,其所调度的对象是进程。其主要功能是根据某种算法,用来决定就绪队列中的哪个进程应获得处理机,并由分配程序将处理机分配给被选中的进程。

    低级(进程)调度的功能
    1)保存处理机的现场信息
    2)按某种算法选取进程
    3)把处理机分配给进程

    进程调度可采用两中调度的方式:
    a)非抢占方式
    一旦把处理机分配给某进程后,便让该进程一直执行,直至进程完成或发生某事件而被阻塞时,才把处理机分配给其他进程,决不允许进程抢占已分配出去的处理机。
    评价:实现简单、系统开销小;适用于大多数的批处理OS,但在要求比较严格的实时系统中,不宜采用这种调度方式。
    b)抢占方式
    允许调度程序根据某种规则,去暂停某个正在执行的进程,将处理及重新分配给另一个进程。
    1.时间片原则:各进程按时间片运行,一个时间片用完时,停止该进程执行重新进行调度。
    2.短作业(进程)优先原则:短作业(进程)可以抢占长作业(进程)的处理机。
    3.优先权原则:优先权高的可以抢占优先权低的进程的处理机。

  • 中级调度

    中级调度又称为内粗你调度。引入中级调度的主要目的是,提高内存利用率和系统吞吐量。应把那些暂时不能运行的进程,调至外存等待,此时进程的状态称为就绪驻外存状态(或挂起状态)。
    当这些进程又具备运行条件、且内存又稍有空闲时,由中级调度来决定把外存上的那些具备运行条件的就绪进程,重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待进程调度。

  • 各种调度的比较

    1)进程调度的运行频率最高,在分时系统中通常是10~100ms进行一次进程调度,因而进程调度算法不能太复杂,以免占用太多的CPU时间
    2)作业调度是发生在一个作业运行完毕,退出系统,而需要重新调度一个作业进入内存时,故作业调度的周期较长,大约几分钟一次。因而允许作业调度算法花费较多的时间。
    3)中级调度的运行频率,介于进程调度和作业调度之间。

2.调度队列模型

不论高级、中级或者低级调度,都涉及到进程队列,由此形成了三种类型的调度队列模型:

  • 仅有进程调度的调度队列模型

    在分时系统中就绪进程组织成FIFO对队列形式,当创建一个新进程时,将它放入队列末尾。按时间片轮方式运行。
    在这里插入图片描述

  • 具有高级和低级调度的调度队列模型

    在批处理系统中,不仅需要进程调度,而且还需要作业调度,由作业调度按一定的调度算法,从外存的后备队列中选择一批作业调度内存,并为他们建立进程,送入就绪队列,然后才由进程调度算法按照一定的进程调度算法,选择一个进程,把处理机分配给该进程。
    在这里插入图片描述

  • 同时具有三级调度的调度队列模型

    当在OS中引入中级调度后,可以把进程的就绪状态分为内存就绪和外存就绪,把阻塞的状态分为内存阻塞和外存阻塞两种状态。
    在调出操作的作用下,可是进程状态由内存就绪转变为外存就绪,由内存阻塞转变为外存阻塞;在中级调度的作用下,有可是外存就绪转变为内存就绪。
    在这里插入图片描述

3.选择调度方式和调度算法的若干准则

在一个OS的设计中,应如何选择调度方式和算法,很大程度上取决于OS的类型和目标。
如在批处理系统、分时系统和实时系统中,通常都采用不同的调度方式和算法。选择的准则,有的是面向用户的,有的是面向系统的。

  • 面向用户的准则

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 面向系统的准则

    在这里插入图片描述

调度算法

1.先来先服务的短作业(进程)优先调度算法

  • 先来先服务调度算法(FCFS)

    是一种最简单的调度算法,既可用于作业调度,也可用于进程调度。进程调度采用FCFS算法时,每次调度都从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之运行。

    FCFS算法比较有利于长作业(进程),而不利于短作业(进程)
    在这里插入图片描述
    周转时间=完成时间-到达时间
    带权周转时间=周转时间/服务时间
    在这里插入图片描述

  • 短作业(进程)优先调度算法)SJ(P)F)

    对短作业或短进程优先调度的算法。可以分别用于作业调度和进程调度。
    a)短作业优先(SJF)的调度算法:从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
    b)短进程优先(SPF)的调度算法:是从就绪队列中选出一个运行时间最短的进程,将处理机分配给它,使它立即执行。
    在这里插入图片描述
    SJF调度算法的优缺点:
    优点:有效降低作业的平均等待时间,提高系统吞吐量
    缺点:对长作业不利

2.高优先权优先调度算法

为照顾紧迫性作业,使之在进入系统后便获得优先处理,引入了最高优先权有限的(FPF)调度算法。
此算法常用于批处理系统中,作为作业调度算法,也作为多种操作系统中的进程调度算法,还可用于实时系统中。
当用于进程调度时,它分为:
1、非抢占式优先权调度算法
2、抢占式优先权调度算法

  • 优先权的类型

    对于最高优先权优先调度算法,关键在于:使用静态优先权、动态优先权。
    a)静态优先权:在创建进程时确定的,在进程的整个运行期间保持不变。利用某一范围的整数来表示(0~7),又称为优先数。
    b)动态优先权:在创建进程时所赋予的优先权可以随进程的推进或随其等待时间的改变而增加。

  • 确定进程优先权的依据有如下三个方面:

    a)进程类型:一般来说系统进程高于用户进程
    b)进程对资源的需求:如进程的估计运行时间及内存需要量的多少,对要求少的进程赋予较高优先权。
    c)用户要求:有用户进程的紧迫程度及用户所付费用的多少来确定优先权。

  • 高响应比优先调度算法

    在批处理系统中,短作业优先算法是一种比较好的算法,其主要不足是长期作业的运行得不到保证。我们为每个作业引入动态优先权,并使作业的优先级随着等待时间的增加而以速率a提高,则可解决问题。见下式:
    优先权=(等待时间+要求服务时间)/要求服务时间
    由于等待时间与服务时间之和就是系统的响应时间,故上式又表示为:优先权=响应时间/要求服务时间

    由上式可以看出:
    1)如作业等待时间相同,则要求服务的时间欲短优先权愈高,所以利用该算法利于短作业。
    2)当要求服务的时间相同,作业优先权的高低决定于其等待时间的长短,所以是先来先服务。
    3)对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长也可获得处理机。

3.基于时间片的轮转调度算法

在分时系统中,为保证能及时响应用户的请求,必须采用基于时间片轮转式进程调度算法。在早期,分时系统中采用的是简单的时间片轮转法,进入90年代后,广泛采用多级反馈队列调度算法。

  • 时间片轮转法(RR)

    系统将所有就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给首进程,并令其执行一个时间片。时间片的大小从几mb到几百ms。当执行的时间片用完时,停止该进程的执行并将其送往就绪队列的末尾。这样就可以保证就绪队列中所有进程在一定时间内均能获得一时间片的处理机执行时间,系统能在给定的时间内响应所有用户的请求。

  • 时间片大小的确定

    在时间片轮转算法中,时间片的大小对系统性能有很大的影响。不能太短也不能太长,一个比较可取的大小是,时间片略大于一次典型的交互所需要的时间。

  • 多级反馈队列调度算法

    多级反馈队列调度算法是目前公认的较好的进程调度算法
    在这里插入图片描述
    1)设置多个就绪队并为各个队列赋予不同的优先级,第一个最高,依次降低。各个队列中进程执行时间片的大小设置为:优先权越高。时间片越短。如第一个队列时间片为1ms,第二个队列的时间片为2ms,…
    2)当一个新进程进入内存后,首先将它放入第一个队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完后,便可撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样按FCFS原则等待调度执行;如果它再第二队列中运行一个时间片后尚未完成,再依次将它放入第三队列…
    3)仅当第一个队列空闲时,调度程序才调度第二队列中的进程运行,仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。

    多级反馈队列调度算法具有较好的性能,能较好的满足各种类型用户的需要。
    1)终端行作业用户。大多属于较小的交互性作业,只要能使作业在第一队列的时间片内完成,便可令用户满意。
    2)短批处理作业用户。周转时间仍然较短,至多在第二到第三队列即可完成。
    3)长批处理作业用户。将依次在1~n级队列中轮转执行,不必担心作业长期得不到处理。

实时调度

由于在实时系统中存在着若干个实时进程或任务,它们用来反映或控制某个外部事件,往往带有某种程度的紧迫性,因而对实时系统中的调度提出了某些特殊要求,前面所介绍的多种调度算法,并不能很好的满足实时系统对调度的要求,为此,需要引入一种新的调度,即实时调度。
实时系统中包含两种任务:
硬实时任务:指必须满足最后期限的限制,否则会给系统带来不可接受的破坏或者致命的错误。
软实时任务:有一个与之关联的最后期限,并希望能够满足 这个期限的要求,但这并不是强制的,即使超过了最后期限,调度和完成这个任务仍然是有意义的。

1.实现实时调度的基本条件

  • 提供必要的信息

    为了实现实时调度,系统应向调度程序提供有关任务的下述信息:
    1)就绪时间:该任务成为就绪状态的时间
    2)开始截至时间、完成截至时间:只需要知道一个
    3)处理时间:从开始执行到完成所需时间
    4)资源要求:任务执行时所需的一组资源
    5)优先级:根据任务性质赋予不同优先级

  • 系统处理能力强

    在实时系统中,通常都有多个任务,若处理机的能力不够强,则可能会出现某些实时任务不能得到及时处理导致发生难以预料的后果。
    假如系统中有M个周期性的硬实时任务,处理时间为Ci,周期时间表示为Pi ,则单机系统中必须满足条件:
    ∑( Ci / Pi )≤1。

  • 采用抢占式调度机制

    在含有硬实时任务的实时系统中,广泛采用抢占机制。
    当一个优先权更高的任务到达时,允许将当前任务暂时挂起,领高优先权任务立即投入运行,这样可满足该硬实时任务对截至时间的要求。但此种机制比较复杂。

  • 具有快速切换机制

    为保证要求较高的硬实时任务能及时运行,在实时系统中还应具有快速切换机制,以保证任务的快速切换。需要以下两中能力:
    1)对外部中断的快速响应能力。要求系统具有快速硬件中断机构,使可在紧迫的外部事件请求中断时及时响应。
    2)快速的任务分派能力。在完成任务调度后,便应进行任务切换,为提高速度,应使系统中的运行功能产生单位适当的小,已减少任务切换的时间开销。

2.实时调度算法的分类

可按照不同方式对实时调度算法加以分类:
1)根据实时任务性质的不同,分为硬实时调度算法和软实时调度算法
2)按调度方式的不同,分为非抢占式调度算法和抢占式调度算法
3)根据调度程序调度时间的不同,分为静态调度算法和动态调度算法
4)多处理机环境下,可分为集中式调度和分布式调度算法

  • 非抢占式调度算法

    该算法比较简单,用于一些小型实时系统或要求不太严格的实时系统中。又可分为两种:
    1)非抢占式轮转调度算法。常用于工业生产的群控系统种,要求不太严格(响应时间约为数秒)
    2)非抢占式优先调度算法。要求较为严格,根据任务的优先级安排等待位置。可用于有一定要求的实时控制系统种(响应时间约为数百ms)在这里插入图片描述

  • 抢占式调度算法

    用于要求较严格的实时系统中,(t约为数十ms),采用抢占式优先权调度算法,根据抢占发生时间的不同可分为两种:
    1)基于时钟中断的抢占式优先权调度算法:某高优先级任务到达后并不立即抢占,而等下一个时钟中断时抢占。(延时几十毫秒到几毫秒)
    2)立即抢占的优先权调度算法:一旦出现外部中断,只要当前任务未处于临界区,就立即抢占处理机(延时几毫秒到100微秒)
    在这里插入图片描述

3.常用的几种实时调度算法

  • 最早截止间优先(EDF)算法

    根据任务的截止时间来确定任务的优先级。截止时间越早,其优先级越高。
    该算法要求在系统中保持一个实时任务就绪队列,该队列按各任务截止时间的早晚排序,调度程序在选择任务时总是选择就绪队列中的第一个任务,为之分配处理机,使之投入运行。
    EDF算法既可以用于抢占式调度,也可用于非抢占式调度

    非抢占式调度方式用于非周期实时任务
    在这里插入图片描述

    抢占式调度方式用于周期实时任务
    下图中有两个周期性任务,任务A的周期时间为20ms,每个周期的处理时间为10ms;任务B的周期时间为50ms,每个周期的处理时间为25ms
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 最低松弛度优先(LLF)算法

    该算法是根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度越高,为之赋予的优先级就越高。
    例如:任务A在200ms时必须完成,本身运行时间100ms,则必须在100ms之前调度执行,A人物的紧急(松弛)程度为100ms,又如任务B在400ms必须完成,需运行150ms,其松弛程度为250ms
    该算法主要用于抢占调度方式中

    在这里插入图片描述

产生死锁的原因和必要条件

在多道程序系统中,虽借助于多个进程的并发执行,改善了系统的资源利用率,提高了系统的吞吐量,但可能发生一种危险——死锁。
死锁(Deadlock):是指多个在运行过程中因争夺资源而造成的一种僵局,当进程处于这种状态时,若无外力作用,他们都将无法再向前推进。

1.产生死锁的原因

  • 竞争资源:当系统中供多个进程共享的资源如打印机,公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。

    1)可剥夺性资源:资源分配给进程后可以被高优先级的进程剥夺。如CPU、主存。(不会产生死锁)
    2)不可剥夺性资源:分配给进城后只能在进程用完后才释放的资源。如磁带机、打印机等。(可能会产生死锁)

    竞争不可剥夺性资源引起死锁:在系统中配置的非剥夺性资源,由于数量不足,会使进程在运行过程中,因争夺这些资源而陷入僵局。
    如打印机R1,磁带机R2,可供进程P1和P2共享,假定P1已占用R1,P2已占用R2,此时P2又要求R1,因得不到进入阻塞状态,P1又要求R2,也得不到而进入阻塞状态,产生死锁。在这里插入图片描述

    竞争临时性资源引起死锁:
    打印机之类的资源属于可顺序重复使用型资源,称为永久性资源。与之相对的是临时性资源,是指有一个进程产生,被另一个进程使用短暂时间后便无用的资源,也称为消耗性资源,它也可能引起死锁。

  • 进程间推进顺序非法:进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生死锁。

2.产生死锁的必要条件

  • 互斥条件

    进程访问的是临界资源,即在一段时间内某资源只由一个进程占用。如果此时还有其他进程请求该资源,则请求者只能等待,直至占有该资源的进程用完释放。

  • 请求和保持条件

    一进程在请求新的资源的同时,保持对方已分配资源的占有。

  • 不剥夺条件

    指进程以获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

  • 环路等待条件

    指在发生死锁时,必然存在一个进程—资源的环形链。

3.处理死锁的基本方法

  • 预防死锁

    是一种较简单和直观的事先预防方法。该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件之一或几个,来预防发生死锁。
    预防死锁是一种较易实现的方法,已被广泛使用。但由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。

  • 避免死锁

    该方法同样是属于事先预防的策略,这种方法不是预先加上各种限制条件以预防产生死锁的可能性,而是用某种方法去防止系统进入不安全状态,使死锁不至于最终发生。
    1)这种方法只需事先加以较弱的限制条件,便可获得较高的资源利用率和系统吞吐量,但在实现上有一定的难度。
    2)目前在较完善的系统中,常用此方法来避免发生死锁。

  • 检测死锁

    这种方法并不需事先采取任何限制性措施,也不必检查系统是否已经进入不安全区。
    此方法允许系统在运行过程中发生死锁,但可通过系统所设置的检测机构,及时的检测出死锁的发生,并精确的确定与死锁有关的进程和资源;然后采取适当的措施,从系统中将已发生的死锁清除掉。

  • 解除死锁

    是与死锁检测相配套的一种措施。当检测到系统中已发生死锁时,需将进程从死锁状态中解脱出来。
    1)常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以便继续运行
    2)死锁的检测与解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

预防死锁的方法

1.预防死锁

  • 摒弃“请求和保持”条件

    系统规定所有进程在开始运行之前,都必须一次性的申请其在整个运行过程所需的全部资源。此时若系统有足够资源就分配给该进程,该进程在运行期间不会提出资源要求,从而摒弃了“请求”条件。若系统没有足够资源分配给它,就让该进程等待。因而也摒弃了“保持”条件,从而避免发生死锁。
    1)优点:算法简单、易于实现且很安全
    2)缺点:资源浪费严重和进程延迟运行

  • 摒弃“不剥夺“条件

    系统规定,进程是逐个地提出对资源地要求地。当一个已经保持了某些资源的进程,提出新的要求不被满足时必须释放它已经保持的所有资源,待以后需要时再重新申请。从而摒弃了:不剥夺“条件。
    1)某一进程已经占有的资源,在运行过程中会被暂时释放掉,认为是被剥夺了。
    2)实现起来比较复杂且付出很大代。可能会前功尽弃,反复申请和释放等情况,延长了周转时间,增加系统开销。

  • 摒弃"环路等待”条件

    系统将所有资源按类型进行线性排队,并赋予不同的序号。所有进程对资源的请求必须严格按照资源序号递增的次序提出,这样在所形成的资源分配图中,不会出现环路,因而摒弃了“环路等待”条件。
    与前两种策略比较,资源利用率和系统吞吐量都有比较明显的改善。但也存在较为严重问题:
    1)为资源编号限制新增设备的增加
    2)进程使用设备顺序与申请顺序不同,浪费资源
    3)限制用户编程自由

2.系统安全状态

在预防死锁的几种方法中,都施加了较强的限制条件;在避免死锁的方法中, 所施加的限制条件弱,又能获得令人满意的系统性能。
1)在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可避免发生死锁。
2)思路:允许进程动态地申请资源,但在资源分配前,应先计算资源分配的安全性,若此次分配不会导致系统进入不安全状态,则将资源分配给进程,否则,令进程等待。

  • 安全状态

    是指系统能按某种进程顺序(P0,P1…Pn)来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
    1)虽然并不是所有地不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之只要处于安全状态就不会产生死锁
    2)避免死锁的实质是:系统在进行资源分配时,设法使系统不进入不安全状态。

3.利用银行家算法避免死锁

  • 银行家算法中的数据结构

    在这里插入图片描述
    在这里插入图片描述

  • 银行家算法的处理步骤

    在这里插入图片描述
    在这里插入图片描述

  • 安全性算法

在这里插入图片描述
在这里插入图片描述

死锁的检测与解除

  • 死锁的检测

    当系统为进程分配资源时,若未采取任何限制性措施,则系统必须提供检测和解除死锁的手段,为此系统必须:
    1)保存有关资源的请求和分配信息
    2)提供一种算法,以利用这些信息来检测系统是否已进入死锁状态

  • 资源分配图

    系统死锁可利用资源分配图来描述。
    该图由表示进程的圆圈和表示一类资源的方框组成,其中方框中的一个点代表一个该类资源,请求边是由进程指向方框中的r,而分配边则应始于方框中的一个点。
    在这里插入图片描述

  • 死锁定理
    在这里插入图片描述

  • 死锁的解除

    当发现进程死锁时,便应立即把他们从死锁状态中解脱出来。常采用的方法是:
    1)剥夺资源:从其他进程剥夺足够数量的资源给死锁进程以解除死锁状态。
    2)撤销进程:最简单的是让全部进程都死掉;温和一点的是按照某种顺序逐个撤销进程,直至有足够的资源可用,使死锁状态消除为止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值