news 2026/4/21 17:53:45

死锁的定义是指多个进程(或线程)在执行过程中,由于竞争资源或彼此通信而造成的一种阻塞现象

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
死锁的定义是指多个进程(或线程)在执行过程中,由于竞争资源或彼此通信而造成的一种阻塞现象

死锁的定义是指多个进程(或线程)在执行过程中,由于竞争资源或彼此通信而造成的一种阻塞现象,其中每个进程都持有某种资源并等待获取其他进程所占有的资源,导致所有进程都无法继续向前推进的状态。这种状态若无外力干预将永远持续。

死锁的四个必要条件是:

  1. 互斥条件:资源不能被多个进程共享,某一时刻只能由一个进程使用。
  2. 占有并等待:进程已保持至少一个资源,但又提出了新的资源请求,而该资源被其他进程占有,此时请求进程阻塞,但对自己已占有的资源保持不放。
  3. 非抢占条件:已分配给进程的资源,不能被其他进程强行剥夺,只能由该进程自行释放。
  4. 循环等待条件:存在一种进程资源的循环等待链,即P₁等待P₂占有的资源,P₂等待P₃占有的资源,……,Pₙ等待P₁占有的资源。

你提到的三个典型案例分别对应了这些条件的不同组合:

  • 案例(1)进程推进顺序不当:体现了循环等待与占有并等待,是典型的“交叉请求”导致的死锁。
  • 案例(2)同类资源分配不当:当系统无法满足所有进程的最大需求时,若分配策略不合理,容易触发“占有并等待”和“循环等待”,从而引发死锁。
  • 案例(3)PV操作使用不当:信号量的错误使用破坏了同步机制,导致生产者与消费者都无法继续执行,属于同步逻辑错误诱发的死锁。

为避免死锁,可采取以下策略:

  • 预防:破坏上述四个必要条件之一(如预分配资源破坏“占有并等待”)。
  • 避免:使用银行家算法等动态策略确保系统始终处于安全状态。
  • 检测与恢复:允许死锁发生,通过资源图算法检测,并采取终止进程或回滚等方式恢复。
  • 忽略:某些系统(如Linux)选择忽略死锁,依赖程序员正确编写程序。
# 死锁示例模拟(简化版,仅示意)importthreadingimporttime# 定义两个锁lock_A=threading.Lock()lock_B=threading.Lock()defprocess_P1():print("P1: 尝试获取资源 A")lock_A.acquire()print("P1: 已获得资源 A")time.sleep(1)print("P1: 尝试获取资源 B")lock_B.acquire()# 等待 P2 释放 Bprint("P1: 已获得资源 B")lock_B.release()lock_A.release()defprocess_P2():print("P2: 尝试获取资源 B")lock_B.acquire()print("P2: 已获得资源 B")time.sleep(1)print("P2: 尝试获取资源 A")lock_A.acquire()# 等待 P1 释放 Aprint("P2: 已获得资源 A")lock_A.release()lock_B.release()# 启动两个线程模拟死锁t1=threading.Thread(target=process_P1)t2=threading.Thread(target=process_P2)t1.start()t2.start()t1.join()t2.join()print("程序结束")# 实际上可能永远不会执行到这里

银行家算法是一种死锁避免策略,由艾兹格·迪杰斯特拉提出,用于多资源类型环境下的安全资源分配。其核心思想是:在每次资源分配前,系统进行“模拟分配”,判断此次分配是否会导致系统进入不安全状态。只有当分配后系统仍处于安全状态时,才真正分配资源,从而避免死锁。

1. 基本概念

设系统中有:

  • n个进程(P₁, P₂, …, Pₙ)
  • m种资源类型(R₁, R₂, …, Rₘ),每种资源总数为Total[i]

定义以下数据结构:

  • Allocation[i][j]:进程 i 已分配到的 j 类资源数量。
  • Max[i][j]:进程 i 对 j 类资源的最大需求。
  • Need[i][j] = Max[i][j] - Allocation[i][j]:进程 i 还需要的资源数。
  • Available[j]:当前系统中 j 类资源的可用数量。

2. 安全状态与安全序列

一个系统处于安全状态,当且仅当存在一个安全序列——即所有进程的一个执行顺序{P₁, P₂, ..., Pₙ},使得每个进程都能在其后续资源请求中被满足(假设每个进程最终会释放所占资源)。

只要系统始终运行在安全状态下,就可避免死锁。


3. 银行家算法步骤(安全性检测算法)

defis_safe(available,max_claim,allocation):n=len(max_claim)# 进程数m=len(available)# 资源种类数need=[[max_claim[i][j]-allocation[i][j]forjinrange(m)]foriinrange(n)]work=available[:]finish=[False]*n safe_sequence=[]whilelen(safe_sequence)<n:found=Falseforiinrange(n):ifnotfinish[i]:# 检查该进程所需资源是否都 ≤ 当前可用资源ifall(need[i][j]<=work[j]forjinrange(m)):# 假设该进程获得资源并完成forjinrange(m):work[j]+=allocation[i][j]finish[i]=Truesafe_sequence.append(i)found=Truebreakifnotfound:returnFalse,[]# 不安全状态returnTrue,safe_sequence

