目录
1. 死锁
1.1 死锁问题
1.1.1 什么时候出现死锁
以车道为例
- 流量只在一个方向。
- 桥的每个部分可以看作为一个资源。
- 如果死锁,可能通过一辆车倒退可以解决(抢占资源和回滚)
- 如果发生死锁,可能几辆车必须都倒退
- 可能发生饥饿
1.1.2 例子 / 为什么会出现死锁
- 原因:一组阻塞的进程持有一种资源等待获取另一个进程所占有的一个资源。
- 例子
- 系统有2个磁带驱动器
- P1和P2各有一个,都需要另外一个。
1.2 系统模型
1.2.1 从数学角度来分析
- 可重复使用的资源
- 在一个时间只能一个进程使用且不能被删除
- 进程获得资源,后来释放由其他进程重用
- 处理器,I / 0通道,主和副存储器,设备和数据结构,如文件,数据库和信号量
- 如果每个进程拥有-个资源并请求其它资源,死锁可能发生
- 使用资源
- 创建和销毁
- 在I / 0缓冲区的中断,信号,消息,信息
- 如果接收消息阻塞可能会发生死锁
- 可能少见的组合事件会引起死锁
1.2.2 资源分配图:表示资源的使用
例子,不存在死锁
当P3需要使用R2时,就有死锁
有循环,无死锁
1.2.3 总结
- 基本情况
- 如果图中不包含循环==>没有死锁。
- 如果图中包括循环==>
- 如果每个资源类只有一个实例,那么死锁。
- 如果每个资源类有几个实例,可能死锁。
1.3 死锁特征
死锁可能出现如果四个条件同时成立
- 互斥:在一个时间只能有一个进程使用资源。
- 持有并等待:进程保持至少-个资源正在等待获取其他进程持有的额外资源。
- 无抢占:一个资源只能被进程自愿释放,进程已经完成了它的任务之后。
- 循环等待:存在等待进程集合{PO, P1, .... PN},P0正在等待P1所占用的资源,P1正在等待P2占用的资源,... PN-1在等待PN所占用资源,PN正在等待P0所占用的资源。
1.3.1 基于特征再分析死锁例子
1.4 死锁处理办法
易想到的办法
- 确保系统永远不会进入死锁状态。
- 运行系统进入死锁状态,然后恢复。.
- 忽略这个问题,假装系统中从来没有发生死锁;用于大多数操作系统,包括UNIX。
1.4.1死锁预防(怎么让死锁不出现 )
1.4.2 死锁避免
在申请资源时,进行检查
是依据是否形成环来判断的
怎末实现
银行家算法(死锁避免的算法)
算法的前提条件
数据结构
设计算法,判断是否为安全状态
银行算法的思路
1.4.3 死锁检测
- 允许系统进入死锁状态
- 死锁检测算法
- 恢复机制
检测方法
数据结构
死锁检测算法
算法的例子
需要关注的地方,检测算法使用
- 何时、使用什么样的频率来检测依赖于:
- 死锁多久可能会发生?
- 多少进程需要被回滚?
- 如果检测算法多次被调用,有可能是资源图有多个循环,所以我们无法分辨出多个可能死锁进程中的哪些“造成”死锁。
解决死锁的办法
- 终止所有的死锁进程
- 在一个时间内终止一个进程直到死锁消除
- 终止进程的顺序应该是
- ➢进程的优先级
- ➢进程运行了多久以及需要多少时间才能完成
- ➢进程占用的资源
- ➢进程完成需要的资源
- ➢多少进程需要被终止
- ➢进程是交互还是批处理
- 选择一个受害者:最小的成本。
- 回滚-:返回到一些安全状态,重启进程到安全状态。
- 饥饿:同一进程可能一直被选作受害者,包括回滚的数量。
2 IPC进程间通信
2.1 概述
2.1.1 通信模型:例子,左边类似邮件,间接通信
2.1.2 直接通信和间接通信
2.1.3 阻塞和非阻塞
2.1.4 通信链路缓存的方式
进程通信的手段
2.2 信号
2.2.1 实现
2.3 管道
2.4 消息队列
2.5 共享内存