对死锁的一点思考

死锁

什么是死锁?
比如两个进程分别占有一部分资源,另外还等待对方所占的资源,于是两者都不能执行而处于永远等待状态,此现象称为死锁。

死锁产生的条件

  • 互斥条件
    临界资源是互斥访问的,我用时你不能用
  • 等待条件
    我需要的资源得不到满足时,我会一直等下去。
  • 不剥夺条件
    已获资源只能由我自愿释放,不允许被其他进程剥夺。
  • 循环等待条件
    存在循环等待链,a等b,b等c,c等a

死锁只有在这四个条件同时满足时出现

临界资源&临界区
临界资源是指每次仅允许一个进程访问的资源
临界区是保证一次只有一个进程访问临界资源的代码

防止死锁的发生

既然要同时满足以上四个条件,死锁才会发生,那么我们只要破坏其中任一条件即可防止死锁的发生。

方法评价:
破坏任一条件确实能够防止发生死锁,但必然会降低系统并发性,导致低效的资源利用率

破坏互斥条件

使资源同时访问而非互斥使用,就没有进程会阻塞在资源上,从而不发生死锁。

方法评价:
只读数据文件、磁盘等软硬件资源均可采用这种办法管理;
但是许多资源是独占性资源,如可写文件、键盘等只能互斥的占有;
所以这种做法在许多场合是不适用的。

破坏占有和等待条件

采用静态分配的方式,静态分配的方式是指进程必须在执行之前就申请需要的全部资源,且直至所要的资源全部得到满足后才开始执行。

方法评价:
实现简单,但是严重的减低了资源利用率。
因为在每个进程占有的资源中,有些资源在运行后期使用,有些资源在例外情况下才被使用,可能会造成进程占有一些几乎用不到的资源,而使其他想使用这些资源的进程等待。

破坏不剥夺条件

设置可以强行剥夺某进程占用的资源能够防止死锁

方法一:占有资源的进程若要申请新资源,必须主动释放已占有资源,若需要此资源,应该向系统重新申请。——申请新的之前把现有的释放

方法二:资源分配管理程序为进程分配新资源时,若有则分配;否则将剥夺此进程已占有的全部资源,并让进程进入等待资源状态,资源充足后再唤醒它重新申请所有所需资源。——申请失败连先有的也没了

破坏循环等待条件

给系统的所有资源编号,规定进程请求所需资源的顺序必须按照资源的编号依次进行

银行家算法

通过破坏四个条件中的任意一个,死锁就不会发生了
那严格遵守这四个条件能否防止死锁发生呢?
可以,银行家算法

银行家算法是一种最有代表性的避免死锁的算法。
该算法允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
在这里插入图片描述
算法评价:
对资源的分配加以适当限制可避免死锁发生,但不利于进程对系统资源的充分共享

死锁恢复

当死锁真的发生了,该如何恢复呢

恢复方式主要有以下三种:

  • 资源剥夺法
    剥夺陷于死锁的进程所占用的资源,但并不撤销此进程,直至死锁解除。
  • 进程回退法
    根据系统保存的检查点让所有的进程回退,直到足以解除死锁,这种措施要求系统建立保存检查点、回退及重启机制。
  • 进程撤销法
    • 撤销陷入死锁的所有进程,解除死锁,继续运行。
    • 逐个撤销陷入死锁的进程,回收其资源并重新分配,直至死锁解除。

OS如何实现的锁?

在硬件层面,CPU提供了原子操作、关中断、锁内存总线的机制,OS基于这几个CPU硬件机制实现的锁;

那么锁在操作系统中是怎么实现的呢?
使用中断启用与禁止来实现锁:
中断禁止:就是禁止打断,可以将一系列操作变为原子操作
中断启用:就是从这里开始,可以被打断,允许操作系统进行调度

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值