现代操作系统:死锁(7)

在许多应用中,需要一个进程排他性地访问若干种资源而不是一种。当两个(或更多)进程各自独占某一资源而同时被阻塞,并且一直处于这样的状态。这种状况就叫死锁。
除了请求独占性的I/O设备外,软件资源(如数据库)也会可能出现死锁。

资源

大部分死锁都和资源有关,资源可以是硬件设备或是一组信息(如数据库中的一个加锁的记录)。简单来说,资源就是随着时间的推移,必须能获得、使用以及释放的任何东西。

可抢占资源和不可抢占资源

可抢占资源可以让其他进程从占有它的进程中抢占而不会产生任何副作用。存储器就是可抢占的资源。
不可抢占资源是指在不引起相关的计算失败的情况下,无法把它从占有它的进程处抢占过来。如CD刻录机就是不可抢占的。
总的来说,死锁和不可抢占资源有关。可抢占资源的潜在死锁通常可以通过在进程间重新分配资源而化解。
使用一个资源的顺序如下:

  • 请求资源。
  • 使用资源。
  • 释放资源。

如果一个进程请求资源失败,那么它就进入休眠状态(实际和阻塞状态一样)。

死锁概述

死锁的规范定义如下:

如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么,该进程集合就是死锁的。

在大多数情况下,每个进程所等待的事件就是其他进程所占有的资源被释放。这种死锁称为资源死锁

资源死锁的条件

发生资源死锁的四个必要条件:

  1. 互斥条件。每个资源要么已经分配给了一个进程,要么就是可用的。
  2. 占有和等待条件。已经得到了某个资源的进程可以再请求新的资源。
  3. 不可抢占条件。已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
  4. 环路等待条件。死锁发生时,系统中一定有由两个(或以上)的进程组成的一条环路,该环路中的每个进程都在等待其他进程所占有的资源。

预防死锁可以通过破坏上述条件来实现。

死锁检测和恢复

每种类型一个资源的死锁检测

构建一张资源分配图,然后用图论算法检测有向图中是否存在环路,如果是,就存在死锁。

每种类型多个资源的死锁检测

当每种资源存在多个时,就要使用一种基于矩阵的算法。

从死锁中恢复

  • 利用抢占恢复:将资源从一个进程强行取走,之后再送回。
  • 利用回滚恢复:进程检查点会记录资源状态,一旦检测到死锁,拥有所需要资源的进程会回滚到一个时间点。
  • 通过杀死进程恢复

死锁避免

安全/不安全状态

避免死锁的主要算法是基于一个安全状态的概念。

安全状态:即使所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每个进程运行完毕,则称该状态是安全的。
反之,如果不能保证全部完成,则是不安全的。

但是,不安全状态不意味着死锁。

单个资源的银行家算法

设想一个小镇的银行家,他向一群客户分别承诺了一定的贷款额度。算法要做的是判断:对请求的满足是否会导致不安全状态。如果是,就拒绝请求;如果否,就予以分配。这里将客户比作进程,贷款比作资源,银行家比作操作系统。
银行家算法就是对每一个请求进行检查,检查如果满足这一请求是否会达到安全状态。
但银行家算法却缺乏实用价值,因为很少有进程能够在运行前就知道其所需资源的最大值。

通信死锁

在通信系统中,两个或以上的进程利用发送信息进行通信,如果进程A向进程B发送请求信息,然后阻塞直到B回复。但假设请求信息丢失,B会阻塞等待来自A的信息,但该信息永远不会来,于是A和B就进入了死锁。
打破这种通信死锁的方法是超时。在大多数网络通信系统中,只要一个信息被发送至一个特定的地方,并等待其返回一个预期的回复,发送者就同时启动计时器。若计时器在回复到达前就停止了,就认为信息已经丢失,并重新发送。
但在通信系统(网络)中发生的死锁也可能是资源死锁。因特网由两类计算机组成:主机和路由器

主机是一台用户计算机,可以是PC或者服务器,主机由人操作。
路由器是专用的通信计算机,将数据包从源发送至目的地。

每台主机都连接一个或更多的路由器,可以用一条DSL线、有线电视连接、局域网、拨号线路、无线网络、光纤来连接。当一个数据包从主机发送到路由器时,它被放入一个缓冲器中,然后传输到另外一个路由器,再到另一个,直到目的地。这些缓冲器都是数目有限的资源,因此也可能发生资源死锁。

活锁

如果两个进程轮询地请求资源,不管哪个运行,都没有进展,但也没有阻塞,这就造成了活锁。活锁看起来和死锁很像,但并没有进程被真正阻塞。

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值