死锁问题(Deadlock)

article/2025/10/31 0:46:53

4.8 死锁问题(Deadlock)

各进程在使用系统资源时,应注意系统产生死锁问题。下面先介绍什么是死锁。

4.8.1 死锁的概念


 
1. 死锁的定义

所谓死锁,是指各并发进程彼此互相等待对方所拥有的资源,且这些并发进程在得到对方的资源之前不会释放自己所拥有的资源。从而造成大家都想得到资源而又都得不到资源,各并发进程不能继续向前推进的状态。

 




2. 死锁的起因

死锁发生原因:死锁的起因是并发进程的资源竞争。产生死锁的根本原因在于系统提供的资源个数少于并发进程所要求的该类资源数。显然,由于资源的有限性,我们不可能为所有要求资源的进程无限制地提供资源。但是,我们可以采用适当的资源分配算法,以达到消除死锁的目的。

3. 产生死锁的必要条件

只有4个条件都满足时,才会出现死锁。

(1)互斥条件并发进程所要求和占有的资源是不能同时被两个以上进程使用或操作的,进程对它所需要的资源进行排它性控制。
(2)不剥夺条件进程所获得的资源在未使用完毕之前,不能被其它进程强行剥夺,而只能由获得该资源的进程自己释放。
(3)部分分配进程每次申请它所需要的一部分资源,在等待新资源的同时,继续占用已分配到的资源。
(4)环路条件存在一种进程循环链,链中每一个进程已获得的资源同时被下一个进程所请求。

 

 
4.8.2 死锁的排除方法


处理死锁的基本方法
可归结为以下3 种:

 

方法

资源分配策略

各种可能模式

主要优点

主要缺点

预防

Prevention

保守的;宁可资源闲置

一次请求所有资源<条件1>

资源剥夺

<条件3>

资源按序申请

<条件4>

适用于作突发式处理的进程;不必剥夺

适用于状态可以保存和恢复的资源

可以在编译时(而不必在运行时)就进行检查

效率低;进程初始化时间延长

剥夺次数过多;多次对资源重新起动

不便灵活申请新资源

避免

Avoidance

是“预防”和“检测”的折衷(在运行时判断是否可能死锁)

寻找可能的安全的运行顺序

不必进行剥夺

必须知道将来的资源需求;进程可能会长时间阻塞

检测

Detection

宽松的;只要允许,就分配资源

定期检查死锁是否已经发生

不延长进程初始化时间;允许对死锁进行现场处理

通过剥夺解除死锁,造成损失

 

 

1. 死锁的预防

死锁的预防:是采用某种策略,限制并发进程对资源的请求,使系统在任何时刻都不满足死锁的必要条件。

预防死锁的三种策略:

 打破死锁资源的互斥和不可剥夺这两个条件

缺点:不能解决访问那些不允许被同时访问的资源时所带来的死锁问题。

 打破资源的部分分配这个死锁产生的必要条件

缺点:在许多情况下,一个进程在执行之前不可能提出它所需要的全部资源。

   无论所需资源何时用到,一个进程只有在所有要求资源都得到满足后才开始执行。

   对于那些不经常使用的资源,进程在生存过程期间一直占用它们是一种极大的浪费。

   降低了进程的并发性。

 打破死锁的环路条件

缺点:限制了进程对资源的请求,而且对资源的分类编序也耗去一定的系统开销。

 

 

 

  2. 死锁的避免

死锁的避免 在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。
在分配资源时判断是否会出现死锁,如不会死锁,则分配资源。

死锁避免的一种基本模式是把进程分为多个步,其中每个步所使用的资源是固定的,且在一个步内,进程所保持的资源数不变。即进程的资源请求、使用与释放要依靠不同的步完成。


3. 死锁的检测和恢复

保存资源的请求和分配信息,利用某种算法对这些信息加以检查,以判断是否存在死锁。
死锁检测算法主要是检查是否有循环等待。
http://ettc.sysu.edu.cn/2005wlkc/caozuoxitong/book/chapter4/lesson6/lesson6.htm

http://chatgpt.dhexx.cn/article/I5dBWfoO.shtml

相关文章

SQL Server DeadLock 分析

1. 设置 XEvents 会话以收集死锁 1.1 扩展事件-会话-右键新建会话向导 1.2 设置会话名称 1.3 选择要捕获的事件 database_xml_deadlock_report 1.4 捕获全局字段 1.5 指定会话存储 1.6 结束 1.7 确保启动会话 2. 制造死锁 2.1 准备数据表及数据 2.1.1 准备数据库 TestBu…

MYSQL报错:MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting tr

mysql报错&#xff1a;MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction 报错情况&#xff1a;并发量大的情况对表的修改发生死锁 原因&#xff1a;查看了该更新语句的sql&#xff0c;没有设置主键&#xff0c;而mysq…

Deadlock的一些总结(死锁分析及处理)

1.1.1 摘要 在系统设计过程中&#xff0c;系统的稳定性、响应速度和读写速度至关重要&#xff0c;就像12306.cn那样&#xff0c;当然我们可以通过提高系统并发能力来提高系统性能总体性能&#xff0c;但在并发作用下也会出现一些问题&#xff0c;例如死锁。 今天的博文将着重介…

Deadlock found when trying to get lock; try restarting transaction 【MySQL死锁问题解决】

视频地址&#xff1a; https://www.bilibili.com/video/bv1zY411N7tB 最近在调试接口的时候遇到了MySQL死锁问题&#xff0c;我自己测试的时候一切都好好的&#xff0c;但在并发下&#xff0c;就死锁了 其实死锁问题&#xff0c;并没有一个类似“万金油”的解决办法&#xff0…

【死锁~】

