操作系统-死锁

死锁的概念

什么是死锁?

死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程
举个栗子:小王和小李,每个人都有一包薯片,小王有一包黄瓜为的乐士薯片,小李有一包西瓜味的乐士薯片,两个人都很馋,都想吃对方手里的薯片,但是他们交换薯片的前提前提条件是:必须要先拿到对方的薯片后,才能把自己的薯片给他,于是他们两个人一直在等待对方先交出手里的薯片,于是就一直僵持下去,形成死锁。

进程死锁,饥饿,死循环的区别

饥饿:比如在短进程优先算法中,,加入有很多的短进程作业进来时,长进程一直得不到调度,所以会导致长进程饥饿
死循环:程序代码问题,while(true)
他们三个的共同点:无论处理哪个状态,进程都无法向前继续推进,卡在原地。
区别:
1.死锁一定是两个或者两个以上的进程同时发生死锁,因为他们是因为等待对方手里的资源导致的,发生死锁的进程一定是阻塞态。
2.进程数不固定,可能一个,可能多个,进程可能是阻塞态(一直得不到IO设备等资源),也可能是就绪态(一直得不到处理机的资源)
3.死循环的进程数也不固定,可能一个,也可能多个,而且死循环的进程可以在处理机上运行(运行态),死循环一般都是由于程序员编码错误导致,而前两者都是由于操作系统分配资源不合理导致的。

死锁产生的必要条件

1.互斥:各个进程争夺的资源必须是互斥的资源,如哲学家的筷子
2.不剥夺:各个进程在占有的资源未使用完之前,不会被其他进程抢走,只能主动释放资源。
3.保持和请求:进程已经保持了一个资源的同时,还想要请求其他进程的资源,其他进程资源被占有,但又对自己资源不放手。可以理解为:吃着碗里的,想着别人碗里的
4.循环等待:各进程之间形成资源循环等待链,每个进程在占有自身资源的同时,还被其他进程所请求,即每个人吃着自己碗里肉的同时,自己碗里的肉也被其他人惦记着

循环等待是发生死锁的必0要不充分条件

哲学家进程的问题,各个哲学家之间循环等待,但是如果有一个人插进来,将筷子给其中任意一个哲学家的话,就不会发生死锁。

什么时候会发生死锁

1 .对不可剥夺资源(打印机,摄像头等等)的竞争可能死锁。
2.进程请求和释放资源顺序不当,进程p1,p2分别请求了r1,r2资源,在分别占有r1和r2的同时,还分别申请r2和r1资源,两个进程会因为请求的资源被对方所占有,而导致死锁。

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

死锁的处理策略

> 1.预防死锁:破坏4个必要条件中的一个或几个

破坏互斥条件:将原来必须互斥才能使用的资源改造成允许共享使用,则系统不会进入死锁状态。
栗子
p1进程在未使用玩打印机,p2无法使用打印机。在p1,p2进程和打印机资源中间建立一个输出进程,将p1和P2的请求输入到输出进程,在各进程看来,自己的打印机的请求立即被接收处理了,好像两个打印机在同时使用打印机。(SPOOLing技术)
不足:并不是所有的资源都可改造成共享的资源。为了系统安全,这种改造在很多情况下是不允许的。

破坏不剥夺条件
planA:某个进程资源请求的资源得不到满足时,主动放下保持的所有资源,即某些资源尚未用完,也需要主动释放。
planB:某个进程请求的资源被其他进程所占有时,可以由操作系统协助,将想要的资源进行剥夺。考虑进程的优先级
栗子
(我想要吃那个炸鸡,但是被他抢走了,我去叫我大哥(操作系统)给我抢回来。因为我跟我大哥关系,比你俩好(优先级高))
不足
1释放已经获得的资源,容易造成前一个阶段的工作失效,只适用于易保存和恢复的资源,cpu
2.反复申请释放,增加系统开销,降低系统吞吐量。
3.如果是planA的话,得不到请求的资源就释放保持的资源,以后在重新申请,容易导致进程饥饿。
栗子
(比如A进程,得到了打印机资源,准备打印的时候,A进程又要请求摄像头资源,摄像头资源没有的到的话,就会放弃打印机资源,得到打印机资源的就绪阶段都在做无用功,一直这样的话,A进程就会,没打印,也没得到摄像头资源,导致饥饿)

破坏请求和保持:进程在运行前一次分配他需要的所有资源,如果有资源未申请到,则进程A不运行,一旦运行,则资源不被其他进程所剥夺。
栗子
(我想要穿着鸿星尔克的鞋,吃炸鸡,热干面(用电风扇吹10秒钟),葡萄,香蕉,喝汇源果汁…少一样我都不干,都满足的话,每样东西都不能被其他人抢走。)
不足:如果资源的占用时间很少,而且在整个运行期间和保持着该资源,则会造成验证的资源浪费。(比如上边的用电风扇吹10秒钟热干面,只用了10s钟,但是完了,别人还不能被其他人使用,可以理解为我很自私,不!是进程很自私!!!)

破坏循环等待:顺序资源分配法。系统中资源编号,从小到大依次编号,进程只有在申请完小号资源的时候,才能申请大编号资源。已经持有大编号资源的进程不能逆向地申请小编号资源,从而就不会导致循环等待条件(因为总有一个进程是畅通无阻的)
不足:
1.不方便添加新设备,编号要重新设置。
2.必须要按规定次序申请资源,用户变成麻烦。
3.进程实际使用的资源编号顺序可能和递增顺序不一致,导致资源的浪费。

> 2.避免死锁:采用算法避免

银行家算法:传送门(很经典!)
我的理解就是:
当某个进程想要请求资源时,系统先预判(即如果给了他资源系统是否安全??),如果安全,则分配给该进程,如果不安全,则作废刚才的分配策略。

> 3.检测和解除:检测到发生了死锁,采取某种方法解除死锁。

如果既没有采用避免死锁的办法,也没有采用预防死锁的办法,系统就可能发生死锁,于是就有了响应的对策–>
死锁的检测算法:依次消除与不阻塞进程相连的边,直到无边可销。
最后是P1,P2的边都被消除,所以一定没有发生死锁,相当于找到了安全序列。
在这里插入图片描述
栗子:
在这里插入图片描述

死锁的解除:

资源剥夺法:将某些死锁了的进程进行挂起,剥夺他的资源,将这些剥夺的资源分配给其他死锁进程,来解决某些死锁的进程,防止挂起的进程时间太久导致饥饿。
终止进程法:将某些死锁进程终止,不足就是代价太大,如果一个进程执行了好几分钟,马上就要执行完了,被终止的话,前边的就都功归一篑了。
进程回退法:让一个或者多个进程回退到足以避免死锁的地步。

啊~,已经好晚了,明天继续努力!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值