【操作系统】三、处理机调度与死锁

目录

1.处理机调度的概念、层次

1.1基本概念

1.2三个层次

1.2.1高级调度

1.2.2中极调度

1.2.3低级调度

2.进程调度的时机,切换方式与过程

3.调度算法

3.1调度算法的评价指标及其关系

3.2调度算法

3.2.1先来先服务(FCFS,First Come First Serve)

3.2.2短作业优先(SJF/SPF,Short Job/Process First)

3.2.3高优先权优先调度算法

3.2.4高响应比优先调度算法(HRRN,Highest Response Ratio Next)

3.2.5基于时间片的轮转调度算法(RR,Round Robin)

3.2.6多级反馈队列调度算法

4.死锁

4.1基本知识

4.2处理策略

4.2.1预防死锁

4.2.2避免死锁(银行家算法)

4.2.3死锁的检测和解除


1.处理机调度的概念、层次

1.1基本概念

当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。
处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。

1.2三个层次

1.2.1高级调度

高级调度(作业调度(接纳调度)或长程调度)。按一定的原则从外存上处于后备队列的作业中,挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它们获得竞争处理机的权利。

作业不仅包含了通常的程序与数据,还配有一份作业说明书,系统根据该说明书对程序的运行进行控制。
高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。

1.2.2中极调度

引入了虚拟存储技术,把外存上那些又具备运行条件的就绪进程重新调入内存,故又称内存调度。目的:提高内存利用率和系统吞吐量。

中级调度实际上就是存储器管理中的对换功能。

1.2.3低级调度

又称进程调度(短程调度),调度对象是进程。从就绪队列中选择一个进程,再由分派程序把处理机分配给该进程的具体操作。

进程调度的两种调度方式

a.非抢占式方式。

b.抢占式方式。抢占原则:优先权原则;短作业(进程)优先原则;时间片原则

选择调度方式和算法时应遵循的原则

a.面向用户:周转时间短;响应时间快;截至时间的保证;优先权准则。

b.面向系统:系统吞吐量高;处理机利用率高;各类资源平衡利用

2.进程调度的时机,切换方式与过程

不能进行进程调度的情况:

①在处理中断的过程中。中断处理过程复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换。
②进程在操作系统内核程序临界区中。(进程在普通临界区是可以进行调度和切换的)
③在原子操作过程中(原语)。原子操作不可中断,要一气呵成(如之前讲过的修改PCB中进程状态标志,并把PCB放到相应队列)

3.调度算法

3.1调度算法的评价指标及其关系

CPU利用率

系统吞吐量:单位时间内完成作业的数量

周转时间:是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。包括四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等待进程调度(低级调度)的时间——就绪态、进程在CPU上执行的时间——活动态、进程等待I/O操作完成的时间——阻塞态。后三项在一个作业的整个处理过程中,可能发生多次。

平均周转时间:

T=\frac{1}{n}\sum_{i=1}^{n}T_{i}

带权周转时间:(T_{s} 是系统为作业提供服务的时间)

W=\frac{T}{T_{s}}

平均带权周转时间:

W=\frac{1}{n}\sum_{i=1}^{n}\frac{T_{i}}{T_{S_{i}}}

服务时间 + 开始执行时间 = 完成时间

完成时间 - 到达时间 = 周转时间

周转时间 / 服务时间 = 带权周转时间

响应比 R_{p} =(等待时间+要求服务时间)/ 要求服务时间 = 响应时间 / 要求服务时间

3.2调度算法

3.2.1先来先服务(FCFS,First Come First Serve)

算法规则:按照作业/进程到达的先后顺序进行服务。

用于作业/进程调度。用于作业调度时,考虑的是哪个作业先到达后备队列:用于进程调度时,考虑的是哪个进程先到达就绪队列。

非抢占式的算法。

优点:公平、算法实现简单
缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即,FCFS算法对长作业有利,对短作业不利。

不会导致饥饿(进程/作业长期得不到服务)

3.2.2短作业优先(SJF/SPF,Short Job/Process First)

算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间

算法规则:最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)

用于作业调度/进程调度。用于进程调度时称为“短进程优先(SPF, Shortest Process First)算法”

