文章目录
- 进程与线程管理
-
- [3.6 死锁](#3.6 死锁)
-
- [3.6.1 死锁的概念](#3.6.1 死锁的概念)
-
- [1. 资源分配与竞争](#1. 资源分配与竞争)
- [2. 死锁的定义](#2. 死锁的定义)
- [3.6.2 死锁的实例分析](#3.6.2 死锁的实例分析)
- [3.6.3 死锁产生的原因](#3.6.3 死锁产生的原因)
进程与线程管理
3.6 死锁
3.6.1 死锁的概念
1. 资源分配与竞争
- 资源管理技术 :在前面的章节中我们介绍了操作系统对各类资源的分配和管理技术,其核心目的在于提高资源的利用率。
- 资源竞争 :实际上,计算机系统中的资源是有限的 。当众多请求资源的进程与系统可分配的有限资源之间产生矛盾时,就会出现资源竞争。
- 互斥使用 :当多个进程竞争共享资源时,可以通过实现资源的互斥使用,使得进程在有限的时间内获得所需资源。
- 死锁的产生 :如果对这种资源竞争处理不当,就会引发死锁。
2. 死锁的定义
指系统中存在一组进程(两个或多个进程),它们中的每一个进程都占用(持有)了某个资源,但又都在等待着其中另一个进程所占用的资源而无限期地僵持下去的局面。
3.6.2 死锁的实例分析
例1:进程A、B对打印机与CD-ROM的竞争
-
场景描述:进程A和进程B在运行过程中都需要使用打印机和CD-ROM这两种设备。
-
死锁过程分析:
- 进程A首先申请并占有了CD-ROM。
- 同时,进程B申请并占有了打印机。
- 之后,进程A尝试申请打印机,但由于打印机已被进程B占用,进程A进入等待状态。
- 接着,进程B也尝试申请CD-ROM,但CD-ROM已被进程A占用,进程B也进入等待状态。
-
结论:
- 进程A和B在得到一个资源后还需要申请第二个资源。
- 在没有得到第二个资源之前,它们都不会归还已有的资源。
- 最终,A占用了B所需的资源(CD-ROM),B也占用了A所需的资源(打印机),彼此互不相让,造成了永远等待 的局面,即死锁。

图片描述:一个环形图,展示了进程A和进程B之间的资源依赖关系。进程A占有CD-ROM并申请打印机,而进程B占有打印机并申请CD-ROM,形成了一个循环等待的闭环。
例2:进程P1、P2对信号量S1、S2的P、V操作
-
场景描述:系统中有两个进程P1和P2,以及两个信号量S1和S2,它们的初值都为1。
-
执行序列:
// 进程P1 // 进程P2 ... ... P(S1) P(S2) P(S2) P(S1) ... ... V(S1) V(S2) V(S2) V(S1) ... ...
-
死锁过程分析:
- P1执行
P(S1)
,成功后占有S1资源 (S1变为0)。 - 此时发生进程调度,P2开始执行。
- P2执行
P(S2)
,成功后占有S2资源 (S2变为0)。 - P1继续执行,尝试
P(S2)
,但S2已被P2占用,P1被阻塞,进入等待状态。 - P2继续执行,尝试
P(S1)
,但S1已被P1占用,P2也被阻塞,进入等待状态。
- P1执行
-
结论:
- P1占有S1资源,等待S2资源。
- P2占有S2资源,等待S1资源。
- P1和P2都陷入了永久等待,产生死锁。
3.6.3 死锁产生的原因
-
系统资源不足:
- 这是产生死锁的根本原因。如果系统资源充足,所有进程的资源请求都能得到满足,死锁就不会发生。
- 由于资源有限,进程需要竞争资源才能继续执行。
-
进程并发执行的顺序不当:
- 即使系统资源不足,但如果进程的推进顺序是合理的,也未必会发生死锁。
- 不当的执行顺序(例如上文例1和例2中的情况)是导致死锁的直接原因。
图形化解释:进程推进图

-
坐标系定义:
- 以一个二维坐标系为例,X轴代表进程P1 的执行进度,Y轴代表进程P2的执行进度。
- 任何一个点
(x, y)
都代表了P1和P2在某一时刻的执行状态。
-
资源定义:
- r1: 打印机
- r2: 读卡机
- 进程P1和P2共享这两个资源。
- 假设系统中只有一个CPU,每个时刻只允许一个进程运行,因此进程的推进轨迹只能是水平或垂直的。
-
资源占用与危险区域:
- P1的执行过程需要先占用r1(A1点到D1点之间),再占用r2(B1点到C1点之间)。
- P2的执行过程需要先占用r2(A2点到D2点之间),再占用r1(B2点到C2点之间)。
- 图中阴影部分构成了危险区域。这个区域代表P1占用了r1,同时P2占用了r2。如果进程的执行轨迹进入这个区域,例如到达点N,此时P1请求r2,P2请求r1,就会发生死锁。

图片描述:一个二维坐标图,X轴为P1进程,Y轴为P2进程。图中有两个矩形区域,分别表示P1和P2占用资源r1和r2的时间段。这两个区域的交集形成一个"危险区域"。图中用不同的路径(如路径1、2、3)展示了进程的推进过程,其中路径3进入了危险区域导致死锁。
- 结论 :
由此可知,在多道程序运行时,按照一定的顺序联合推进,可以使系统中的所有进程运行完毕;否则,不当的推进顺序会使进程进入危险区域而产生死锁。