一、信号量与PV操作
1.基本概念
临界资源:各个进程间需要互斥方式对其进行共享的资源,即在某一时刻只能被一个进程使用,该进程释放后又可以被其他进程使用。
临界区:每个进程中访问临界资源的那段代码。
信号量机制:由荷兰学者Dijkstra提出,包含:一个整型变量(表示资源数量),一个等待队列(存放等待资源的进程)、两个原子操作(P操作和V操作)。
2.PV操作原理
1.P操作(申请资源)
a.信号量值减1
b.如果结果小于0,则进程进入等待队列阻塞
2.V操作(释放资源)
a.信号量值加1
b.若结果小于等于0,则唤醒一个等待进程

3.信号量类型
| 类型 | 初始值 | 用途 |
|---|---|---|
| 互斥信号量 | 1 | 保护临界区,实现互斥 |
| 计数信号量 | N | 管理有限数量的同类资源 |
| 二进制信号量 | 0或1 | 简化版的互斥机制 |
4.经典问题解决方案
例如在生产者和消费者的问题中,生成者生产一个商品S,而后要申请互斥的使用该仓库,即首先需要执行互斥信号量P(S0),申请到仓库独立使用权后,再判断仓库是否有空闲(信号量S1),执行P(S1),若结果大于0,表示仓库有空闲,再将S放入仓库中,此时仓库数量(信号量S2)增加1,即执行V(S2)操作,使用完毕后,释放互斥信号量V(S0)。
对于消费者,首先也需要执行互斥信号量P(S0),申请到仓库独立使用权后,再判断仓库在是否有商品,执行P(S2),若结果大于等于0,表示有商品,可以取出,此时造成了一个结果,即仓库空闲了一个,执行V(S1)操作,使用完毕后,释放互斥信号量V(S0).
因此,执行P操作是主动的带有判断性质的-1,执行V操作是被动的因为某操作参数的+1
二、前趋图与PV操作
前趋图相关概念可查看上一篇文章。
1.前趋图实例分析

表示:
P1必须在P2和P3之前执行
P2和P3都必须在P4之前执行
P2与P3之间没有顺序约束(可以并行)
2.PV操作实现原理
1.基本规则:
1.为每个前趋边创建信号量:初始值为0
2.前趋节点末尾执行V操作:释放信号量表示“已完成”
3.后继节点开头执行P操作:等待信号量表示“等待前趋完成“
2.实现步骤(以示例图为例)
1.创建信号量:
a(P1→P2)
b(P1→P3)
c(P2→P4)
d(P3→P4)
2.各进程操作:
P1:执行自身操作 → V(a) → V(b)
P2:P(a) → 执行操作 → V(c)
P3:P(b) → 执行操作 → V(d)
P4:P(c) → P(d) → 执行操作
3.关键注意事项
信号量初始化:
所有信号量初始值为0(表示初始不可用)
只有前驱完成V操作后,后继才能通过P操作
三、死锁
1.死锁的定义
死锁是指多个进程在执行过程中,因为争夺资源而造成的一种互相等待的现象,若无外力干涉,这些进程都无法继续执行下去。
2.死锁产生的必要条件
1.互斥条件:资源一次只能由一个进程占用
2.占有并等待:进程持有至少一个资源,并等待获取其他被占用的资源
3.非抢占式条件:已分配给进程的资源不能被其他进程强行夺取
4.循环等待条件:存在一个进程等待的循环链
3.死锁处理方法
(1)预防死锁
通过破坏死锁的四个必要条件之一来预防死锁:
破坏互斥条件:使资源可共享(不总是科学)
破坏占有并等待:要求进程一次性请求所有资源
破坏非抢占式条件:允许抢占资源
破坏循环等待条件:对资源进行排序,按序申请
(2) 避免死锁
银行家算法:系统在分配资源前先计算分配的安全性,确保不会进入不安全状态。
算法步骤:
1.初始化:可用资源向量Available,最大需求矩阵Max,分配矩阵Allocation,需求矩阵Need
2.安全性检查:寻找安全序列
3.资源请求处理:检查请求是否合法,然后模拟分配并检查安全性
(3) 检测死锁
资源分配图法:将系统状态表示为有向图,检测图中是否存在环路
等待图法:仅考虑进程间的等待关系,检测环路
(4) 解除死锁
检测到死锁后,可采用以下方法之一:
资源抢占:从某些进程中抢占资源分配给其他进程
终止进程:终止一个或多个死锁进程
终止所有死锁进程
一次终止一个进程直到死锁解除
&spm=1001.2101.3001.5002&articleId=148848753&d=1&t=3&u=c1c3a46b5ac94a80a893168de9deeaf7)
1万+

被折叠的 条评论
为什么被折叠?



