进程的死锁,以及银行家算法

本文深入探讨了死锁产生的原因及四个必要条件,并详细解析了银行家算法的工作原理及其实际应用过程,通过维护资源状态和线程状态来确保系统始终处于安全状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

死锁产生的原因:

    1、系统资源不足;

    2、进程运行推进的顺序不合适;

    3、资源分配不当等。

死锁产生的四个必要条件:

1、互斥条件:一个资源每次只能被一个进程使用

2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放

3、不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺

4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

---------------------------------------------------------------

银 行 家 算 法

算法的目的:    解决死锁问题

算法应用条件:

  1. 固定的线程数
  2. 能够获得每个线程所需要的最大资源数
  3. 使用资源的时间是有限的
  4. 等待资源的时间是有限的
  5. 不能申请比资源总数还多的资源

算法的实际过程:

  1. 会先对申请资源这个动作做出响应的分配,结果有分配成功和分配失败
  2. 分配成功后,资源、进程等实例会共同构成一个新的状态,但是这个状态类似于git中的暂存区,还没有进行真正的提交,只是一个可提交也可撤销的中间状态。
  3. 对中间状态进行判断,如果新产生的中间状态能够保证一个安全序列,那么整体的资源分配就是可行的,否则进行逆向操作。并且安排当前申请资源的线程进入等待状态。

如何判断是否安全???

  1. 维护出一个目前每种资源剩余可用的数组,Avaliable[],和一个与线程总数目等长的Finish[]数组,初始值为false。
  2. 遍历所有的线程,查看线程是否可以完成相应资源的获取并且还可以满足其他线程资源的申请。先要检查当前线程是否已经完成,如果没有检查获取相应的资源是否可以得到满足。如果可以,转3
  3. 将当前线程的状态转换为已经结束,true。再将当前线程占用的所有资源归还给Avaliable[]数组。然后循环的遍历所有线程,转2
  4. 如果遍历完毕所有线程,都可以得到对应的Finish[i]都为true。
    如果可以,则证明是一个安全状态
    否则,不安全状态


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值