操作系统-- 死锁(一)

在多道程序设计环境下, 多进程可能竞争一定数量的资源。一个进程申请资源, 如果资源不可用, 那么进程进入等待状态。如果所申请的资源被其他等待进程所占,那么该等待进程有可能无法改变状态, 这种情况称为 死锁(deadlock)。
最好的死锁例子据说是 Kansas立法机构与20实际早期通过的一个法规,其中说到“当两列列车在十字路口逼近时, 它们要完全停下来, 且在一列列车开走之前另一列列车不能启动”
这里,描述操作系统用于预防或处理死锁的各种方法。

8.1 系统模型

系统拥有一定数量的资源,分布在若干竞争进程之间。资源分成多种类型,每种类型有相同数量的实例。资源类型的例子有内存空间、CPU周期、文件、I/O设备(打印机和磁带驱动器)。如果系统有两个CPU,那么资源类型CPU就有两个实例。类似地,资源类型打印机 可能有 5个类型。
如果一个进程申请某个资源类型的一个实例,那么分配任何这种类型的实例都可满足申请。否则, 这些实例就不相同,而资源类型的分类也没有正确定义。
例如, 一个系统有两台打印机。如果没有人关心哪台打印机打印那些输出,那么这两台打印机可定义为属于同一资源类型。然而, 如果一台打印机在第九层楼上,而另一台在底层楼下,那么第九层楼的用户就不会认为这两台打印机是相同的,这样每个打印机就可能需要定义成属于不同类型。
进程在使用资源前必须申请资源,在使用资源之后必须释放资源。一个进程可能会申请许多资源以便完成其指定的任务。显然,所申请的资源数量不能超过系统所有的资源的总量。换言之,如果系统只有两台打印机,那么进程就不能申请三台打印机。
在正常操作系统模式下,进程按照如下顺序使用资源:

  1. 申请:如果申请不能立即被允许(例如, 所申请资源正在为其他进程所使用),那么申请进程必须等待,知道它获取该资源为主。
  2. 使用:进程对资源进行操作(例如,如果资源是打印机,那么进程就可以在打印机上打印了)。
  3. 释放:进程释放资源。
    如前面所述,资源的申请与释放为系统调用,例如系统调用request/release device、open/close file、allocate/free memory。其他资源的申请与释放可以通过信号量的wait 与 signal 操作来完成。因此, 对于每次使用,操作系统会检查以确保使用进程已经申请并获取了资源。系统表 记录了每个资源是否空闲或已被分配,如果分配了那么是分配给了哪个进程。如果进程所申请的资源正在为其他进程所使用,那么该进程会被增加到资源的等待队列。
    当一组进程的每个进程等待一个事件,而这一时间只能由这一组进程的另一进程引起,那么这组进程就处于死锁状态。这里所关心的主要事件是资源获取和释放。资源可能是物理资源(如打印机、磁带驱动器、内存空间和CPU周期)或逻辑资源(例如, 文件、信号量和监视器)。然而,其他类型事件也会导致死锁。
    为了说明死锁状态, 考虑一个具有三个磁带驱动器的系统。假定有三个进程,每个进程都占用了一个磁带驱动器。如果每个进程现在需要另一个驱动器,那么这三个进程会处于死锁状态。每个进程都在等待事件“磁带驱动器释放”,这只可能有一个等待进程来完成。这个例子说明了涉及同一种资源类型的死锁
    死锁也可能涉及不同资源类型。例如, 考虑一个系统,具有一台打印机和一台驱动器,假如进程Pi占有 磁带驱动器而Pj占有打印机,如果 Pi申请打印机而Pj申请磁带驱动器,那么就会出现死锁。
    开发多线程引用的程序必须特别关注这个问题:因为多个线程可能因为竞争共享资源而容易产生死锁

8.2 死锁特点

当出现死锁时,进程不能完成执行,且系统资源被占用,阻止了其他作业开始执行。在讨论各种方法处理死锁问题之前,先讨论死锁的特征。

8.2.1 必要条件

如果在一个系统中下面四个条件同时满足,那么会引起死锁。

  1. 互斥:至少有一个资源必须处于非共享模式;即一次只有一个进程使用。如果另一个资源申请该资源,那么申请进程必须延迟知道该资源释放为止。
  2. 占有并等待:一个进程必须占有至少一个资源,并等待另一资源,而该资源为其他进程所占有。
  3. 非抢占:资源不能被抢占:即,只在进程完成其任务之后,才能释放其资源。
  4. 循环等待:有一组进程{P0, P1, …,Pn},P0 等待的资源为 P1所占有,P1等待的资源为P2所占有,Pn-1等待 的资源Pn所占有,Pn等待的资源为P0 所占有。
    强调所有四个条件必须同时满足才会出现死锁。循环等待条件意味着占有并等待条件,这样四个条件并不完全独立。然而,后面会发现分开讨论这些是有用的。

8.2.2 资源分配图

死锁问题可用称为 系统资源分配图的有向图进行更为精确的描述。这种图有一个节点的集合 V和 一个边的集合E组成。节点集合V分成两种类型的节点P = {P1,P2, …, Pn}(系统活动进程的集合)和R = {R1, R2,…, Rn}(系统所有资源类型的集合)。
由进程Pi到资源类型Rj的有向边记为Pi -->Rj;它表示为进程Pi已经申请了资源类型Rj的一个实例,并正在等待资源。由资源类型Rj到进程Pi的有向边记为 Rj -->Pi;它表示资源类型Rj的一个实例已经分配给进程Pi。有向边Pi --> Rj称为申请边;有向边Rj --> Pi称为 分配边
在图上,用圆形表示进程Pi, 用矩形表示资源类型 Rj。由于资源类型 Rj可能有多个实例,所以在矩形中圆点数表示实例数。注意申请边只能指向矩形Rj,而分配边必须指向矩形内的某个圆点。
当进程Pi申请资源类型Rj的一个实例时,就在资源分配图中加入一条申请边。当该申请可以得到满足时,那么申请边就立即转换成分配边。当进程不再需要访问资源时,它就释放资源,因此删除了分配边。
图8.1 的资源分配图表示了如下情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值