死锁产生的原因及解决方案

news/2024/7/7 22:57:52

死锁

  • 1. 死锁的成因
  • 2. 解决方案

1. 死锁的成因

  1. 互斥条件: 一个资源每次只能被一个进程使用。
  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四条是死锁产生的必要条件, 缺一不可, 所以我们可以破坏上述条件来避免死锁的产生

2. 解决方案

死锁的三种典型情况:

  1. 一个线程一把锁, 但是是不可重入锁, 该线程连续两次加锁.
  2. 两个线程两把锁, 这两个线程先分别获取一把锁, 然后尝试获取对方的锁.
  3. M个线程N把锁.
    M个线程N把锁最典型的例子就是 “哲学家进餐问题” 这也是操作系统中的一个典型案例.
    在这里插入图片描述
    如上图所示, 总共有五位哲学家和五根筷子, 每位哲学家会做两件事: 思考和吃饭.
    每个哲学家吃饭的时间都不固定, 并且当他们拿起一根筷子就算获取不到另外一根筷子也不会放弃手里的这根筷子, 这时如果五位哲学家同时想要吃东西, 并且同时获取了左边的筷子, 此时就会产生死锁.

我们想要解决死锁的问题就可以从上边那四个成因入手, 但是由于 “互斥条件” 和 “不可剥夺条件” 是锁的特性无法改变所以只能从 “请求与保持条件” 和 “循环等待条件” 入手.
我们可以通过给锁编号, 并且规定加锁的顺序来避免死锁, 例如 把筷子分为 1 到 5 号让每个人在拿筷子时先拿编号小的在拿编号大的
在这里插入图片描述
这时五号筷子就会空闲然后被最上边的那个人获取到, 当他吃完放下筷子时其他哲学家就可以依次进餐, 这样就避免了死锁.
还可以给哲学家编号让奇数号的哲学家先拿左边的筷子, 偶数号的哲学家先拿右边的筷子这样也可以避免死锁.
“银行家算法” 是一个著名的避免死锁的算法, 但是由于太过于复杂工作中很少用到这里就不在解释.


http://lihuaxi.xjx100.cn/news/1396521.html

相关文章

【LeetCode 算法】Reorder List 重排链表

文章目录 Reorder List 重排链表问题描述:分析代码PointerReverseMerge Tag Reorder List 重排链表 问题描述: 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#…

js实现节流函数,当需要对一个高频触发的事件进行节流时,可以使用节流函数来限制事件的触发频率

当需要对一个高频触发的事件进行节流时,可以使用节流函数来限制事件的触发频率 function throttle(func, delay) {let timeoutId;return function() {if (!timeoutId) {timeoutId setTimeout(() > {func.apply(this, arguments);timeoutId null;}, delay);}};…

virbr是什么设备

virbr是什么设备 virbr是一个虚拟桥接网络设备,通常由虚拟机管理程序(如 KVM、VirtualBox 或者 libvirt 等)创建和管理。它用于在宿主机和虚拟机之间进行网络连接,以便虚拟机可以通过宿主机访问网络。 默认情况,libv…

嵌入式面试常见题目收藏(超总结)

​ 这篇文章来自很多博客主和其他网站的作者,如有侵权,联系必删 文章出处标注: https://blog.csdn.net/qq_44330858/article/details/128947083 ***如需PDF或者原稿可私信 *** ***如需PDF或者原稿可私信 *** ***如需PDF或者原稿可私信 *** 1.…

配置uniapp 的保姆级代码,拿来就能用!

闲下来整理一下最近使用uniapp遇到的问题。之前我开发的时候用的是vue2.0,uniapp有 uview2.x ui组件,后来又开发新项目使用了vue3.0 但是对UI的要求 uview2.x 不满足,还好后来又出了一个 uview-plus3.x(vue3)这个甚合心意呀,使用…

C语言,vs各种报错分析(不断更新)

1.引发了异常: 写入访问权限冲突2.#error: Error in C Standard Library usage 1.引发了异常: 写入访问权限冲突 这里是malloc没有包含头文件<stdlib.h>&#xff0c;包含之后就好了 2.#error: Error in C Standard Library usage 这里就是用C语言写程序时使用了C的头文件…

【Liux下6818开发板(ARM)】触摸屏

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

lightdb23.3 ecpg支持多种注释方式

ecpg 支持多种注释方式 原版的pg只支持在 ecpg 的 EXEC SQL 中使用 ‘/**/’ 形式的注释&#xff0c;因为ecpg 会转换SQL&#xff0c; 把SQL 转换为一行&#xff0c;去掉了换行符&#xff0c;导致 ‘–’ 和 ‘//’ 这种行注释的使用会有问题。在oracle 的pro*c 中这两种注释都…