SJF/SPF是非抢占式的算法——当前已到达且最短的优先。但是也有抢占式的版本――最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)

SRTN:(1)每当有进程加入就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。(2)当一个进程完成时也需要通过比较剩余时间来进行调度。

来看下面例题的分析:

结论:抢占式的短作业/进程优先调度算法(最短剩余时间优先, SRNT算法)的平均等待时间、平均周转时间最少。

优点:“最短的”平均等待时间、平均周转时间。
缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先。

如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死”。

3.2.3高优先权优先调度算法

算法规则:调度时选择优先级最高的作业/进程。

既可用于作业调度,也可用于进程调度。甚至,还会用于在之后会学习的I/O调度中。

抢占式、非抢占式都有。做题时的区别在于:非抢占式只需在进程主动放弃处理机时进行调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占。

优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。缺点:若源源不断地有高优先级进程到来,则可能导致饥饿。

适用于交互式系统。

优先权调度算法的类型

a.非抢占式优先权算法:用于批处理系统或实时性要求不严的实时系统。

b.抢占式优先权算法:用于实时性要求严的实时系统或对性能要求高的批处理系统和分时系统。

优先权的类型

a.静态优先权:是在创建进程时确定的,且在进程的整个运行期间保持不变,优先权用某个范围的一个整数表示。确定依据:进程类型;进程对资源的需求;用户需求。

b.动态优先权:是在创建进程时确定的,是可以随进程的推进和等待时间的增加而改变。

3.2.4高响应比优先调度算法(HRRN,Highest Response Ratio Next)

算法思想:要综合考虑作业/进程的等待时间和要求服务的时间。 

算法规则:在每次调度时先计算各个作业/进程的响应比(>=1),选择响应比最高的作业/进程为其服务。

用于作业/进程调度。

是非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比。

 综合考虑了等待时间和运行时间(要求服务时间)——等待时间相同时,要求服务时间短的优先( SJF的优点);要求服务时间相同时,等待时间长的优先(FCFS的优点)。对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题。

3.2.5基于时间片的轮转调度算法(RR,Round Robin)

时间片大小的确定:略大于一次典型的交互所需时间。

算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应。

算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队;而新到达的进程被放在队首。若某进程在一时间片内运行期间有新进程到达,则新进程在队尾等待该进程执行完这个时间片。

用于进程调度(只有作业放入内存建立了相应的进程后,才能被分配处理机时间片)。

若进程未能在时间片内运行完,将被强行剥夺处理机使用权,因此时间片轮转调度算法属于抢占式的算法。由计时器发出时钟中断来通知CPU时间片已到。

如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此时间片不能太大。
另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小。

优点:公平;响应快,适用于分时操作系统;不会导致饥饿。
缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度。

适用于交互式系统。

3.2.6多级反馈队列调度算法

实施过程:

①应设置多个就绪队列,并未各个队列 赋予不同的优先级,各队列优先权逐个降低;赋予各个队列的时间片的大小各不相同,在优先权越高的队列中,为每个进程赋予的时间片越小。

②当一个新进程进入内存后,首先将它放入第一个队列的末尾,按FCFS原则排队等待调度;对于长作业,它将依次在第1,2,......,n个队列中运行,然后按时间片轮转方式运行。

③仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。

用于进程调度。

抢占式的算法。在n级队列的进程运行过程中,若1~n-1级的队列中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回n级队列队尾。

性能优点:满足各种用户类型(终端型/短批处理作业/长批处理作业用户)的需要。

会导致饥饿。

适用于交互式系统(如UNIX)。

4.死锁

4.1基本知识

定义:死锁指的是多个进程在运行过程中因竞争资源而造成的一种僵局,当进程处于这种僵局状态时,若无外力作用,他们都将无法向前推进。

死锁饥饿死循环的区别:

死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。
饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。
死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑bug导致的,有时是程序员故意设计的。

引起死锁的原因

1)竞争资源

可剥夺性资源与非剥夺性资源;永久性资源和临时性资源

箭头从进程指向资源表示请求;反之表示资源分配给进程

2)进程间的推进顺序非法(请求和释放资源的顺序不当)

4.2处理策略

4.2.1预防死锁

