操作系统第三章—处理机调度与死锁

调度算法

饥饿的概念:某进程/作业长期得不到服务

先来先服务(FCFS)

算法思想:主要从“公平”的角度考虑(排队买东西)

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

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

是否可抢占?
非抢占式的算法

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

是否会导致饥饿? 不会

短作业优先(SJF)

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

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

用于作业/进程调度:
即可用于作业调度,也可用于进程调度。用于进程调度时称为“断进程优先(SPF)算法”

是否可抢占?
SJF和SPF是非抢占式的算法。但是也有抢占式的版本—最短剩余时间优先算法(SRTN)

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

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

高响应比优先(HRRN)

将FCFS和SJF的优点综合在了一起。

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

算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。
在这里插入图片描述

用于作业/进程调度: 即可用于作业调度,也可用于进程调度

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

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

是否会导致饥饿:不会

总结

交互性很糟糕,这三种算法适合用于早期的批处理系统。
在这里插入图片描述

时间片轮转(RR)

常用于分时操作系统,更注重“响应时间”。

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

算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。

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

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

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

是否会导致饥饿?不会

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

优先级调度算法

算法思想:随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序

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

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

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

优缺点:
优点:用优先级区分紧急程度,重要程度,适用于实时操作系统。可灵活地调整对各个作业/进程的偏好程度

缺点:若源源不断地有高优先级进程到来,则可能导致饥饿。

是否会导致饥饿:会。

补充:
就绪队列未必只有一个,可以按照不同优先级来组织。另外,也可以把优先级高的进程排在更靠近队头的位置
根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级两种:
静态优先级:创建进程时确定,之后一直不变;
动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级。

多级反馈队列

总结一下之前的,FCFS算法的优点是公平,SJF算法的优点是能尽快处理完短作业,平均等待/周转时间等参数很优秀,时间片轮转调度算法可以让各个进程得到及时的响应,优先级调度算法可以灵活地调整各种进程被服务的机会。对这些算法折中权衡,我们得到了多级反馈队列调度算法。

算法思想:对其他调度算法的折中权衡
算法规则:在这里插入图片描述
用于作业/进程调度:用于进程调度
是否可抢占:
在这里插入图片描述

优缺点:

是否会导致饥饿:-

死锁

概念

在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。比如哲学家问题,每位哲学家都拿起左边的筷子后,右边的筷子一直没办法拿到就发生死锁。
发生死锁后若无外力干涉,这些进程都将无法向前推进。

死锁 饥饿 死循环的区别

死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。

饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。

死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑bug导致的,有时是程序员故意设计的。
在这里插入图片描述

死锁产生的必要条件

产生死锁必须同时满足一下四个条件,只要其中任一条件不成立,死锁就不会发生。

互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁。

不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放

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

循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

注意!发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件),因为如果同类资源大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。

什么时候会发生死锁

对不可剥夺资源的不合理分配,可能导致死锁。

死锁的处理策略

在这里插入图片描述

1.预防死锁。破环死锁产生的四个必要条件中的一个或几个。
2.避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
3.死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后解除死锁。

预防死锁

破坏四个必要条件其中一个

破坏互斥条件

互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁
如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如:SPOOLing技术。操作系统可以采用该技术把独占设备在逻辑上改造成共享设备。

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

破坏不剥夺条件

不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

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

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

破坏请求和保持条件

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

可以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行,一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。

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

破坏循环等待条件

循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

可采用顺序资源分配法,首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完。

原理分析:一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象。

该策略的缺点:
1.不方便增加新的设备,因为可能需要重新分配所有的编号。
2.进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费。
3.必须按规定次序申请资源,用户编程麻烦。

总结:
在这里插入图片描述

避免死锁

什么是安全序列

所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。
如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前

什么是系统的不安全状态,与死锁有何联系
如何避免系统进入不安全状态—银行家算法

检测和解除

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值