4. 资源请求处理流程

当某进程 Pi 发出请求 Request[j] 后,系统按如下步骤处理:

  1. 检查请求是否合法
    Request[j] > Need[i][j]→ 错误(超出最大需求)

  2. 检查是否有足够资源
    Request[j] > Available[j]→ 进程等待

  3. 尝试“预分配”并检测安全性

    • 临时更新:
      Available[j]-=Request[j]Allocation[i][j]+=Request[j]Need[i][j]-=Request[j]
    • 调用安全检测算法
    • 若结果为安全 → 真正分配
    • 若不安全 → 拒绝分配,恢复原状态,进程等待

5. 示例说明

假设有三个进程 P0、P1、P2,两类资源 A、B,总量为 [10, 8]

进程Max(A,B)Alloc(A,B)Need(A,B)
P0(7,5)(0,1)(7,4)
P1(3,2)(2,0)(1,2)
P2(9,5)(3,0)(6,5)

Available = [10 - (0+2+3), 8 - (1+0+0)] = [5,7]

调用安全检测算法,发现可以找到安全序列(如 P1 → P0 → P2),因此当前状态安全。

若此时 P2 请求 (2,2),先预分配:

  • New Alloc[P2] = (5,2),Need[P2]=(4,3),Available=(3,5)
  • 再次运行安全检测,若仍能找到安全序列,则允许;否则拒绝。

6. 局限性

  • 要求预先知道每个进程的最大资源需求(现实中难以准确预测)
  • 进程数和资源类型需静态固定
  • 开销较大,频繁调用安全检测影响性能

但它是理论上的重要模型,广泛应用于教学和某些嵌入式或高可靠性系统中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 6:29:41

原创高质量均衡化垃圾图像数据集,涵盖塑料、金属、玻璃、纸板、纸张、杂项垃圾6类标准化RGB图像,每类2300-2500张样本,开箱即用支持ResNet、MobileNet模型训练,适用于智能分拣设备等

高质量均衡化垃圾图像数据集&#xff0c;涵盖塑料、金属、玻璃、纸板、纸张、杂项垃圾6类标准化RGB图像&#xff0c;每类2300-2500张样本&#xff0c;开箱即用支持ResNet、MobileNet模型训练&#xff0c;适用于智能分拣设备等场景 引言与背景 在环保领域的智能垃圾分拣系统研…

作者头像 李华
网站建设 2026/4/18 8:23:35

【接口测试】4_持续集成 _配置Jenkins系统邮箱

文章目录一、163邮箱1.1获取 POP3/SMTP 授权码1.2 服务器信息二、jenkins完成3处配置。一、163邮箱 1.1获取 POP3/SMTP 授权码 说明&#xff1a;要使用之前申请的 163邮箱 来完成配置。 配置成功后&#xff0c;可以借助 Jenkins 在满足某些条件的时候&#xff0c;自动发送邮件…

作者头像 李华
网站建设 2026/4/18 7:37:40

GLM-4.6V-Flash-WEB在HTML前端界面中的调用方式示例

GLM-4.6V-Flash-WEB在HTML前端界面中的调用方式示例 在如今的Web应用开发中&#xff0c;用户不再满足于简单的文本交互。一张图片上传后&#xff0c;系统能否“看懂”内容并给出智能回答&#xff1f;这已成为衡量智能服务成熟度的新标准。然而&#xff0c;多模态大模型虽然能力…

作者头像 李华
网站建设 2026/4/18 8:16:22

大数据架构中的机器学习平台集成方案

大数据架构中的机器学习平台集成方案&#xff1a;从数据到模型的端到端落地指南 一、引言&#xff1a;为什么大数据与ML平台集成是企业的必答题&#xff1f; 1. 一个真实的痛点场景 某零售企业的技术团队最近遇到了一个棘手的问题&#xff1a; 他们有一套成熟的大数据架构&…

作者头像 李华
网站建设 2026/4/18 8:03:55

农业灌溉取用水计量监测与节水增效综合解决方案

一、方案背景 当前&#xff0c;我国农业用水效率与发达国家存在显著差距&#xff0c;灌溉水有效利用系数有待提升。农业作为用水大户&#xff0c;其节水潜力巨大。本方案通过构建“监测-分析-控制-优化”的全流程农业灌溉取用水管理体系&#xff0c;旨在实现水资源的精细化管理…

作者头像 李华
网站建设 2026/4/18 9:42:11

中小河流水文监测综合解决方案

一、方案背景 中小河流作为流域水生态系统的重要组成部分&#xff0c;其水文情势直接关系到区域防洪安全、水资源利用、生态环境保护及经济社会可持续发展。近年来&#xff0c;受极端天气事件频发、人类活动影响加剧等因素影响&#xff0c;中小河流洪水灾害时有发生&#xff0c…

作者头像 李华