死锁 死锁 死锁 1.死锁是什么? 当线程想要获取锁&#xff0c;但是获取失败&#xff0c;此时&#xff0c;线程进入阻塞状态&#xff0c;等待锁释放之后&#xff0c;线程获取锁。如果锁一直没有被释放&#xff0c;线程就一直处于阻塞状态。 2.死锁的条件 1.互斥作用:一个线程获…

Mysql报Deadlock found when trying to get lock; try restarting transaction问题解决

Mysql报Deadlock found when trying to get lock; try restarting transaction问题解决!! 文章目录 问题发生场景Mysql锁类型分析死锁原理问题排查过程问题原因解决方法经验教训查看mysql死锁日志 问题发生场景 今天记录一下最近项目中遇到的一个问题,前几天在部署项目后,在线…

死锁(Deadlock)

什么是死锁 死锁是指两个或两个以上的线程在执行过程中&#xff0c;因争夺资源而造成的一种互相等待的现象。若无外力作用&#xff0c;它们都将无法推进下去。 产生死锁的四个必要条件得烂熟于心 互斥条件&#xff1a;进程要求对所分配的资源进行排他性控制&#xff0c;即在一段…

知识归纳:死锁

一. 死锁定义 死锁(Deadlock)是指两个或两个以上的进程在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。 举例:毕业生找工作,公司表示只需要有工作经验才可以来;要想有工作经验,就需要…

mmall数据库学习笔记

mmall数据库学习笔记 文章目录 mmall数据库学习笔记唯一索引产品表购物车表支付信息表订单表订单明细表收货地址表外键 唯一索引 在用户表中&#xff0c;设置了用户名作为唯一索引&#xff0c;理由如下&#xff1a;用户名是不允许重复的&#xff0c;那么当不是分布式开发的时候…

MMALL ADMIN 后台管理总结

后台管理项目前期准备 1&#xff0c;vue-cli2 项目框架 2&#xff0c;下载axios插件 cnpm install axios&#xff0c;安装Element.ui &#xff0c; vue-cli2中使用scss 注意版本 cnpm install sass-loader7.1.0 --save-dev &#xff08;8.0.0&#xff09; v…

mmall项目安装相关包文件

2019独角兽企业重金招聘Python工程师标准>>> 本步骤之前请先&#xff1a;建立相关文件夹&#xff08;或者从git上clone项目下来&#xff09;&#xff0c;进入分支作业目录下运行个忠包文件的安装。注意&#xff1a;npm是所有安装的第一步 基础安装&#xff1a; 1.np…

mmall电商项目学习笔记之 idea,maven工程整合ssm框架

项目目录结构 1.pom文件导入jar包 1.1 <properties><!--设置编码格式--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!--sprin…

Demo_mmall v2.0 (四) Tomcat集群演进及使用Redis进行session重构实现单点登录

小谈mmall架构演进 上回书和上上回书说到redis的用法还有在代码里怎么操作Redis数据库&#xff0c;学完了得用啊。怎么用啊&#xff1f;这得从项目架构说起了。 mmall是一个简单的用SSM搭建起来的基本只能本地玩耍的电商DEMO&#xff0c;最简单的架构版本V1.0是这样婶的&#…

自学实践前后端项目4 MMall商城 2

一。搭建静态页面 1)UserController里面实现登录操作 Autowired private UserService userService;PostMapping("/login") public String login(String loginName, String password, HttpSession session){QueryWrapper wrapper new QueryWrapper();wrapper.eq(&q…

mmall用户模块

mmall用户模块 user数据表设计用户模块接口文档服务端响应对象&#xff08;ServerResponse< T>&#xff09;响应对象封装以下3个属性判断响应是否成功私有化构造函数&#xff0c;对外暴露静态方法返回所需要的响应对象&#xff0c;例如&#xff1a;响应成功响应失败 Resp…

自学实践前后端项目4 MMall商城 7

一。地址管理 1.前端改为 userAddress 2. OrderController增加两个需要的元素 3.接口 服务也加上去 4. 在OrderServiceImpl实现层判断是否为新地址再进行保存 //先判断新老地址 if (orders.getUserAddress().equals("newAddress")){//存入数据库UserAddress use…

自学实前后端践项目4 MMall商城 1

一.开发环境 1.JDK8以上Spring Boot 2.3.0ThymeleafMyBatis Plus3.3.1MySQL8.0 2.部署&#xff1a;Linux,&#xff0c;&#xff08;阿里云 腾讯云&#xff09;JDK8&#xff0c;MySQL8.0 3.部署方式&#xff1a;jar包部署&#xff0c;不需要Tomcat 二.新建工程 1&#xff0…

mmall电商项目学习笔记之mybatis三剑客

一.Mybatis plugin IDEA 2017.3版本下Mybatis plugin 3.53安装使用 插件下载地址 http://www.awei.org/download/iMybatis-3.21.jar 二.MyBatis-Generate 反向生成 【转】mybatis自动生成实体代码的插件 【method2】逆向生成 2.1 在pom.xml中做两处配置 2.1.1配置depen…

自学实践前后端项目4 MMall商城 4

一。实现商品详情展示 1.测试获取后台当个商品的信息 2.实现通过点击商品名称和商品图片进入商品详情页面 1&#xff09;查找出商品信息 2&#xff09;在前端进行映射 3&#xff09;设置库存选择限制 判断逻辑 $(function(){//给type绑定点击事件$(".type").click…

mmall 项目实战(一)项目初始化

1.创建 数据库 及 表 数据脚本&#xff1a; /* Navicat Premium Data Transfer Source Server : 182.92.82.103 Source Server Type : MySQL Source Server Version : 50173 Source Host : 182.92.82.103 Source Database : mmall Target Se…