进程死锁
死锁的概念
死锁是指在系统中的多个( 进程 )无限期地等待永远不会发生的条件。
产生死锁的四个必要条件
- 互斥
- 请求与保持
- 循环等待
- 不剥夺
防止死锁发生可以破坏四个条件,但破坏互斥不太实际
解除死锁的两种常用方法
-
资源剥夺法
从其他进程那里剥夺足够数量的资源给死锁进程,以解除死锁状态
-
撤销进程法
对待死锁,一般考虑从四个策略:预防、避免、检测、解除
- 银行家算法属于死锁避免策略
- 破坏循环等待条件属于死锁预防策略(资源有序分配法)
- 剥夺资源属于死锁接触策略(资源剥夺法)
为什么资源有序分配不会产生死锁
因为有序方法不会造成资源形成循环等待
银行家算法
在银行家算法中,若出现了下述资源分配情况:
allocation need available
P0 0 0 3 2 0 0 1 2 1 6 2 2
P1 1 0 0 0 1 7 5 0
P2 1 3 5 4 2 3 5 6
P3 0 3 3 2 0 6 5 2
P4 0 0 1 4 0 6 5 6
试问:
(1)该状态是否安全?
(2)如果进程P2提出请求Requst2(1,2,2,2)后,系统能否将资源分配给它?
解题步骤1
-
知道每一列的意思:allocation(进程已经被分配资源数)、need(还需要的资源数)、available(系统空闲资源)
-
列表
进程 work need allocation work+allocation Finish P0 1 6 2 2 0 0 1 2 0 0 3 2 1 6 5 4 T P3 1 6 5 4 0 6 5 2 0 3 3 2 1 9 8 6 T P1 1 9 8 6 1 7 5 0 1 0 0 0 2 9 8 6 T P4 2 9 8 6 0 6 5 6 0 0 1 4 2 15 13 12 T P2 2 15 13 12 2 3 5 6 1 3 5 4 4 18 18 18 T 答:该状态安全 。安全序列为 0 3 1 4 2
解题步骤2
-
判断Request2是否<=need,显然(1,2,2,2)<=(2,3,5,6)
-
判断Request2是否<=available, 显然(1,2,2,2)<=(1,6,2,2)
-
列表计算
进程 Allocation Need Available P0 0 0 3 2 0 0 1 2 0 4 0 0 P1 1 0 0 0 1 7 5 0 P2 2 5 7 6 1 1 3 4 P3 0 3 3 2 0 6 5 2 P4 0 0 1 4 0 6 5 6 答:有表可知,若将资源分配给P2,系统中剩余的空闲资源满足不了任一程序且不会有程序释放资源,系统死锁。
所以,系统不能将资源分配给P2
最少资源分配问题
有相同类型的5个资源被4个进程共享,且每个进程最多需要2个这样的资源就可以运行完毕。试问该系统是否由于对这种资源的竞争而产生死锁?
解:该系统不会由于对这种资源的竞争而产生死锁。
因为在最坏情况下,每个进程都需要2个这样的资源,且每个进程都已申请到了1个资源,那么系统中还剩下1个可用资源。无论系统为了满足哪个进程的资源申请而将资源分配给进程,都会因为该进程已经得了它所需要的全部资源而确保它运行完毕,从而可将它占有的2个资源归还给系统,这样就保证了其余三个进程能顺利运行。
由此可知,该系统不会由于这种资源的竞争而产生死锁。