-
死锁避免__几乎不可能实现,因为不可能知道未来的请求信息。但是可以进行__死锁预防
-
资源死锁的__4个必要条件__
(1) 互斥条件
资源要么已经分配给了唯一的进程,要么就是可用的未分配状态
(2) 占有和等待条件
已经占有了某个资源的进程,可以继续请求新的资源
(3) 不可抢占条件
已经分配给某个进程的资源, 不能被其他进程强制性抢占, 只能被占有它的进程显式释放
(4) 环路等待条件
死锁发生时, 系统一定由有两个或两个以上的进程组成的一条环路, 该环路中每个进程都在等待着下一个进程所占有的资源
只要破坏了其中一个条件,死锁便不会发生
-
破坏互斥条件
(1) 如果资源不被一个进程独占,则死锁一定不会发生
(2) 有些资源物理上只能被独占,但是可以在这种资源前面__加入一层虚拟资源__
(3) 示例
打印机属于不可抢占资源,只能有一个进程占有;
这时可以引入"假脱机打印机",作用是若干个进程都可以占有"假脱机打印机",而"假脱机打印机"只会请求"打印机"资源,不会请求其他资源;
这样,不同进程不会因为请求打印机而死锁(因为它们请求的"假脱机打印机"属于可抢占资源); "假脱机打印机"也不会死锁,因为它不会等待其他资源,只会请求打印机。
但是, 可能诱发的问题是两个进程都占据了假脱机打印机一半的磁盘空间,在请求磁盘的另一半空间, 而假脱机打印机只会在文件完整时才申请打印机打印,此时会在磁盘上造成死锁
但是,一般假脱机打印机的磁盘空间足够大,不会诱发上面的问题
-
破坏占有和等待条件
(1) 只要禁止已持有资源的进程等待其他资源,就不会有死锁
(2) 操作
当一个进程请求资源时, 暂时释放__它占有的所有资源,然后再旧资源和新资源__一并申请
-
破坏不可抢占条件
(1) 类似于"破坏互斥条件"中的假脱机打印机示例
(2) 不是所有的资源都可以进行类似的虚拟化操作, 例如数据库中的表
-
破坏环路等待条件
(1) 方法一
操作: 让每一个进程在任意时刻__只能占有一个资源__
问题: 资源大时不靠谱
(2) 方法二
操作: 将所有的资源统一编号, 任意时刻进程只能按资源编号的升序请求资源
问题: 资源数目过多时难以找到一种合适的方式编号
(3) 方法三
操作: 将所有的资源统一编号,任意时刻进程只能申请比当前所占有资源序号高的资源
问题: 资源数目过多时难以找到一种合适的方式编号
chapter06_死锁_6_处理死锁的策略(四)死锁预防
最新推荐文章于 2023-06-16 19:58:51 发布