4,实时调度
实时系统中,可能存在着两种不同性质的热舞,即HRT任务和SRT任务,他们都联系着一个截止时间。为保证系统能够正常工作,实时调度必须满足实时任务对截止时间的要求。https://shao12138.blog.csdn.net/article/details/111083732#t10
4.1,实现实时调度的基本条件
1,提供必要的信息
就绪时间(任务成为就绪状态的起始时间)、开始截止时间、完成截止时间、处理时间(指一个任务从开始执行直至完成所需的时间)、资源要求(任务执行时所需的一组资源)、优先级(可以设为绝对优先级或相对优先级)
2,系统处理能力强
若处理机处理能力不够强,则会出现处理机忙不过来而使某些实时任务不能得到及时处理,从而导致发生难以预料的后果。
解决方法:(1)增强单处理机的处理能力,以减少单一任务的处理时间。(2)采用多处理机系统。
3,采用抢占式调度机制
在含有HRT任务的实时系统中,广泛采用抢占机制,这样便满足HRT(硬实时任务)对截止时间的要求。
可预知任务开始截止时间的小型实时系统采用非抢占调度机制,以减少系统开销。这种OS中,实时任务小,完成关键任务和临界区后,阻塞自身释放处理机,使得调度程序可以选择开始截止时间即将到达的任务
4,具有快速切换机制
为保证硬实时的及时响应,OS需要具有快速切换机制
- 对外部中断的快速响应能力:系统应具有快速硬件中断机构保证对紧迫外部中断请求的及时响应,同时也要保证本次中断的时间间隔尽量的小。
- 快速的任务分派能力:完成任务调度后,需要进行任务切换,此时应使系统中每个运行功能单位适当小,以减少切换的时间开销。
4.2,实时调度算法的分类
按实时任务性质分 : 硬实时任务与软实时任务
按调度方式分 : 非抢占式与抢占式
按调度时间分:静态调度(进程执行前已经决定各进程执行顺序)和动态调度(根据当前运行情况选择可投入运行的进程)
多处理机环境下 : 集中式与分布式
非抢占式调度算法
优点:算法思想简单,易于实现,常用于小型或实时要求不严格的实时控制系统中
可分为:非抢占式轮转调度算法、非抢占式优先调度算法
非抢占式轮转调度算法算法思想:在一台计算机中为生产现场的多个相同或类似对象建立一一对应的实时任务,并将其排成轮转队列等待调度,每次可获得数秒或数十秒的时间片响应。常用于工业生产的群控系统。
非抢占式优先调度算法思想:非抢占式优先调度算法可以为要求较为严格的任务赋予较高的优先级。当这些实时任务到达时,把它们安排在就绪队列的队首,等待当前任务自我终止或运行完成后才能被调度执行。常用于有一定要求的实时控制系统中。
抢占式调度算法
可分为:基于时钟中断的抢占式优先权调度算法、立即抢占的优先权调度算法
基于时钟中断的抢占式优先权调度算法思想:在某实时任务到达后,如果该任务的优先级高于当前任务的优先级,这时并不立即抢占当前任务的处理机,而是等到时钟中断到来时,调度程序才剥夺当前任务的执行,将处理机分配给新到的高优先权任务。
立即抢占的优先权调度算法思想:这种调度算法要求操作系统具有快速响应外部事件中断的能力。一旦出现外部中断,只要当前任务未处于临界区,便立即剥夺当前任务的执行,把处理机分配给请求中断的紧迫任务。
4.3,最早截止时间优先EDF算法
基本思想:根据任务的截止时间来确定任务的优先级。截止时间越早,优先级越高。该算法要求在系统中保持一个实时任务就绪队列,该队列按各任务截止时间的早晚排序。调度程序在选择任务时,总是选择就绪队列中的第一个任务,为之分配处理机,使之投入运行。
EDF算法即可用于抢占式调度,也可用于非抢占式调度。
非抢占式调度方式用于非周期实时任务
抢占式调度方式用于周期任务
4.4,最低松弛度优先LLF算法
基本思想:根据任务紧急(或松弛)程度,来确定任务的优先级。任务的紧急程度越高,为该任务赋予的优先级越高,以使之优先执行。
实现该算法时,要求系统中有一个按松弛度排序的实时任务队列,松弛度最低的任务排在队列最前面,调度程序总是选择队列中的队首任务执行。
例如:一个任务在200ms时必须完成,而它本身所需的运行时间就有100ms,因此,调度程序必须在100ms之前调度执行,该任务的紧急程度(松弛程度)为100ms。又如,另一任务400ms时必须完成,它本身运行需要150ms,则其松弛程度为250ms。
在实时系统中,有两个周期性实时任务A和B,任务A要求每20ms执行一次,执行时间为10ms;任务B则要求每50ms执行一次,执行时间为25ms。任务A和B每次必须完成的时间A1,A2,A3…和B1,B2,B3…如下图所示。
4.5,优先级倒置
优先级倒置:高优先级进程被低优先级进程延迟或阻塞。
例如:有三个完全独立的进程P1、P2、P3。P1优先级最高,P2次之,P3最低。P1和P3通过共享的一个临界资源进行交互。代码如下:
P1:…P(mutex);CS-1;V(mutex);… P2: …program2…; P3: …P(mutex);CS-3;V(mutex);… ============================ P3最先执行,执行P操作后,进入临界区 时刻a,P2就绪,抢占P3的处理机而运行 时刻b,P1就绪,抢占P2的处理机而运行 时刻c,P1执行P操作,阻塞;P2继续运行 时刻d,P2运行完毕;P3接着运行 时刻e,P3退出临界区,唤醒P1;因P1优先级高,抢占P3的处理机而运行
按照以上的运行情况,违背了优先级高的进程优先执行的原则。因为:根据优先级原则,高优先级进程应当优先执行,但在此例中,P1和P3共享着“临界资源”,而出现了不合常理的现象。高优先级进程P1因P3进程阻塞了,又因为P2进程的存在而延长了P1被阻塞的时间,而且被延长的时间是不可预知和无法限定的。
因此所产生的“优先级倒置”的现象是非常有害的,它不应出现在实时系统中。
5,死锁概述
5.1,资源问题
5.2,计算机系统中的死锁
死锁的起因:竞争不可抢占性资源引起死锁、竞争可消耗资源引起死锁、进程推进顺序不当引起死锁。
竞争不可抢占性资源引起死锁
系统中有两个进程P1和P2,它们都准备写两个文件F1和F2,而这两者都属于可重用和不可抢占性资源。
进程P1先打开F1,然后再打开文件F2;进程P2先打开F2,然后再打开文件F1;
竞争可消耗资源引起死锁
三个进程之间,在利用消息机制进行通信时产生的死锁情况。其中,m1、m2、m3是可消耗资源。
P1:send(P2,m1);receive(P3,m2); P2:send(P3,m2);receive(P1,m3); P3:send(P1,m3);receive(P2,m1); =========切换顺序后死锁======== P1:receive(P3,m2);send(P2,m1); P2:receive(P1,m3);send(P3,m2); P3:receive(P2,m1);send(P1,m3);
进程推进顺序不当引起死锁
例如,系统中只有一台打印机R1和一台磁带机R2,可供进程P1和P2共享,按照如下4种请求顺序执行,会出现死锁。
5.3,死锁的定义、必要条件和处理方法
死锁:一组进程中的每一个都在等待仅由该组进程中的其他进程才能引发的事件。
死锁产生的必要条件
①互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只供一个进程占用。如果此时其他进程请求该资源,请求者只能等待—(资源独占)
②请求和保持:指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又已被其它进程占用,此时请求进程阻塞,但又对自己已获得的其它资源保持不放—(部分分配,占有申请)
③不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放;
④环路等待条件:指在发生死锁时,必然存在一个进程—资源的环形链,即进程集合{P0,P1,P2,…,Pn}中的P0正等待一个P1占用的资源,P1正等待一个P2占用的资源,…,Pn正等待已被P0占用的资源。
处理死锁的基本方法
- 预防死锁:该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件,来预防发生死锁。由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量的降低。
- 避免死锁发生:也是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的四个必要条件。而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁。常用的算法是银行家算法。
- 检测死锁:不须事先采取限制性措施,也不必检查系统是否进入不安全区,而是允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源;然后采用适当的措施从系统中将已发生的死锁清除掉。
- 解除死锁:与检测死锁相配套的一种措施。检测到系统中已发生死锁时,将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。
6,预防死锁
定义:预防死锁的方法是通过破坏产生死锁的四个必要条件中的一个或几个,以避免发生死锁。
6.1,破坏“请求和保持”条件
为破坏该条件,系统必须保证做到:当一个进程在请求资源时,它不能持有不可抢占资源。
1,第一种协议
规定:所有进程在运行之前,必须一次性地申请其在整个运行过程中所需的全部资源。这样进程在运行中,便不会再提出资源请求,从而破坏了“请求”条件。
系统在分配资源时,只要有一种资源不能满足进程的要求,即使其它所需的各项资源都空闲也不分配给该进程,而让该进程等待。由于该进程在等待期间未占有任何资源,于是破坏了“保持”条件。
2,第二种协议
规定:允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源,然后再请求新的所需资源。
例:磁带机复制数据到磁盘,然后再交给打印机打印。
第一种协议:需要磁带机、磁盘和打印机都空闲时,该进程方可开始;
第二种协议:开始时只申请磁带机和磁盘,然后就可运行,等磁带上的全部数据都已复制到磁盘文件并排序好后,就可将磁带机和磁盘释放,再去申请打印机。
6.2,破坏“不可抢占”条件
当一个已经保持了某些不可被抢占资源的进程,提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。
代价:① 以前的工作失效 ;② 反复申请释放使进程无限期推迟;③ 系统开销大,降低了系统吞吐量
6.3,破坏“环路等待”条件
① 把系统中所有资源顺序编号:r1,r2,…,rn;② 各进程按资源编号递增次序申请资源;
例如:将系统中的资源依次编号为1,2,3,4,5,6,…,10.若1号设备是键盘,2号设备是扫描仪,9号设备是打印机,则有进程P1,P2,P3都需要这三种设备时,对设备的申请顺序如下
优点:与前两种策略比较,其资源利用率和系统吞吐量都有较明显的改善。
缺点:①为系统中各类资源所分配(确定)的序号必须相对稳定,这就限制了新设备的添加;②尽管在为资源的类型分配序号时,已经考虑到大多数作业在实际使用这些资源时的顺序,但也经常发生这种情况:即作业(进程)使用各类资源的顺序与系统规定的顺序不同,造成对资源的浪费。如:某进程先用磁带机,再用打印机。但按系统规定,该进程应先申请打印机而后申请磁带机,致使先获得的打印机被长时间闲置,造成资源的极大浪费。 ③为方便用户,系统对用户在编程时所施加的限制条件应尽量少。然而这种按规定次序申请的方法,必然会限制用户简单、自主地编程。
7,避免死锁
在预防死锁的方法中,都施加了较强的限制条件;在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。该方法中把系统的状态分为安全状态和不安全状态,只要使系统始终都处于安全状态,便可避免发生死锁。
7.1,安全状态
1,安全状态
允许进程动态地申请资源,系统在进行资源分配之前,应先计算此次资源分配的安全性。
避免死锁的实质在于:系统在进行资源分配时,如何使系统不进入不安全状态。
避免死锁的基本思想:就是确保系统始终处于安全状态。一个系统开始是处于安全状态的,当有进程请求一个可用资源时,系统需要对该进程的请求进行计算,若将资源分配给进程后系统仍处于安全状态,才将该资源分配给进程。
安全状态,是指系统能按某种进程顺序(P1, P2, …, Pn),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
2,安全状态例子
系统中有进程P1、P2、P3和12台磁带驱动器,各进程对此资源的需求和分配情况如下表所示,此时按照安全序列< P2, P1, P3 >分配资源可以保证各进程都顺利完成。
系统把剩余3台中 的1台分配给P3,则系统便进入不安全状态。因此此时也无法再找到一个安全序列。
7.2,利用银行家算法避免死锁
把这种算法比作银行家,银行家占有有限的资金(资源),把进程比作借款人,如果借出去的款能收回则出借(分配资源),否则拒绝贷款。
算法原理:每次分配检查系统是否存在一个进程安全序列,存在一个安全序列则分配,反之,拒绝分配,让申请的进程阻塞。如果系统无法找到这样的一个安全序列,则称系统处于不安全状态。
例:进程P0 , P1 , P2 , P3 , P4共享A、B、C三类资源 {A,B,C}={10,5,7}T0时刻,资源的分配情况如图所示。
(1)该状态是否安全?若安全,请找出安全序列。(2)在此基础上,P1 申请(1,0,2)能否分配?为什么?
(1)有P1, P3, P4, P0, P2安全序列,T0时刻分配合法(注意:安全序列不唯一)
(2)存在P1,P3,P4,P0,P2安全序列,真正的把(1,0,2)分给P1
(3)P4 申请(3,3,0)能否分配?为什么?(4)P0 申请(0,2,0)能否分配?为什么?
(3)P4请求Request {3 3 0},由于P1分配后:Available = {2 3 0} < Request {3 3 0} 无资源可用,让 P4阻塞。
(4)P0请求Request {0 2 0},由于P1分配后:Available = { 2 3 0} 假设把{0 2 0}分配给P0,则:Available = { 2 1 0} 用安全算法检查。
8,死锁的检测与解除
如果在系统中,既不采取死锁预防措施,也未配有死锁避免算法,系统很可能会发生死锁。此时,系统应提供两种算法:
- 死锁检测算法 用于检测系统状态,以确定系统中是否发生了死锁;
- 死锁解除算法 认定系统中已发生死锁时,利用该算法可将系统从死锁状态中解脱出来;
8.1,死锁的检测
1,资源分配图
资源分配图:用结点和有向边描述系统的状态,状态的改变通过申请、分配、释放三种操作实现。
用有向图描述进程的死锁,图中包括:
- 进程结点集合: P={ P1, P2 , … , Pn }
- 资源结点集合: R={ R1, R2 , … , Rm }
- 有向边集合: E={( Pi , Rj ) , ( Rj , Pi )}
2,死锁定理
为死锁的充分条件是:当且仅当S状态的资源分配图是不可完全简化的。
资源分配图的简化:找到一个既不阻塞又非独立的进程结点Pi。在顺利的情况下,Pi可获得所需资源而继续运行,直至运行完毕,再释放其所占有的全部资源,这相当于消去Pi的请求边和分配边,使之成为孤立的结点。循环进行,如果所有进程都成为孤立结点,则该图是可简化的,若不能使所有结点成为孤立结点,则该图不可简化。
8.2,死锁的解除
1,撤销进程
- 终止所有死锁进程:代价大,被终止进程的前期工作必须放弃。
- 一次终止一个进程直到取消死锁循环为止:系统开销大,每次终止进程时都要调用死锁检测算法确定进程是否仍处于死锁。
2,资源剥夺
- 逐步从进程中剥夺资源给其他进程使用,直到死锁环被打破为止。
为解除死锁状态所需撤销的进程数目最小;或者,撤销进程所付出的代价最小;可采用以下策略。
假定在死锁状态时,有死锁进程P1,P2,…,Pk。首先,撤销进程P1,使系统状态由S→U1,付出的代价为Cu1,然后,仍然从S状态中撤销进程P2,使状态由S→U2,其代价为Cu2,…,如此下去可得到状态U1,U2,…,Uk。若此时系统仍处于死锁状态,需再进一步撤销进程,如此下去,直至解除死锁状态为止。这种方法为解除死锁状态可能付出的代价将是(k(k-1)(k-2)…/2)C。花费代价较高,很不实际的方法。