破坏死锁产生的四个必要条件中的一个或几个。

必要条件:互斥条件;请求和保持条件;不剥夺条件;环路等待条件(产生死锁必须同时满足这四个条件,只要其中任一条件不成立,死锁就不会发生)

1.破坏互斥条件

互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求该资源,则请求者只能等待,直至占有该资源的进程用毕释放。

如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如: 操作系统可以采用SPOOLing 技术把独占设备在逻辑上改造成共享设备。比如,用SPOOLing技术将打印机改造为共享设备。

该策略的缺点:并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全,很多地方还必须保护这种互斥性。因此,很多时候都无法破坏互斥条件。
 

2.破坏不剥夺条件

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

破坏不剥夺条件方案:

方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时再重新申请。也就是说,即使某些资源尚未使用完,也需要主动释放,从而破坏了不可剥夺条件。
方案二:当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级(比如:剥夺调度方式,就是将处理机资源强行剥夺给优先级更高的进程使用)

该策略的缺点:
1.实现起来比较复杂。
2.释放已获得的资源可能造成前一阶段工作的失效。因此这种方法一般只适用于易保存和恢复状态的资源,如CPU。
3.反复地申请和释放资源会增加系统开销,降低系统吞吐量。
4.若采用方案一,意味着只要暂时得不到某个资源,之前获得的那些资源就都需要放弃,以后再重新申请。如果一直发生这样的情况,就会导致进程饥饿。
 

3.破坏请求和保持条件

请求和保持条件:指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

系统规定所有进程在开始运行之前,都必须一次性地申请其在整个运行过程所需的全部资源。此时,若系统有足够的资源分配给某进程,便可把其需要的所有资源分配给该进程,这样,该进程在整个运行期间便不会再提出资源要求,从而摒弃了请求条件。但在分配资源时,只要有一种资源不能满足某进程的要求,即使其它所需的各资源都空闲,也不分配给该进程,而让该进程等待。由于在该进程的等待期间,它并未占有任何资源,因而也摒弃了保持条件,从而可以避免发生死锁。

该策略实现起来简单,但也有明显的缺点:
有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就造成严重的资源浪费,资源利用率极低。另外,该策略也有可能导致某些进程饥饿。

 

4.破坏环路等待条件

环路等待:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合 { P0P1,P2P中的P0正在等待一个P1占用的资源; P1正在等待P2占用的资源,……Pn正在等待已被P0占用的资源。

系统将所有资源按类型进行线性排队,并赋予不同的序号。所有进程对资源的请求必须严格按照资源序号递增的次序提出。同类资源(编号相同的资源)一次申请完。

缺点:

限制了新类型设备的增加;作业(进程)使用各类资源的顺序与系统规定的顺序不同,造成对资源的浪费;这种按规定次序申请的方法,会限制用户简单、自主地编程。

4.2.2避免死锁(银行家算法)

用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)

安全序列:指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态,一定不会发生死锁。安全序列可能有多个

避免死锁的实质在于:系统在进行资源分配时,如何使系统不进入不安全状态。

因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。
 

数据结构:

长度为m的一维数组Available表示还有多少可用资源

n*m矩阵Max表示各进程对资源的最大需求数

n*m矩阵Allocation表示已经给各进程分配了多少资源

Max - Allocation = Need矩阵表示各进程最多还需要多少资源

用长度为m的一位数组Request表示进程此次申请的各种资源数

银行家算法步骤:
①检查此次申请是否超过了之前声明的最大需求数;②检查此时系统剩余的可用资源是否还能满足这次请求;③试探着分配,更改各数据结构;④用安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法步骤:
检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
不断重复上述过程,看最终是否能让所有进程都加入安全序列。

4.2.3死锁的检测和解除

允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。

资源分配图:

如果按上述过程分析,最终能消除所有的边,就称这个图是可完全简化的,此时一定没有发生死锁。(相当于能找到一个安全序列)
如果最终不能消除所有边,那么此时就是发生了死锁。最终还连着边的那些进程就是处于死锁状态的进程。

死锁定理:如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁

常采用解除死锁的方法是:
1.资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
2.撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资
源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。
3.进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程
的历史信息,设置还原点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值