1. 什么是死锁?
当多个进程 在运行过程中 因为争夺资源 而造成的一种僵局, 当进程处于这种僵持状态的时候, 若无外力作用, 它们将永远无法向前推进. 这种状态就称为死锁。
2. 产生死锁的必要条件
产生死锁总共有 4 个必要条件:
·资源互斥: 当一个资源被一个进程使用时候, 其他继承不能使用该资源
· 资源不可剥夺: 进程已持有的资源在使用完之前是不可被剥夺的, 只能在使用完后由自己释放
· 请求和保持: 当进程在请求其他资源的时候, 对自己已持有的资源保持不放
· 循环等待: 即存在一个等待队列: 例如: A 占有 B 的资源, B 占有 C 的资源, C 占有 A 的资源, 这样就形成了一个等待环路
当以上 4 个条件同时成立的时候, 就会产生死锁。
3. 预防死锁的方法
资源一次性分配(破坏请求条件): 一次性分配所有的资源, 这样就不会再有请求了。
(破坏保持条件): 一个进程只要有一个资源得不到分配, 就也不给这个进程分配其他资源。
可剥夺资源(破坏不可剥夺性): 一个进程即使获得了部分资源, 但是如果得不到其他资源, 就需要释放掉已有的资源。
资源有序分配(破坏循环等待): 系统为每类资源分配一个编号, 每一个进程按照编号以递增的顺序请求资源, 释放则相反。
4. 避免死锁的方法
预防死锁的四种方法, 都会严重的影响系统性能. 因此可以尽可能去避免死锁的产生。
在避免死锁的策略中, 允许进程动态地申请资源. 所以, 系统在进行资源分配的时候, 会预先计算资源分配的安全性, 如果此次资源分配不会导致系统进入不安全的状态, 就将资源分配给进程, 否则, 进程等待。
避免死锁的方法中最经典和最重要的就是: 银行家算法。
原理:
将操作系统视为一个银行家, 将操作系统所管理的资源视为银行家的资金, 进程申请资源就视为用户向银行家贷款。
当一个顾客对资金的最大需求量不超过银行家现有的资金时, 就可以接纳该顾客。
顾客可以分期贷款, 但是贷款的总额不可以超过最大需求量。
当银行家现有资金不能满足用户尚需的贷款金额时, 可以推迟支付贷款, 但是使顾客在有限的时间内拿到贷款。
当顾客得到所有所需资金后, 一定可以在有限时间内归还所有的资金。
5. 解除死锁的方法
剥夺资源: 从其他进程剥夺足够数量的资源给死锁, 用以解除死锁状态。
撤销进程: 撤销系统中一个或者多个死锁进程。