操作系统学习笔记---死锁
前面几篇文章已经讲解了关于进程与线程的知识,本节带来操作系统中的死锁。
正文
资源
一个进程在使用资源之前要申请资源,在用完之后必须释放资源。进程是按照它完成任务所需资源情况来申请资源的。显然,进程申请资源数量,不能超过系统中可用资源的总量。
可抢占资源
可抢占资源是另外进程可以从拥有它的进程那里把它抢占过去为己所用,并且不会产生任何不良影响。
不可抢占资源
不可抢占资源是不能从当前占有它的进程那里强行占有的资源,必须由拥有者自动释放,否则会引起相关计算的失效。死锁与不可抢占资源有关
死锁
所谓死锁,是指在一个进程集合中的每个进程都在等待仅由该集合中的另一个进程才能引发的事件而无限期地僵持下去的局面。计算机产生死锁的根本原因就是资源有限且操作不当。
死锁的条件
- 互斥条件:独占资源在一段时间内只能由一个进程占有,不能同时被两个及以上的进程占有。
- 占有且等待条件:进程至少已经占有一个资源,但又申请新的资源。由于该资源已被别的进程占有,此时该进程阻塞。
- 不可抢占条件:一个进程所占有的资源在用完之前,其他进程不能强行夺走该资源,只能由该进程用完之后主动释放。
- 循环等待条件:存在一个进程等待序列{p1,p2,...pn},其中,p1等待p2所占有的某个资源,p2等待p3所占有的某个资源,···,而pn等待p1所占用的某个资源,从而形成一个进程循环等待环
资源分配图
可以使用有向图的形式更精准地描述死锁,该图称为系统资源分配图。该图由结对组成:G=(V,E)。式子中,V是顶点的集合,E是边的集合。顶点集合可分为两部分:P={p1,p2,···,pn},它由系统中所有活动进程组成;R{r1,r2,···,rn},它由系统中全部资源类型组成。从进程pi到资源rj的一条又向边记作pi-->rj,表示进程pi申请一个单位的rj资源,但当前pi在等待该资源。从资源rj指向进程pi的有向记作rj-->pi,表示有一个单位的rj资源已分配给进程pi。有向边pi-->rj称为申请边,有向边rj-->pi称为赋给边。在资源分配图中,通常用圆圈表示每个进程,用方框表示每种资源类型。由于不同的资源类型可以有多个,所以用方框中的远点表示各个单位资源。应该注意,申请边要指向表示资源的方框,赋给边必须起于方框中的一个圆点。
环路与死锁
- 如果每类资源的实体都只有一个,那么图中出现环路就说明死锁了。
- 如果每类资源的实体不仅仅只有一个,那么资源分配图中出现环路并不代表一定出现死锁,在这种情况下,资源分配如中出现环路是死锁存在的必要条件,但不是充分条件。
处理死锁的方法
- 利用某些协议预防或避免死锁,保证系统不会进入死锁状态
- 允许系统进入死锁状态,然后设法发现并解除它
- 完全忽略这个问题,好像系统中从来也不会出现死锁
死锁的预防
- 破坏互斥条件:一般来说,用否定互斥条件的办法是不能预防死锁的,因为某些资源固有的属性就是独占的
- 破坏占有且等待条件:为使系统从来不会出现“占有且等待”条件,需要保证一个进程无论什么时候都可申请它没有占有的任何其他资源。一种办法是“预分配资源策略”,即在一个进程开始执行之前就申请并分到所需的全部资源,从而它在执行过程中就不再需要申请另外的资源。还有一种办法“空手申请资源策略”,即每个进程仅在它不占有资源时才可以申请资源。
- 破坏非抢占条件:隐式抢占方法:如果一个进程占有某些资源,他还要申请被别的进程占有的资源,该进程就一定处于等待状态。这时,该进程当前所占有的全部资源可被抢占。另一种方法:抢占等待者的资源,若一个进程申请某些资源,首先应检查它们是否可供使用,如果可用,就分配给该进程;如果它们不可用,就要查看:它们是否已经分配给另外某个正等待附加资源的进程。如果是这样的话,就把所需资源从等待进程那儿抢占过来,分配申请它们的进程。
- 破坏循环等待条件:所有进程对资源的申请严格按照序号递增的次序进行(给资源设置编号)