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

news2024/9/24 13:24:15

死锁

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

1. 死锁的成因

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

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

2. 解决方案

死锁的三种典型情况:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/817658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解FreeRTOS:FreeRTOS程序启动流程(基础篇—5)

裸机系统上电时第一个执行的是启动文件里由汇编编写的复位函数Reset_Handler,复位函数最后会调用 C 库函数__main,__main 函数的主要工作是初始化系统的堆和栈,最后调用 C 中的 main 函数。如下图所示: 1、创建任务 在 main()函数中,我们直接可以对 FreeRTOS 进行创建任务…

iOS开发-实现热门话题标签tag显示控件

iOS开发-实现热门话题标签tag显示控件 话题标签tag显示非常常见,如选择你的兴趣,选择关注的群,超话,话题等等。 一、效果图 二、实现代码 由于显示的是在列表中,这里整体控件是放在UITableViewCell中的。 2.1 标签…

使用vscode进行远程开发服务器配置

1.下载vscode 2.给vscode 安装python 和 remote ssh插件 remote—SSH扩展允许您使用任何具有SSH服务器的远程机器作为您的开发环境。 3.安装remote-SSH插件之后,vscode左侧出现电脑图标,即为远程服务,按图依次点击,进行服务器配置…

拿捏--->乘法口诀表

文章目录 前言左下角左上角右下角右上角等腰三角形 前言 九九乘法表,我们从小学就已经了解并且学习了,九九乘法表的历史距今已经有2千多年的历史了。那我们如何使用c语言来输出九九乘法口诀表呢,我们一起来看一看。 我们了解的九九乘法口诀表是这样的: 那我们如…

CPU Architecture Methodologies

MMU MMU(Memory Management Unit) 负责将逻辑地址转化为物理地址对于现代处理器来说,一般每个core都有自己的 MMU页表等数据结构保存在 TLB NUMA Non-uniform memory access (NUMA) is a computer memory design used in multiprocessing, where the memory access…

每日一题——只出现一次的数字(III)

只出现一次的数字——III 题目链接 注:本题的解法建立在位运算——异或和题目《只出现一次的数字——I》之上,如果对这些内容不太熟悉,建议先看看: 位运算详解 只出现一次的数字——I 思路 我们先来回顾一下异或的特性&#x…

事务的隔离级别以及传播机制的详细讲解

1.为什么需要事务? 事务就是将一组操作封装成一个执行单元,要么全部执行成功,要么全部执行失败 ⽐如转账分为两个操作: 第⼀步操作:A 账户 -100 元第⼆步操作:B 账户 100 元 如果没有事务,第⼀…

nodejs的字符串文字(‘‘)和模板文字(``)性能比较

nodejs的字符串文字(‘’)和模板文字()性能比较 js支持两种方式定义字符串: 使用 const str "Hello " "world!";使用 const worldText "world!" const str Hello ${worldText};我们可能不会太关注这些,应该都是怎…

同步锁: synchronized

synchronized 1. synchronized的特性2. synchronized的使用3. synchronized的锁机制 1. synchronized的特性 原子性: 所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。可见性: 可见性是指多个线程…

Minecraft 1.20.x Forge模组开发 05.矿石生成

我们本次尝试在主世界生成模组中自定义的矿石 效果演示 效果演示 效果演示 1.由于1.20的版本出现了深板岩层的矿石,我们要在BlockInit类中声明一个矿石的两种岩层形态: BlockInit.java package com.joy187.re8joymod.init;import java.util.function.Function;import java…

无涯教程-jQuery - scrollLeft( val )方法函数

scrollLeft(val)方法用于将所有匹配元素上的向左滚动偏移量设置为传递的值。 此方法适用于可见和隐藏元素。 scrollLeft( val ) - 语法 selector.scrollLeft( val ) 这是此方法使用的所有参数的描述- val - 代表所需滚动左偏移量的正数。 scrollLeft( val ) - 示例 以…

【css】边框border

边框border 1、border-style 属性指定要显示的边框类型 dotted - 定义点线边框dashed - 定义虚线边框solid - 定义实线边框double - 定义双边框groove - 定义 3D 坡口边框。效果取决于 border-color 值ridge - 定义 3D 脊线边框。效果取决于 border-color 值inset - 定义 3D …

淘宝10年架构演进

目录 1. 概述 2. 基本概念 3. 架构演进 3.1 单机架构 3.2 第一次演进:Tomcat与数据库分开部署 3.3 第二次演进:引入本地缓存和分布式缓存 3.4 第三次演进:引入反向代理实现负载均衡 3.5 第四次演进:数据库读写分离 3.6 第…

【100天精通python】Day19:文件及目录操作_基本文件操作

目录 专栏导读 1 文件的创建打开和关闭 2.1 使用内置函数open(),close()创建打开和关闭 2.2 使用with语句打开和关闭 2 文件的读取 2.1 读取整个文件read() 2.2 逐行读取文件内容readlines() 3 文件的写入 3.1 直接写入 3.2 写入整个文件 3.3 逐行写入文件 4 文件…

Spring框架中的Bean的各种加载方式

大家好,这里向大家主要介绍Spring框架以及SpringBoot框架中的Bean的各种加载方式,有时候我们的学习,就是单纯为了工作效率而作为工具使用,于是乎,往往忽略了其最重要的一点,那就是底层原理!所以…

分享一次使用iostat命令定位邮件系统性能故障的经历

目录 一、背景介绍 二、环境介绍 三、分析过程 四、解决方法 最近在整理iostat,回忆起以前处理的系统性能的问题,现把分析方法整理如下。 一、背景介绍 以前公司内网部署有一套邮件系统,每天下午16:00-16:30之间邮件收发非常卡。 二、环…

C++类与对象 - 4(初始化列表,Static成员,友元,内部类,匿名对象)

类与对象 - 4 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表(重点)1.3 explicit关键字 2. Static成员2.1 概念2.2 特性 3. 友元3.1 友元函数3.2 友元类 4. 内部类5.匿名对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过…

python包的介绍使用

python包的介绍使用 简单来说python的模块相当于文件,包就相当于文件夹 python包创建后会自动生成 init.py 的文件 然后可以在不同的包下面创建不同的模块 下面是引入模块里面的内容的三种方式 第一种就是引入模块,记住引入包是会报错的 import只能引…

ansible-playbook roles模块编写lnmp剧本

目录 一:集中式编写lnmp剧本 二:分布式安装lnmp 1、nginx 配置 2、mysql配置 3、php配置 4、运行剧本 一:集中式编写lnmp剧本 vim /etc/ansible/lnmp.yml- name: lnmp playhosts: dbserversremote_user: roottasks:- name: perpare condif…

JSON对象

目录 简介 创建对象 ​编辑json对象作为属性值 json用于交换数据 简介 json:javascript object notation(js标记对象)是一种轻量化的数据交换模式,特点:体积小,数据量大 在js中,json是以对象的形式存在的&#x…