首页 > 编程知识 正文

多线程死锁,线程的几种状态

时间:2023-05-03 11:36:13 阅读:111319 作者:4190

首先,死锁问题是多线程特有的问题,一般认为是线程间切换消耗系统性能的极端情况。 死锁时,线程间相互等待资源,而又不释放自身的资源,导致无穷无尽的等待,因此永远无法执行系统任务。 死锁问题是多线程开发中必须坚决避免的勤奋航空问题。

1 .线程死锁的原因(1)排他条件:一个资源一次只能用于一个线程。

(2)要求和保持的条件)当一个进程被要求资源屏蔽时,对获得的资源不进行处理。

(3)不剥夺条件:过程获得的资源不得在未使用的情况下强制剥夺。

(4)循环等待条件:在几个过程之间形成头尾相连的循环等待资源关系。

2 .死锁解决方案出现死锁时,可以通过只要破坏死锁 4 个必要条件之一之一解决死锁问题。 考虑一下以上的必要条件吧

)1)尝试打破互斥条件时,必须允许进程同时访问若干资源。 这种方法受制于实际场景,实现条件并不容易。

)为了打破不可抢占条件,需要允许这样的过程强制从占有者那里夺取某种资源。 或者简单理解就是,占用资源的流程不能再申请占用其他资源,必须先释放手中的资源再开始申请,这实际上也很难找到应用场景。

)3)进程在运行前申请获得所有资源,否则该进程无法进入准备运行状态。 该方法看起来有点有用,但具有可能导致资源利用率和工艺并发性降低的缺点

)4)避免出现资源申请环路。 也就是说,事先对资源分类编号,按编号分配。 该方案可以有效提高资源利用率和系统吞吐量,但增加了开销,增加了进程的资源消耗时间。

在死锁检查时发现死锁状况的情况下,必须努力消除死锁,从死锁状态中恢复系统。 消除死锁的几种方法:

)1)最简单、最常用的方法是运行系统的重新启动,但这种方法成本较高。 这意味着到目前为止所有进程都已完成的计算工作都将被浪费,包括参与死锁的进程和未参与死锁的进程。

)2)撤消进程,剥夺资源终止参与死锁的进程,回收占用资源并解除死锁。 此时,可以分为一次性取消参与死锁的所有进程、剥夺所有资源两种情况,或者逐步取消参与死锁的进程,逐步回收死锁进程占用的资源。 一般来说,选择分阶段撤消流程时,必须遵循一定的原则。 它旨在撤消成本最低的流程,包括根据流程优先级确定流程成本。 考虑执行进程时的成本、与该进程相关的外部作业的成本等

)3)进程回退策略,即让参与死锁的进程回退到没有发生死锁前某一点处,然后从这里继续执行,避免再次执行时发生死锁。 这是一个理想的方法,但操作开销很大,可能需要一个类似堆栈的机构来记录流程中每个步骤的变化,以便将来进行回滚,但这可能是不可能的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。