操作系统面试—死锁

本文是对操作系统概念(第七版)第七章——死锁的学习总结,不足之处,欢迎各位批评指出。

1、死锁的必要条件(重要)

互斥——至少有一个资源必须处于非共享状态,即一次只能有一个进程使用。

占有并等待——一个进程必须占有至少一个资源,并等待另一资源,而该资源为其他进程占有。

非抢占——资源不能被抢占。

循环等待——有一组等待进程{p0,p1,p2,...pn},p0等待的资源为p1所有,p1的资源为p2所有,。。。。pn的资源为p0所有。


2、系统资源分配图

死锁问题可以用系统资源分配图来描述。含有两种类型节点,资源集合和进程集合。其中有两种类型的边:

申请边——进程到资源的有向边,表示进程已经申请并且在等待。

分配边——资源到进程的有向边,表示资源已经分配给该进程。

可以证明:若资源分配图没有边,那么将不会有死锁。如果有环,可能出现死锁。

可能的含义是因为:如果每个资源只有一个实例,那么存在环必将存在死锁,这种情况下环就是死锁存在的充分必要条件。如果存在多个实例,则是必要条件而非充要条件。


3、死锁的处理方法

a,使用协议预防或者避免死锁,确保系统不会进入死锁状态

b,可允许系统进入死锁状态,然后检测并且修复

c,可忽视这个问题,认为死锁不会发生,就算发生,进行重启处理等。(针对死锁很少发生的情况,人工修复)

说明:死锁预防和死锁避免是两种方法。

死锁预防——通过破坏死锁的四个必要条件中的一些,这些方法通过限制如何申请资源的方法来预防死锁。

死锁避免——要求操作系统预先得到有关进程申请资源和使用资源的额外信息,再进行操作。


下面进行一一详细介绍:

4、死锁预防

互斥——对于非共享资源,必须要有互斥条件。因此通常不能通过否定互斥条件来预防死锁,因为有的资源本身就是非共享的

占有并等待——为了否定这个条件,必须保证:当一个进程申请一个资源时,他不能占有其他资源。因此得到一下两种协议:

a,每个进程在执行前申请并获得所有资源

b,允许进程在没有资源时才可以申请资源,一个资源可以申请一些资源并使用他们,但是在申请更多的资源之前必须释放已分配到的所有资源。

注意这两个协议的区别:一个是一次性申请所有资源,另一个则是申请部分资源,并且保证申请之前释放其他资源。

这两种协议的缺点:资源利用率低,可能发生饥饿(如一个资源需要常用资源)。

非抢占——可以使用以下协议:如果一个进程占有资源并申请另一个不能被立即分配的资源,那么其现已被分配的资源允许被抢占。即这些资源被隐式地释放了,抢占资源分配到进程所等待的资源的链表上。这个协议通常用于状态可以保存和恢复的资源,如cpu寄存器和内存。

循环并等待——一个确保其不成立的方法是对所有资源进行完全排序,且要求每个进程按递增顺序申请资源。

可以采用以下两个协议来实现预防死锁:每个进程只按递增顺序申请资源,要求一个进程申请资源类型时,他必须释放比他顺序大的资源。这样就不会形成循环等待了。


死锁预防的副作用是低设备使用率和系统吞吐率。

5、死锁避免

死锁避免算法动态地检测资源分配状态以确保循环等待条件不成立

说到死锁避免,首先需要明白什么是安全状态。

如果系统能按某个顺序为每个进程分配资源(不超过其最大值),那么系统状态是安全的,换句话说就是,如果存在一个安全序列,那么系统处于安全状态。那么什么是安全序列呢?

进程顺序,如果对于每个进程pi,pi仍然可以申请的资源数不超过当前可用资源数加上所有其他进程所占有的资源,那么这一个顺序称为安全序列。

注意死锁状态肯定是不安全状态,但是不安全状态不一定是死锁状态,死锁状态是不安全状态的子集。

两种死锁避免的算法:

a,资源分配图算法

如果有一个资源分配系统,每个资源都只有一个实例,在资源分配图的基础上引入需求边,需求边pi->rj表示进程pi可能在将来某个时候申请资源rj。这种边类似于同一方向的申请边,但是使用虚线表示的。当进程pi申请资源rj时,需求边就变成申请边。类似的,进程释放时,分配边就变成需求边,因此需求边是分配边和申请边的过度边。假设进程pi申请资源rj。只有将申请边变成分配边而不会导致资源分配图形成环时,才允许申请。注意环检测算法为o(n^2)。这种算法需要事先说明所要求的资源,即当进程pi开始执行是,所有需求边必须先处于资源分配图中。

b,银行家算法

由于时间和精力有限,也由于银行家算法比较经典,所以银行家算法将在下一篇博文中讲解。感谢您的阅读。





你可能感兴趣的:(数据结构与算法)