现代操作系统-死锁
死锁的规范定义:如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是死锁的。
大部分死锁都与资源相关。
资源分为两类:可抢占和不可抢占的,可抢占资源可以从拥有它的进程中抢占而不会产生任何副作用,存储器就是一类可抢占的资源。例如,一个系统拥有256M的用户内存和一台打印机,有两个进程都想打印,进程A请求并获得了打印机,然后进行任务,但没有完成之前,它的时间片就已经用完并换出。然后进程B开始运行并请求打印机,但是没有成功,因为A占用打印机,这时存在死锁的危险,因为A拥有打印机,B拥有内存,两个进程都缺少另一个进程拥有的资源,所以任何一个都不能继续执行。不过幸运的是是通过把进程B换出内存,把进程A换入内存就可以实现抢占B的内存。这样A可继续运行。在这个过程中,内存是可抢占的。
资源死锁的条件,四个必要条件:
1.互斥条件。每个资源要么已经分配给了一个进程,要么就是可用的
2.占有和等待条件。已经得到了某个资源的进程可以请求新的资源
3.不可抢占(剥夺)条件,已经分配给一个进程的资源不能强制性被剥夺。
4.环路等待条件,死锁发生时,系统中一定有两个或两个以上的进程组成的一条环路,该环路的每个进程都在等待下一个进程所占有的资源。
四种处理死锁的策略:
1.忽略该问题,也许你忽略它,它也会忽略你
2.检测死锁并恢复,让死锁发生,检测它们是否发生,一旦发生,采取行动。
3.仔细对资源进行分配,动态的避免死锁
3.通过破坏死锁的四条必要条件之一,防止死锁的产生。
接下来分别讨论这四种方法:
鸵鸟算法
假装问题没有发生。若死锁问题发生的不频繁,那么会这样做。
死锁检测和死锁恢复
系统并不阻止死锁的产生,而是检测到死锁发生时,采取措施进行恢复。那么从死锁中恢复有如下几种办法:
1.利用抢占恢复
2.利用回滚恢复:一旦检测到死锁,很容易发现需要哪些资源,然后对拥有该资源的进程进行回滚到前面的时间点,那么资源就空闲了。
3.通过杀死进程恢复
死锁避免
在运行之前,了解所有进程所需的全部资源,然后进行合理的分配和排序。具体可以利用银行家算法,也就是对每一个请求进行检查,检查如果满足这一请求是否会达到安全状态。若是,就满足该请求。
但是死锁避免从本质上说是不可能的,因为它需要获知未来的请求,而这些请求时不可知的。
死锁预防
破坏四个必要条件之一即可。
条件 | 处理方式 |
互斥 | 使用假脱机技术 |
占有和等待 | 在开始就请求全部资源 |
不可抢占 | 抢占资源 |
环路等待 | 对资源按序编号 |
活锁:某些情况下,当进程意识到它不能获取它需要的下一个锁,就会释放已经获得的锁,然后等待1ms,再尝试一次。理论上,这是用来检测并预防死锁的好方法,但是如果另一个进程在相同的时刻做了相同的操作,相当于都为对方让路,那么导致双方都无法前进。
posted on 2018-04-07 15:20 sichenzhao 阅读(174) 评论(0) 编辑 收藏 举报