死锁的条件

1.互斥条件,一个资源只能被一个资源使用,比如锁
2.请求与保持,一个线程不会因为阻塞而放弃自己已经拥有的资源
3.不可剥夺原则
4.循环等待,若干线程形成了收尾相连的循环等待

可重入锁 与 不可重入锁:
可重入锁表示的是一个线程可以进入他已经获取的锁锁定的任何临界区域,一个线程对应一个锁
不可重入锁表示的是一个线程必须在锁释放之后才能进行相同锁锁定的临界区域
死锁是指多个进程或线程在执行过程中因争夺资源而造成的一种相互等待的僵局,若无外力作用,这些进程将无法继续执行。死锁的产生需要同时满足以下四个必要条件: 1. **互斥(Mutual Exclusion)** 某些资源不能共享,只能由一个进程或线程独占使用。例如,打印机、文件等资源在某一时刻只能被一个进程访问,这种排他性控制是死锁发生的前提之一[^1]。 2. **请求与保持(Hold and Wait)** 进程在等待其他资源时,不释放自己已经持有的资源。这种行为导致资源被部分占用,而进程又在等待其他资源释放,从而形成资源阻塞链[^3]。 3. **不可抢占(No Preemption)** 资源只能由持有它的进程主动释放,不能被强制剥夺。这意味着即使某个进程长时间占用资源,系统也不能强制回收,只能等待其自行释放,这进一步加剧了资源争用问题[^3]。 4. **循环等待(Circular Wait)** 存在一个进程链,其中每个进程都在等待下一个进程所持有的资源。这种闭环依赖关系是死锁最直接的表现形式,使得资源无法被有效调度和释放[^2]。 当以上四个条件同时满足时,系统就会进入死锁状态。为了防止死锁的发生,通常可以通过破坏其中一个或多个条件来实现。例如,允许资源抢占、避免循环等待结构、限制进程在请求新资源时必须释放已有资源,或通过资源分配图的动态分析来避免进入不安全状态。 ### 死锁的解决策略 - **死锁预防**:通过设计系统规则,确保四个必要条件中的至少一个不成立。例如,要求进程一次性申请所有所需资源,以避免“请求与保持”条件。 - **死锁避免**:在资源分配时进行状态检查,确保系统始终处于安全状态。例如,银行家算法通过预判资源分配是否会导致死锁来决定是否分配资源。 - **死锁检测与恢复**:系统定期运行死锁检测算法,发现死锁后采取措施恢复,如终止部分或全部死锁进程,或从死锁进程中抢占资源[^4]。 ### 示例代码:银行家算法资源分配检查 以下是一个简化的银行家算法资源分配检查示例,用于判断系统是否处于安全状态: ```python def is_safe_state(available, max_need, allocation): work = available.copy() finish = [False] * len(max_need) while True: found = False for i in range(len(max_need)): if not finish[i]: # 检查当前进程是否可以完成 can_complete = all(max_need[i][j] - allocation[i][j] <= work[j] for j in range(len(work))) if can_complete: # 模拟该进程完成后释放资源 for j in range(len(work)): work[j] += allocation[i][j] finish[i] = True found = True if not found: break return all(finish) # 示例输入 available = [3, 3, 2] max_need = [ [7, 5, 3], [3, 2, 2], [9, 0, 2], [2, 2, 2], [4, 3, 3] ] allocation = [ [0, 1, 0], [2, 0, 0], [3, 0, 2], [2, 1, 1], [0, 0, 2] ] print("系统是否处于安全状态:", is_safe_state(available, max_need, allocation)) ``` 该算法通过模拟资源分配过程,判断是否存在一个进程执行顺序使得所有进程都能完成,从而避免进入死锁状态。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值