3.3、实时调度
3.3.1、常用的几种实时调度算法
1、最早截止时间优先即EDF(Earliest Deadline First)算法
该算法是根据任务的开始截止时间来确定任务的优先级。截止时间愈早,其优先级愈高。该算法要求在系统中保持一个实时任务就绪队列,该队列按各任务截止时间的早晚排序;当然,具有最早截止时间的任务排在队列的最前面。调度程序在选择任务时,总是选择就绪队列中的第一个任务,为之分配处理机,使之投入运行。最早截止时间优先算法既可用于抢占式调度,也可用于非抢占式调度方式中。
2、最低松弛度优先即LLF(Least Laxity First)算法
该算法是根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度愈高,为该任务所赋予的优先级就愈高,以使之优先执行。例如,一个任务在200 ms 时必须完成,而它本身所需的运行时间就有100 ms,因此,调度程序必须在100 ms之前调度执行,该任务的紧急程度(松弛程度)为100 ms。又如,另一任务在400 ms 时必须完成,它本身需要运行150 ms,则其松弛程度为 250 ms。在实现该算法时要求系统中有一个按松弛度排序的实时任务就绪队列,松弛度最低的任务排在队列最前面,调度程序总是选择就绪队列中的队首任务执行。
3.4、产生死锁的原因和必要条件
所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
3.4.1 产生死锁的原因
产生死锁的原因可归结为如下两点:
(1) 竞争资源。当系统中供多个进程共享的资源如打印机、公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。
(2) 进程间推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。
3.4.2 产生死锁的必要条件
虽然进程在运行过程中可能发生死锁,但死锁的发生也必须具备一定的条件。综上所述不难看出,死锁的发生必须具备下列四个必要条件:
(1) 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求该资源,则请求者只能等待,直至占有该资源的进程用毕释放。
(2) 请求和保持条件:指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
(3) 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
(4) 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,…,Pn}中的P0正在等待一个P1占用的资源; P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
3.4.3、处理死锁的基本方法
目前,处理死锁的方法可归纳为四种:预防死锁、避免死锁、检测死锁、解除死锁。
3.4.4、死锁的避免
预防死锁的方法中所采取的几种策略,总的来说都对资源的使用施加了较强的限制条件,虽然实现起来较为简单,但却严重的损害了系统性能。
在死锁的避免方法中,不对进程申请资源的施加限制条件,而是检查进程的资源申请是否会导致系统进入不安全状态,只要能使系统始终处于安全状态,便可以避免死锁的发生。由于该方法对进程使用资源所施加的限制条件较弱,从而可能获得较好的系统性能。
具有代表性的死锁避免算法是Dijkstra给出的银行家算法。
3.4.5、死锁的解除
一旦检测出系统中出现了死锁,就应将陷入死锁的进程从死锁状态中解脱出来,常用的解除死锁的方法有如下两种:
☆ 资源剥夺法:当发现死锁后,从其他进程那里剥夺足够数量的资源给死锁进程,以解除死锁状态。
☆ 撤销进程法:最简单的方法是撤销全部死锁进程,使系统恢复到正常状态,但这种做法付出的代价太大。另一个方法是按照某种顺序逐个撤销死锁进程,直到足够的资源供其他未被撤销的进程使用,消除死锁状态为止。