什么是死锁

简介: 什么是死锁

什么是死锁?
在两个或多个并发进程中,如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就产生了死锁。

延伸问题:死锁产生有哪些条件?
死锁产生的根本原因是多个进程竞争资源时,进程的推进顺序出现不正确。

互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
占有和等待:已经得到了某个资源的进程可以再请求新的资源。
不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。
延伸问题:怎么解决死锁?
对于死锁,主要有4种解决策略。
鸵鸟策略

就是直接忽略死锁。就像鸵鸟遇到危险的时候,把头埋在沙子里,假装根本没发生问题。因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任务措施的方案会获得更高的性能。当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略。大多数操作系统,包括 Unix,Linux 和 Windows,处理死锁问题的办法仅仅是忽略它。

死锁预防

死锁预防是指通过破坏死锁产生的四个必要条件中的一个或多个,以避免发生死锁。

破坏互斥:不让资源被一个进程独占,可通过假脱机技术允许多个进程同时访问资源;
破坏占有和等待:有两种方案,
已拥有资源的进程不能再去请求其他资源。一种实现方法是要求进程在开始执行前请求需要的所有资源。
要求进程请求资源时,先暂时释放其当前拥有的所有资源,再尝试一次获取所需的全部资源。
破坏不可抢占:有些资源可以通过虚拟化方式实现可抢占;
破坏循环等待:有两种方案:
一种方法是保证每个进程在任何时刻只能占用一个资源,如果要请求另一个资源,必须先释放第一个资源;
另一种方法是将所有资源进行统一编号,进程可以在任何时刻请求资源,但要求进程必须按照顺序请求资源。
死锁避免

为了避免因为预防死锁而导致所有线程变慢,死锁避免采用了与死锁预防相反的措施。它允许三个必要条件,但通过算法判断资源请求是否可能导致循环等待的形成并相应决策,来避免死锁点的产生。因此,其前提是知道当前资源使用的整体情况,以及申请资源线程本身所占有的资源细节。

判断和决策中,主要使用两种避免方法。

线程启动拒绝:如果一个线程的请求会引发死锁,则不允许其启动。
资源分配拒绝:如果一个线程增加的资源请求会导致死锁,则不允许此申请。
整体来看,死锁避免是从资源和线程相互间关系着手,避免形成循环等待是其主要任务。

死锁检测和恢复

可以允许系统进入死锁状态,但会维护一个系统的资源分配图,定期调用死锁检测算法来检测途中是否存在死锁,检测到死锁发生后,采取死锁恢复算法进行恢复。

死锁检测方法如下:

在资源分配图中,找到不会阻塞又不独立的进程结点,使该进程获得其所需资源并运行,运行完毕后,再释放其所占有的全部资源。也就是消去该进程结点的请求边和分配边。
使用上面的算法进行一系列简化,若能消去所有边,则表示不会出现死锁,否则会出现死锁。
检测到死锁后,就需要解决死锁。目前操作系统中主要采用如下几种方法:

取消所有死锁相关线程,简单粗暴,但也确实是最常用的
把每个死锁线程回滚到某些检查点,然后重启
连续取消死锁线程直到死锁解除,顺序基于特定最小代价原则
连续抢占资源直到死锁解除

相关文章
|
9月前
|
存储 编译器 程序员
【C语言】auto 关键字详解
`auto` 关键字用于声明局部变量的自动存储类,其作用主要体现在变量的生命周期上。尽管现代C语言中 `auto` 的使用较少,理解其历史背景和作用对于掌握C语言的存储类及变量管理仍然很重要。局部变量默认即为 `auto` 类型,因此在实际编程中,通常不需要显式声明 `auto`。了解 `auto` 关键字有助于更好地理解C语言的存储类及其在不同场景中的应用。
438 1
|
8月前
|
机器学习/深度学习 人工智能 安全
GLM-Zero:智谱AI推出与 OpenAI-o1-Preview 旗鼓相当的深度推理模型,开放在线免费使用和API调用
GLM-Zero 是智谱AI推出的深度推理模型,专注于提升数理逻辑、代码编写和复杂问题解决能力,支持多模态输入与完整推理过程输出。
435 24
GLM-Zero:智谱AI推出与 OpenAI-o1-Preview 旗鼓相当的深度推理模型,开放在线免费使用和API调用
|
11月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
295 0
|
10月前
|
人工智能 Cloud Native Serverless
从零到一:阿里云CAP助你轻松高效构建云应用
云原生应用开发平台CAP是阿里云提供的一站式应用开发及生命周期管理平台。它内置丰富的Serverless和AI应用模板、先进的开发者工具和企业级应用管理功能,帮助个人和企业开发者快速构建、部署和管理云上应用,大幅提升研发、部署和运维效能。CAP支持Web应用、AI应用、ETL数据处理等多种场景,提供图形化、低代码的流程编排能力,助力开发者高效构建复杂业务流程。
|
11月前
|
存储 安全 Windows
U盘无法访问怎么解决?7个U盘修复方法
​U盘很常见也很常用,平时在存储文件和传输数据的时候使用频率非常高。经常使用U盘的用户可能对U盘无法访问的情况比较熟悉了。U盘出现打不开无法访问数据的问题时不仅会影响我们的工作和学习效率,最致命的是还会导致重要数据的丢失。所以,U盘无法访问是什么原因引起的呢?遇到这个问题的时候怎么处理才稳妥呢?今天就和大家一起了解一下U盘无法访问的原因和应对的方法,帮助大家轻松摆脱困扰。
|
11月前
|
缓存 前端开发 JavaScript
前端技术趋势:探索现代Web开发的新领域
【10月更文挑战第1天】前端技术趋势:探索现代Web开发的新领域
281 4
|
12月前
|
数据采集
基于R语言的GD库实现地理探测器并自动将连续变量转为类别变量
【9月更文挑战第9天】在R语言中,可通过`gd`包实现地理探测器。首先,安装并加载`gd`包;其次,准备包含地理与因变量的数据框;然后,使用`cut`函数将连续变量转换为分类变量;最后,通过`gd`函数运行地理探测器,并打印结果以获取q值等统计信息。实际应用时需根据数据特点调整参数。
467 8
|
11月前
|
Cloud Native 安全 云计算
云原生技术在现代企业中的应用与挑战
本文探讨了云原生技术在现代企业中的重要性及其应用,并分析了企业在实施过程中面临的主要挑战。通过案例分析,本文展示了如何利用云原生技术提高企业的敏捷性和弹性,同时提出了相应的解决方案和建议。
|
数据可视化 Scala Python
Jupyter 在教育领域的应用与影响
【8月更文第29天】随着数字技术和互联网的发展,教育行业正在经历一场深刻的变革。传统的面对面教学模式逐渐被更加灵活和高效的方式所补充或替代。其中,Jupyter Notebook 作为一种开放源代码的 Web 应用程序,为教学提供了强大的工具,尤其是在 STEM(科学、技术、工程和数学)领域。本文将探讨 Jupyter 在教育中的应用以及它如何改变了教学方式,并提供一些实际的代码示例来展示其功能。
248 1
行为关系支持配置码表:让标签加工与理解更直观!
该功能解决了在行为分析和标签处理中,编码字段理解困难的问题。它允许标签开发人员在配置行为关系时直接关联码表,便于识别字段含义,同时,也让业务人员在查看标签时能直接看到真实含义,提高工作效率。此更新简化了工作流程,提升了标签资产的理解度。
172 3
行为关系支持配置码表:让标签加工与理解更直观!