五、死锁

概念

定义

在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象

产生死锁的条件

1)互斥条件:争抢必须互斥使用的资源

2)不剥夺条件:进程占据互斥资源后只能主动释放而不能被强行剥夺

3)请求和保持条件:进程已经占有至少一个资源,又提出了新的资源请求,而该资源又被其他进程占有

4)循环等待条件:存在进程资源的循环等待链,链中的每一个进程已获得的资源同时被另一个进程所请求

注意:发生死锁时一定有循环等待,但是发生循环等待时未必死锁

预防

破坏互斥条件

使用特定技术将只能互斥使用的资源改造为允许共享使用

破坏不剥夺条件

申请资源得不到时,主动释放所占有资源(可能导致进程饥饿)

申请资源被其他进程占用时,由 OS 协助剥夺

破坏请求和保持条件

进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行

缺点:进程在整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。也有可能导致某些进程饥饿

破坏循环等待条件

首先为系统中的资源编号,要求进程只能按编号递增顺序请求资源

原理分析:

一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源

按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,就不会产生循环等待的现象

缺点:

不方便增加新的设备,需要重新分配所有的编号

若进程实际使用资源的顺序和编号递增顺序不一致,会导致资源浪费

必须按规定次序申请资源,用户编程麻烦

避免

概念

安全序列:如果系统按照这种序列分配资源,则每个进程都能顺利完成

安全状态:系统存在安全序列,则处于安全状态,安全状态一定不发生死锁。安全序列可能有多个

不安全状态:如果分配资源后,系统中找不出任何一个安全序列,系统就进入了不安全状态。可能发生死锁

死锁的避免:在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁

银行家算法

核心思想:

在分配资源前,预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求,从而使得系统避免死锁

银行家算法步骤:
1)检查此次申请是否超过之前声明的最大需求数,若超过则拒绝
2)检查此时系统剩余的可用资源是否还能满足这次请求,若不足则阻塞
3)试探着分配,用安全性算法检查此次分配是否会导致系统进入不安全状态。若会进入则阻塞
安全性算法步骤:
1)检查当前的剩余可用资源是否能满足某个进程的最大需求(加上该进程原来持有的资源),如果可以,就把该进程加入安全序列并把该进程持有的资源全部回收
2)不断重复上述过程,看最终是否能让所有进程都加入安全序列。

检测

资源分配图

1.构成:

圆代表一个进程,框代表一类资源,框中圆个数代表一类资源的个数

请求边(进程的出边):表示进程还需要申请几个资源(每条边代表一个)

分配边(资源的出边):表示已经为进程分配了几个资源(每条边代表一个)

2.化简:

尝试满足进程的请求边,若该进程所有请求边都能全部满足,则删去该进程,归还所有资源。

重复上述过程直到没有进程可以删去

死锁定理

如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁

解除

1)资源剥夺法:挂起(暂时放到外存上)某些死锁进程,并释放它的资源

2)撤销进程法(或称终止进程法):强制杀死部分甚至全部死锁进程,释放这些资源

3)进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