1 内容概览
这是第二章的第四部分内容大概讲了以下几点内容:
- 什么是死锁,死锁时如何发生的?
- 死锁与饥饿、死循环的区别是什么?
- 如何预防和避免死锁?
- 如何检测和解除死锁?
原文件(第二章所有)在这里。不仅有思维导图的原文件,还有PDF格式的思维导图。
源文件链接:第二章 进程管理
提取码:9o10
2 死锁、饥饿、死循环的区别
从字面意思就可以很好地区分。
死锁至少是两个进程之间发生的事情,由于进程间的资源抢占等行为使得各个进程不能按照理想的情况顺利进行下去。
饥饿更多时候指的是进程本身,所以是就进程自身而言的,就像是电路原理中讲的自感与互感,自感也是一种独立的行为,系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。
死循环就更好区分了,就是程序员的程序本身发生了死循环,毫不影响系统对其分配处理机。
2 死锁的检测和解除
2.1 死锁的检测
为了对死锁进行检测,必须实施以下两个步骤:
- 用某种数据结构来表示和保存资源的请求和分配情况;
- 提供一种算法,可以利用上述信息来检测系统是否已经进入了死锁状态。
所以资源分配图应运而生。我们可以根据进程资源的分配状态,构建资源分配图,若资源分配图是不可完全简化的,则称此时发生了死锁。
其中圆形表示进程,方框代表某种资源的集合,三角形代表一个具体的某种资源。橙色是请求边,蓝色是分配边。需要注意的是,橙色箭头表示的是分配完毕之后还需要的资源数目。
例如下面的资源分配图:
此时的状态时进程p1的资源申请得到了满足,而p2并未得到满足。因为p2需要一个红色的三角形(资源),而此时已经全部分配完毕。所以我们可以先运行p1进程,而当其运行完毕后,则可以释放相应的资源。如下图所示:
此时提供的资源也可以满足p2的需求,所以再运行p2,自此所有进程都可以运行,所以称这个图是可完全简化的。此时一定没有发生死锁,也就是我们可以找到一个安全序列。
2.2 死锁的解除
采用以上的方法检测到了死锁,但是具体哪个进程处于死锁状态,还需要进一步分辨。**用死锁检测法化简完资源分配图后,还连着边的那些进程属于死锁进程。**也就是说,在该图中,不是孤点所表示的进程就是死锁进程。
死锁解除的具体方法:
- 资源剥夺法:挂起(暂时放到外存上)某些死锁进程,并抢占其资源,将这些资源分配给其他的死锁进程。但应防止被挂起的资源产生饥饿。
- 撤销进程法:强制撤销某些死锁进程或全部进程。并剥夺其资源,将其分配给其他死锁进程,这种方法简单,但可能产生较大的代价。
- 进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
如何决定先处理哪个死锁进程?可以从以下几个方面作出考量。
- 进程优先级。优先考虑处理优先级低的进程,保留优先级高的进程。
- 进程已执行的时间。执行时间越长,回退或者撤销越“麻烦”,因而选择执行时间短的进程优先处理。
- 进程还需要多久结束运行。优先保留剩余时间短的进程让其运行。
- 进程已经占有了多少资源。某进程占有资源越多,则撤销后就可以很快地打破死锁的局面。所以优先考虑处理该进程。
- 进程是交互式还是批处理式的。交互式的进程会对用户的使用体验产生较大的负面影响,所以优先考虑处理批处理进程,而保留交互式进程。
----------------------------------------------------------------------------END---------------------------------------------