首页 > 编程知识 正文

死锁的四个必要条件无法破坏的是,发生死锁的4个必要条件

时间:2023-05-04 23:35:44 阅读:176865 作者:2281

死锁是什么? 死锁是指多个进程在再执行中因争夺资源而产生的僵局,如果没有外力的作用(破坏死锁的话),程序就无法执行。

由死锁产生的4个必要条件的互斥条件。 进程必须独占控制分配的资源(如打印机)。 这意味着某个资源在一段时间内只被一个进程占用。 如果此时另一个进程请求资源,则请求进程只能等待。

不可剥夺条件:进程获得的资源,未使用时不可剥夺,只有使用完毕时自行释放。

请求和保留要求:如果进程被请求资源阻止,则保留检索到的资源。

循环等待条件:发生死锁时,必然存在进程―资源环状链。

这4个条件是死锁的必要条件,只要系统不发生死锁,这些条件必然成立,只要上述条件之一不满足,就不会发生死锁

如何处理死锁预防死锁:通过设置限制条件以破坏发生死锁的四个必备条件中的一个或多个来防止死锁的发生。

避免死锁:在资源动态分配过程中,通过某种方式防止系统进入不安全状态,从而避免死锁的发生。

死锁检测:允许在系统运行过程中发生死锁,但可以设置检测机制及时检测并采取相应措施清除死锁的发生。

解除死锁:检测到死锁后,采取适当的措施使进程从死锁状态中释放出来。

预防死锁:一次性分配资源:一次性分配所有资源,使请求消失。 ((破坏要求条件) )。

除非分配了一个资源,否则也无法为此进程分配其他资源。 ((破坏请维持条件) )。

可以剥夺资源(也就是说,在某个进程获得了部分资源但得不到其他资源的情况下,释放已经占有的资源(破坏不可剥夺的条件) )。

资源分配法:系统按资源种类分配编号,各进程按照编号从上到下的顺序请求资源,释放则与之相反()

避免死锁并预防死锁的几种方案会严重损害系统的性能。 因此,要避免死锁,必须施加较弱的限制以提高系统性能。 因为避免死锁的策略允许进程动态地请求资源。 因此,系统在进行资源分配之前会事先计算资源分配的安全性。 如果此次分配不会导致系统不安全,请将资源分配给进程。 否则,过程会等待。 其中最具代表性的死锁避免算法是银行家算法。 (银行家算法详情请参阅https://blog.csdn.net/wljliujuan/article/details/79651932 /

要检测死锁,请首先为每个进程和资源指定唯一的编号。

接下来,创建资源分配表和进程等待表。

死锁检测1,Jstack命令

jstack是java虚拟机上的堆栈跟踪工具。 jstack用于打印指定的java进程ID、核心转储文件或远程调试服务的java堆栈信息。 Jstack工具可用于生成java虚拟机的当前线程快照。 线程快照是当前java虚拟机中每个线程运行的方法堆栈的集合,主要目的是确定线程长时间停止的原因,例如线程间死锁、死锁和由于外部资源请求而导致的长时间等待在线程暂停时,通过jstack查看每个线程的调用栈,可以了解没有响应的线程在后台正在做什么,或者正在等待什么资源。

2、JConsole工具

Jconsole是JDK附带的监视工具,可以在JDK/薄薄的以前的目录中找到。 连接到正在运行的本地或远程JVM,监视在Java APP应用程序中运行的资源的消耗和性能,并绘制大量图表以提供强大的可视界面。 另外,自身消耗的服务器内存很小,可以说几乎不消耗。

死锁释放如果发现:进程死锁,则必须立即将其从死锁状态中释放。 经常采用的方法如下。

剥夺资源:从其他进程夺取足够数量的资源用于死锁进程,以消除死锁情况;

撤消进程:可以直接取消死锁过程或取消代价最小的过程,直到有足够的资源可用并消除死锁情况; 成本是指优先级、运营成本、流程重要性、价值等。

死锁的预防和死锁的避免的区别:死锁的预防是指设法破坏发生死锁的4个条件中的至少1个,严格防止死锁的发生,但避免死锁会发生死锁这是因为即使存在死锁的要件也不一定会发生死锁。 请注意,避免死锁是在系统运行过程中避免死锁的最终发生。

本文见https://blog.csdn.net/wljliujuan/article/details/79614019

后记:

问题思考:如果线程之间进行资源争夺会怎么样?

3359 blog.csdn.net/QQ _ 40334837/article/details/83862269

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