文章目录
2. 死锁
2.1 死锁的必要条件
-
互斥
资源必须处于非共享模式,即因此只能有一个进程访问。如果有另一个进程申请该资源,那么必须等到该资源被释放为止。
-
占有且等待
指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但又对自己已获得的资源保持不放。
-
不可抢占
已经分配给一个进程的资源不能强制地被抢占,它只能被占有它的进程主动释放。
-
循环等待
若干进程之间形成一种头尾相接的循环等待资源的关系(如A等待B,B等待C,C等待A)
只有同时满足这四个必要条件,才会发生死锁。
2.2 死锁预防
死锁预防是采用某种策略,限制并发进程对资源的请求,从而使得死锁的必要条件在系统执行的任何时间上都不满足。
只要破坏任何一个死锁的必要条件,就可以预防死锁的发生。但是一般比较实用的是通过破坏第二个和第四个必要条件入手。
-
破坏互斥条件
对于只读文件、磁盘等资源可采用这种办法处理。但往往有很多资源是不能同时访问的 ,所以这种做法在大多数的场合是行不通的。
-
破坏占有且等待条件——一次性申请全部资源(静态分配策略)
一个进程必须在执行前就申请到它所需要的全部资源,并且直到它所要的资源都得到满足之后才开始执行。
这个方法的缺点是可能导致资源利用率和进程并发性降低。因为在每个进程所占有的资源中,有些资源是在比较靠后的执行时间里采用的,甚至有些资源是在额外的情况下才使用的,这样就可能造成了一个进程占有了一些几乎不用的资源而使其他需要该资源的进程产生等待的情况。
-
破坏不可抢占条件
这是一种剥夺式方法,但目前一般仅适用于主存资源和处理器资源的分配,并不适用于所有的资源,会导致资源利用率下降。
-
破坏循环等待条件——对资源编号(层次分配策略)
对系统资源事先进行编号,规定进程请求所需资源的顺序必须按照资源的编号依次执行。
在层次分配策略下,所有的资源被分成了多个层次,一个进程得到某一层的一个资源后,它只能再申请较高一层的资源;当一个进程要释放某层的一个资源时,必须先释放所占用的较高层的资源,按这种策略,是不可能出现循环等待链的,
这种方式可以有效==提高了资源的利用率和系统吞吐量,但是增加了系统开销