2.16 管程
(为实现进程的互斥同步的对资源的访问)【解决信号量机制编程麻烦、易出错的问题】
管程的定义和基本特征
- 管程是一种特殊的软件模块,有这些部分组成:
- 局部于管程的共享数据结构说明;
- 对该数据结构进行操作的一组过程;(过程->函数)
- 对局部于管程的共享数据设置初始值的语句;
- 管程有一个名字.
- 管程的基本特征:
- 局部于管程的数据只能被局部于管程的过程所访问;
- 一个进程只有通过调用管程内的过程才能进入管程访问共享数据;
- 每次仅允许一个进程在管程内执行某个内部过程
2.17 死锁
在并发环境下,各进程因竞争资源而造成的一种互相等 待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。 发生死锁后若无外力干涉, 这些进程都将无法向前推进。
死锁发生的条件
-
互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁
-
不剥夺条件
-
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
-
循环等待条件:存在一种进程资源的循环等待链,链中的 每一个进程已获得的资源同时被下一个进程所请求。
注:发生死锁时一定有循环等待,但是发生循环等 待时未必死锁
对系统资源的竞争、进程推进顺序非法、信号量使用不当都会导致死锁。
死锁的处理策略
预防死锁
避免死锁
安全序列
指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。
系统在安全状态一定不会出现死锁,在不安全状态可能出现死锁。
银行家算法
在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求(银行家算法核心思想)
-
数据结构: (系统中有n个进程,m种资源)
-
长度为 m 的一维数组 Available 表示还有多少可用资源
-
n*m 矩阵 Max 表示各进程对资源的最大需求数
-
n*m 矩阵 Allocation 表示已经给各进程分配了多少资源
-
Max – Allocation = Need 矩阵表示各进程最多还需要多少资源
-
用长度为 m 的一位数组 Request 表示进程此次申请的各种资源数
-
-
银行家算法步骤:
-
检查此次申请是否超过了之前声明的最大需求数
-
检查此时系统剩余的可用资源是否还能满足这次请求
-
试探着分配,更改各数据结构
-
用安全性算法检查此次分配是否会导致系统进入不安全状态
-
-
安全性算法步骤:
-
检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列, 并把该进程持有的资源全部回收。
-
不断重复上述过程,看最终是否能让所有进程都加入安全序列
-
检测和解除
死锁的检测算法
(依次消除与不阻塞进程相连的边,直到无边可消)
- 在资源分配图中,找出既不阻塞又不是孤点的进程 Pi消去它所有的请求边和分配边,使之称为孤立的结点。
- 进程 Pi 所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变 为非阻塞进程。根据 1 中的方法进行一系列简化后,若能消去图中所有的边,则称该图是可完全简化的
注:不阻塞进程指其申请的资源数还足够的进程(例如上图的P1为不阻塞进程,P2为阻塞进程)
死锁定理:若资源分配图是不可简化的,说明发生了死锁
死锁的解除算法
用死锁检测算法化简资源分配图后,还连着边的 那些进程就是死锁进程
- 资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给 其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
- 撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资 源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行 了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。
- 进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程 的历史信息,设置还原点。
(决定对“谁”动手)判断依据:
- 进程优先级
- 已执行多长时间
- 还要多久能完成
- 进程已经使用了多少资源
- 进程是交互式的还是批处 理式的