OS——死锁
Posted Albert Nie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OS——死锁相关的知识,希望对你有一定的参考价值。
文章目录
死锁(Deadlock)
在计算机系统中有很多独占性的资源,在任一时刻它们都只能被一个进程使用。因此,操作系统都具有授权一个进程(临时)排他地访问某一种或多种资源的能力。
软硬件资源都有可能出现死锁。大部分死锁都和资源有关,那什么是资源?
资源
什么是资源?
资源就是随着时间的推移,必须能获得、使用、以及释放的任何东西,包括硬件和软件。
资源的分类
资源可分为两类:可抢占的(preemptable)和不可抢占的。
可抢占的:资源在别的进程手中,可强抢,不会有任何坏处,如内存(被调度换出)。
不可抢占的:资源在别的进程手中,不可强抢。
那如何判断某个资源是否为可抢占的?这起决于具体场景。
总的来说,死锁与不可抢占资源有关。可抢占资源的潜在死锁通常可以通过在进程之间重新分配资源而化解。
资源的使用过程:
- 请求资源:不同系统,进程请求资源的方式不同,返回方式也不同
- 使用资源:为每个资源配置一个信号量或互斥锁来加以保护
- 释放资源
在多进程中,资源的获取和释放有一定的顺序,否则就会造成死锁。
// 正确
typedef int semaphore;
semaphore resource_1;
semaphore resource_2;
void process_A(void){
down(&resource_1); // obtain resource_1
down(&resource_2);
use_both_resources();
up(&resource_2);
up(&resource_1); // free resource_1
}
void process_B(void){
down(&resource_1);
down(&resource_2);
use_both_resource();
up(&resource_2);
up(&resource_1);
}
// 可能造成死锁
typedef int semaphore;
semaphore resource_1;
semaphore resource_2;
void process_A(void){
down(&resource_1); // obtain resource_1
down(&resource_2);
use_both_resources();
up(&resource_2);
up(&resource_1); // free resource_1
}
void process_B(void){
down(&resource_2);
down(&resource_1);
use_both_resource();
up(&resource_1);
up(&resource_2);
}
死锁
定义
如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是死锁的。
资源死锁是最常见的类型,但不是唯一的类型。
资源死锁的条件
资源死锁有四个必要条件:
- 互斥条件。每个资源要么可用,那么被使用,即资源不能同时分配个多个进程。
- 占用和等待条件。已经得到某个资源的进程可以再请求新的资源。
- 不可抢占条件。已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
- 环路等待条件。死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每一个进程都在等待着下一个进程所占有的资源。
处理死锁的策略
有四种处理死锁的策略:
- 忽略该问题。鸵鸟算法。
- 检查死锁并恢复。让死锁发生,检查它们是否发生,一旦发生,则采取行动解决问题。
- 仔细对资源进行分配,动态地避免死锁。
- 通过破坏引起死锁的四个必要条件之一,防止死锁的产生。
从死锁中恢复
- 利用抢占恢复
- 利用回滚恢复
- 通过杀死进程恢复:最直接最简单的解决死锁的方法就是杀死一个或若干个进程。
死锁避免
- 资源轨迹图。基于一个安全状态的概念。
- 银行家算法
死锁预防
- 破坏互斥条件:一切都使用假脱机技术
- 破坏占有并等待条件:进程执行前必须请求所需的全部资源。
- 破坏不可抢占条件:抢占资源
- 破坏环路等待条件:对资源按序编号
参考资料
现代操作系统(第四版)
以上是关于OS——死锁的主要内容,如果未能解决你的问题,请参考以下文章