死锁---操作系统

一、基本概念
不论是在同一个机子,还是在机器之间。不论是硬件资源,还是软件资源,都会发生死锁。

资源:需要排他性使用的对象
资源分类:

  • 可抢占式资源:抢占不会发生副作用。比如内存。
  • 不可抢占式资源 :CD刻录机,一抢占就使CD划坏

一般来说死锁与不可抢占资源有关。可抢占式资源可以通过重新分配资源而解决(比如把内存中的进程换到磁盘上)。

资源获取:

typedef int semaphore;                        
semaphore resource_1;                         
semaphore resource_2;

void process_A(void)
{
      down(&resourse_1);                   //down(&resourse_1);
      down(&resourse_2);                   //down(&resourse_2);
      use_both_resources();
      up(&resourse_1);
      up(&resourse_2);
}

void process_B(void)
{
      down(&resourse_1);                     //down(&resourse_2); 
      down(&resourse_2);                     //down(&resourse_1);
      use_both_resources();
      up(&resourse_1);
      up(&resourse_2);
}

这里的代码是不会发生死锁的,如果把注释的代码换过去执行,则会发生死锁。很明显。

(资源)死锁(还有其他类型死锁)定义:
如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么,改进程集合发生死锁。

死锁条件:

  • 互斥条件,一个资源只有两种状态;已分配,可使用
  • 占有和等待条件,进程得到了一个资源还可以再请求新资源
  • 不可抢占资源
  • 环路等待

    死锁建模:可以用有向图来对进程。资源建模。

二、处理死锁的策略

  • 忽略该问题
  • 检测死锁并恢复
  • 仔细分配资源,动态避免死锁
  • 通过破坏引起死锁的四个条件之一

2.1鸵鸟算法
不理会。有时候发生死锁的频率很低,而系统由于其他问题而导致崩溃频率高一些。就不必理会。

2.2死锁检测与死锁恢复
死锁检测:
每种类型一个资源,比若说一个打印机,一个扫描仪等。先构造有向资源分配图,深度优先算法寻找有无环。

每种类型多个资源:矩阵。现有资源量,可用资源量。请求资源矩阵,当前分配矩阵。(类似银行家算法)

何时检测:每kmin检测,或者当cpu利用率到达某一个界限时检测。

死锁恢复:

利用抢占式恢复:可移动资源从一个进程到另一个进程,这个要看资源的特性。

利用回滚恢复:人为对检查点进行检查,检查点就是将进程的当前状态写入到一个文件中以便重启。发生死锁,选择一个没有发生死锁的检查点,重新分配资源,不过检查点后面的工作全部丢失。

杀死进程恢复:杀死可以从头运行不会产生副作用(不论是在环内,还是在环外杀死进程释放需要的资源)。还有,对于数据库来说第二次运行(被杀死的进程)有时会是危险的,比如对一条记录更新两次。

2.3死锁避免
资源轨迹图:前提是我们知道资源和是分配,根据轨迹图知道何时发生死锁,提前阻塞一个进程就可以了。

安全状态和不安全状态:
安全状态:没有发生死锁,并且每一个进程突然请求对资源的最大需求,也仍然存在某种调度使没一个进程可以运行。则是安全状态。(可以先运行一个释放,在运行一个释放。。。)(存在一个安全序列,保证所有进程可以完成)
不安全状态:不存在一种可行方案

安全状态保证所有进程可以完成,不安全状态不是发生死锁,只是没有保证所有进程可以完成。

银行家算法:利用是否处在安全状态按考虑是否分配资源。(不实用,谁能知道自己需要最大的资源数是多少)

(到这里之前的所有讨论证实了:死锁避免是不可能的,因为我们不知道未来的请求)
2.4死锁预防
破坏互斥:假脱机技术。
破坏占有和等待条件:提前分配好所有资源。一进程请求资源时,先暂时释放所占有的资源。然后尝试请求全部资源。
破坏不可抢占条件:抢占资源。
破坏环路等待条件:对资源按序编号,按照编号进行资源请求。

三、其他问题:

3.1两阶段加锁
第一阶段:试图对所需记录信息进行加锁,加锁成功,开始第二阶段的执行,完成后释放锁。如果第一阶段某个资源已被锁住了,就释放所有锁,重新第一阶段。

3.2通信死锁
两个进程发消息通信,A向B发消息,A阻塞,等待B回复。若消息丢书,A阻塞了,B阻塞在发送给A的请求。此时发生死锁。
超时可以中断通信死锁。
但是若由于回复延迟导致超时,而不是信息丢失,接收者可能两次收到消息。这里我们需要研究通讯规则(协议)。

3.3活锁
忙等待,每一个进程都在忙等待中度过他们的cpu时间,貌似都在运行,没有死锁,实际这种是活锁。

3.4饥饿
饥饿是没有被阻塞,但是永远不会被执行,执行永远被推后。可以通过先来先服务避免。

注;以上只是了解死锁,并不是让我们通过这些方法去解决问题的。现在大多数系统是采用鸵鸟算法的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值