进程通信与死锁
进程通信
什么是进程通信
进程通信是指进程之间的信息交换,其所交换的信息量少则是一个状态或数值,多则是成千上万个字节
分类
进程通信分为低级通信和高级通信两种
低级通信
进程的互斥和同步可归结为低级通信
在进程互斥中,进程通过修改信号量向其他进程表明理解资源是否可用
高级通信
用户可以直接利用操作系统所提供的一组通信命令高效地转送大量数据
高级进程通信方式的通信过程对用户是透明的
高级通信又可以分成三大类
1. 共享存储器系统
互相通信的进程共享某些数据结构或共享存储区,所以分成两类
- 基于共享数据结构的通信方式
- 基于共享存储区的通信方式
2. 消息传递系统
进程间的数据交换以消息为单位。程序员直接利用系统提供的一组通信命令来实现通信,也可以分成两种
- 直接通信方式
- 间接通信方式:发送进程将消息发送到信箱中,接收进程在信箱中取得信息
3.管道通信
管道:用于连接一个读进程和一个写进程已实现它们之间通信的共享文件 ----->pipe文件
管道通信机制必须提供三方面的协调能力:
- 互斥
- 同步
- 判断对方是否存在
死锁
死锁的定义
在多道程序系统中,一组进程中的每一个进程均无期限地等待被改组进程中的另一个进程占有且永远不会释放的资源。
产生死锁的原因
- 竞争资源
- 进程推进顺序不当
产生死锁的必要条件
- 互斥条件 : 一个资源在一段时间内只能被一个进程占有
- 请求和保持条件 : 进程因为请求资源阻塞是,对已经获得的资源保持不放
- 不剥夺条件:进程获得的资源在使用完之前不能被剥夺
解决死锁的四种方式
预防死锁
- 抛弃请求和保持条件
即进程一次申请所有需要的资源,进程在运行过程中不会再提出任何资源请求
优点:易于实现,安全
缺点:资源浪费严重,进程延迟进行
- 抛弃不剥夺条件
进程已经占有的资源在运行过程中可能被暂时释放
- 抛弃环路等待条件
避免死锁
安全状态
系统能够按某种进程顺序,如<P1,P2,P3…>(安全序列),来为某个进程分配所需资源,直到最大需求,使每个进程都可以顺利完成。
系统存在这样一个安全序列则成为系统处于安全状态,否则处于不安全状态
避免死锁的本质就是让系统不进入不安全状态
避免死锁的银行家算法
- 可利用资源向量Available : 初始值为系统中所配置的该类全部可用资源的数目
- 最大需求矩阵Max :代表某进程需要某资源的最大数目
- 分配矩阵Allocation : 表示进程已分得的资源的数目
- 需求矩阵Need :表示进程还需要资源的数目
- 工作向量Work : 表示系统可提供给进程继续运行所需的各资源数目
- Finish :表示系统是否有足够的资源分配给进程使之运行完成
以某时刻的系统状态表为例
进程 | Max | Allocation | Need | Available | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
R1 | R2 | R3 | R1 | R2 | R3 | R1 | R2 | R3 | R1 | R2 | R3 | |
P1 | 7 | 5 | 3 | 0 | 1 | 0 | 7 | 4 | 3 | 3 | 3 | 2 |
P2 | 3 | 2 | 2 | 2 | 0 | 0 | 1 | 2 | 2 | |||
P3 | 9 | 0 | 2 | 3 | 0 | 2 | 6 | 0 | 0 | |||
P4 | 2 | 2 | 2 | 2 | 1 | 1 | 0 | 1 | 1 | |||
P5 | 4 | 3 | 3 | 0 | 0 | 2 | 4 | 3 | 1 |
以进程P1为例我们可以知道P1进程需要R1 R2 R3 的最大数目为 7 5 3 ,已经拥有的数目为 0 1 0 需要 7 4 3才能够完成任务,目前可用资源数为 3 3 2
具体分析过程:刚开始work = available为 3 3 2,P2.need < work所以可以支持P2完成任务,P2完成任务,释放资源数为 2 0 0 此时work变为 5 3 2 ----> Finish[2] = 1
然后P4.need < work ,可以支持P4完成工作,P4完成释放资源 2 1 1,work变为 7 4 3 -----> Finish[4] = 1
P5.need < work ,P5 完成释放资源 0 0 2,work变为 7 4 5 -----> Finish[5] = 1
P3.need <work, P3完成释放资源 3 0 2 ,work 变为 10 4 7 ------> Finish[3] =1
P1.need < work,P1完成释放资源 0 1 0,work变为 10 5 7 -------> Finish[1] = 1
得到一条安全序列 2 4 5 3 1 所以该系统处于安全状态
检测死锁
- 资源分配图
以下图为例,进程P1分配到了两个R1,正在请求一个R2 ,线程P2分到了一个R1,一个R2,正在请求R1
-
死锁定理
当且仅当S状态资源分配图是不可完全简化的
死锁的检测算法可以采用银行家算法中的安全检测算法来完成
解除死锁
解除死锁的两种方法
- 剥夺资源 :从其他进程中剥夺足够的资源给死锁进程
- 撤销进程 :将全部死锁进程清除掉
学习资料 操作系统 第四版 刘振鹏 张明 王煜著