news 2026/4/15 19:45:46

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

作者头像

张小明

前端开发工程师

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/9 2:48:00

产品经理必学!掌握大模型技术的5大核心优势,建议收藏_【大模型时代】产品经理为何必须学习大模型?

产品经理学习大模型(GPT、BERT等)能显著提升工作效率与决策质量&#xff0c;包括用户需求分析、市场趋势预测、项目管理、产品设计和数据分析等方面。文章详细介绍了这些优势的具体应用场景&#xff0c;并提供系统化学习资源&#xff0c;如学习路线图、视频教程、技术文档和面试…

作者头像 李华
网站建设 2026/4/15 7:30:03

Beta冲刺第5天 - 智能推荐与系统优化

SCRUM部分 今日完成工作 成员 完成任务 耗时 剩余时间 代码提交记录 ------ --------- ------ ---------- ------------- 张泽瑞 API文档编写与测试&#xff0c;完成接口文档 4小时 0小时 屏幕截图 2025-12-31 131713.png 吴欣泽 资源评价与推荐系统实现&#…

作者头像 李华
网站建设 2026/4/10 9:01:47

GLM-4.6V-Flash-WEB支持的多模态任务类型全面梳理

GLM-4.6V-Flash-WEB支持的多模态任务类型全面梳理 在如今智能应用快速迭代的背景下&#xff0c;用户对“看懂图像、理解语义”的需求早已不再局限于实验室场景。从客服系统自动识别上传的订单截图&#xff0c;到教育平台解析学生手写作业&#xff0c;再到内容审核中精准判断图文…

作者头像 李华
网站建设 2026/4/15 19:45:29

【tips】100vh

移动端浏览器和PC端浏览器的100vh区别&#xff1b; 在两端window.innerHeight都为512时&#xff0c; PC端的100vh的dom.offsetHeight 512; pda端&#xff08;移动端&#xff09;100vh的dom.offsetHeight 568;&#xff08;这就导致了定位100vh上的底部的元素被底部导航栏遮挡&…

作者头像 李华
网站建设 2026/4/12 16:59:01

从零开始部署GLM-4.6V-Flash-WEB:Docker镜像源加速技巧分享

从零开始部署GLM-4.6V-Flash-WEB&#xff1a;Docker镜像源加速技巧分享 在AI模型日益“重装化”的今天&#xff0c;一个看似简单的部署任务——拉取并运行一个多模态大模型的Docker镜像&#xff0c;往往卡在第一步&#xff1a;网络。尤其对于国内开发者而言&#xff0c;面对动…

作者头像 李华