什么是死锁

简介: 什么是死锁

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

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

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

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

死锁预防

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

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

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

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

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

死锁检测和恢复

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

死锁检测方法如下:

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

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

相关文章
|
监控 Ubuntu 安全
Ubuntu开启FTP服务教程
在Ubuntu服务器上配置FTP服务是一个常见的需求,无论是用于文件分享、网站管理还是数据备份。FTP(文件传输协议)是一种用于在网络上传输文件的协议,它可以让用户通过身份验证下载或上传文件。本文将指导您如何在Ubuntu系统上安装和配置FTP服务器,以及如何管理用户权限来保证服务器的安全性。
3417 0
|
前端开发 JavaScript 定位技术
folium底图本地化处理
folium底图本地化处理
894 0
|
6月前
|
关系型数据库 MySQL Linux
新手实战指南:Django 项目结构与启动管理
初次接触Django,你是否被它庞大的项目结构劝退?这正是其工程化优势所在。本文将带你从项目创建到服务启停,完整拆解核心文件结构,帮你避开端口占用等常见坑位。学完这篇,你将对Django的整体架构有清晰认知。
|
6月前
|
设计模式 人工智能 开发者
收藏夹里的干货不是知识,大脑里的才是:用这条指令构建你的第二大脑
针对开发者"只收藏不学习"的痛点,提供一套基于费曼学习法的AI指令。通过核心概念提炼、通俗类比讲解和记忆技巧生成,帮助技术人将碎片化信息转化为系统性知识,适用于攻克编程难点、架构选型学习及云厂商认证备考等多种场景。
371 13
|
传感器 人工智能 搜索推荐
教育随身而行——可穿戴设备如何赋能未来课堂?
教育随身而行——可穿戴设备如何赋能未来课堂?
407 16
|
机器学习/深度学习 人工智能 搜索推荐
《深度剖析:鸿蒙系统下智能NPC与游戏剧情的深度融合》
鸿蒙系统为游戏开发带来新机遇,尤其在人工智能游戏中,实现智能NPC与剧情的深度融合成为关键。通过机器学习行为模型和感知决策系统,NPC能根据玩家操作做出合理反应;结合动态剧情生成和数据驱动融合方式,使游戏体验更沉浸、个性化。尽管面临技术挑战,但鸿蒙系统的多设备协同和性能优势,为打造未来智能化游戏奠定了基础。
514 11
中断向量表的作用是什么?
【10月更文挑战第28天】中断向量表在计算机系统中扮演着至关重要的角色,它是实现中断处理、优先级管理、系统初始化以及硬件与软件交互的核心机制。通过中断向量表,计算机系统能够高效地响应各种中断事件,保证系统的稳定性、可靠性和实时性,为计算机的正常运行和各种应用程序的执行提供了有力支持。
1595 60
|
人工智能 自然语言处理 大数据
【阿里云】通义灵码支持 DeepSeek R1 和 V3、Qwen2.5 模型
最近参加了阿里云通义灵码模型切换体验活动,深入体验了DeepSeek R1、V3和Qwen2.5模型。通过简便的注册流程,我轻松参与并测试了不同模型在自然语言处理、计算效率等方面的表现。操作界面清晰,模型切换流畅,性能出色,尤其在大数据处理时表现优异。此外,还获得了Cherry机械键盘等精美奖品。这次体验让我对AI技术有了更深的理解,强烈推荐给AI开发者和爱好者。[立即体验](https://t.aliyun.com/BLkE2b2m)
|
存储 监控 Oracle
Oracle 的集群文件系统(Cluster File System)有哪些特点?
Oracle 集群文件系统(CFS)是 Oracle 集群架构的关键组件,允许多节点共享存储资源。其特点包括:多节点访问和高可用性、确保数据一致性的并发控制与锁管理、通过缓存和负载均衡优化性能、支持动态扩展和分布式架构、提供权限管理和加密保障安全性、与 Oracle RAC 和 ASM 集成,以及具备图形化管理界面和监控工具。
|
IDE 开发工具 Python
用Python绘制一只懒羊羊
本教程介绍如何使用Python和Turtle图形库绘制可爱的懒羊羊。Turtle是Python内置的简单绘图工具,适合初学者。我们通过导入Turtle库、设置画布、绘制头部、眼睛、嘴巴、身体和四肢等步骤,逐步完成懒羊羊的绘制。每个部分都用简单的代码指令实现,最终展示一个完整的懒羊羊图案。通过这个实践,你不仅能学会Turtle的基本用法,还能加深对编程绘图的理解。
746 4