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

3 DeadLocks

注意:死锁与进程/线程管理密切相关,因此我们把它放在这里,在第2章之后。课程的目标是确保在一个学期内掌握基本知识,我知道我们会讲前6章,所以我们没有必要推迟对死锁的研究。

 

Definition: A deadlock occurs when every member of a set of processes is waiting for an event that can only be caused by a member of the set.

定义:当一组进程中的每个成员都在等待只能由该进程中的一个成员引起的事件时就会发生死锁。通常等待的事件是资源的释放。

在汽车行业,“死锁”被称为“gridlocks”。

  • 进程就是汽车;
  • 资源是指街道上被汽车占用的空间;

 

以计算机科学为例,考虑两个进程A和B,它们都希望将文件从CD复制到空白CD- R。每个处理器都需要独立访问CD阅读器和CD- R刻录机。假设系统中每个设备都有一个,

这完全有可能完美地工作。如果A先执行,获得两个设备,复制数据,最后释放两个设备,B做同样的事,一切都很好。

        但是,也有可能出现以下场景:

  • 首先,A获得刻录器的所有权(并在获得CD阅读器并复制文件后将其释放);
  • 然后B获得CD阅读器的所有权(并在获得刻录器并复制文件后释放它);
  • A现在试图获得CD阅读器的所有权,但被告知要等待B释放它;
  • B现在试图获得CD刻录器的所有权,但被告知要等待A释放它。

A等B的同时B等A,此时就产生了死锁,两个进程都被阻塞!

3.1 Resources资源

Definition: A resource is an object that can be granted to a process.

定义:资源是可以被授权给进程的对象。

3.1.1 Preemptable and Nonpreventable Resources可抢占资源和不可抢占资源

资源可以被分成两种:

  1. 可被抢占的资源:这意味着资源可以从它当前的所有者手中拿走(稍后归还)。一个例子是处理器;另一个是内存。
  2. 不可被抢占的资源:这意味着资源不能被抢走。例如cd刻录机。

 

值得我们关注的死锁问题就发生在不可被抢占的资源中,所以我们将在这里研究这个问题。

资源的生命周期序列是这样的:

A.  Request请求;

B. Allocate分配;

C. Use使用;

D.  Release释放;

进程请求资源、使用资源最后释放资源。分配决策是由系统OS做出的,我们将学习用于做出这些决策的方式。

 

3.1.2 Resource Acquisition资源请求

一个简单的例子:现在我们拥有两个资源A和B,两个进程C和D;C和D的运行都同时需要A和B两个资源,此时我们为A和B各自添加一个信号量(互斥锁)称为S和T,如果两个进程都执行:P(S)P(T)…V(T)V(S)是没问题的,但是如果两个进程分别是:

P(S)P(T)…V(T)V(S)和P(T)P(S)…V(S)V(T)时,就产生了死锁。

        回想上一章的信号量/临界区处理,如果进程终止或永远停留在临界段内,很容易引起麻烦,我们假设进程不会这样做。类似地,我们假设没有进程会永远保留资源,与此对应的是一个进程可以无限次地获取资源(也就是说,它可以有一个内部有资源请求的循环),但每次它获得资源并完成对应的工作后,必须尝试释放获得的资源。

 

Introduction to Deadlocks死锁的简介

定义:当一组进程中的每个成员都在等待只能由该进程中的一个成员引起的事件时,就会发生死锁,通常等待的事件是资源的释放。

 

(Necessary) Conditions for Deadlock死锁的必要条件

以下四个条件对于死锁来说是必要的,但不是充分的。重复一遍:它们是不够的:

  1. A.     Mutual exclusion互斥:一项资源的一个时刻只能被分配至一个进程;
  2. B.     Hold and Wait持有并等待:持有一个资源的进程被允许请求另一个资源;
  3. C.     No preemption无抢占:进程必须释放获得的资源,不可抢占资源不可被其余进程拿走;
  4. D.     Circular wait循环等待:必须有一个进程链,这样链中每个成员都在等待链中的下一个成员所拥有的资源。

可以说,如果你想要一个死锁,你必须具备这四个条件。当然,你并不想要死锁,所以你可能会说:如果你想要防止死锁,你只需要破坏这四个条件中的一个或多个。

注:前三个条件是系统和资源的静态特性。也就是说,对于一个拥有固定资源集的给定系统,前三个条件要么总是真,要么总是假:它们不随时间而改变。当资源被请求/分配/释放时,最后一个条件的真假确实会随着时间而改变。

 

Question: Why must the chain mentioned in condition 4 above contain a cycle?

Answer: Since each process in the chain refers to another process, either there are infinitely many processes (which we assume is impossible) or a the chain contains a cycle.

很好理解的道理,各个进程间如果存在资源相互依赖的话,可以抽象为由一个进程指向另一个进程,如果不构成一个闭环或循环,那么这个相互依赖的关系肯定会被在有限的时间内被解开,因此无法构成死锁。除非链子无限长,但是这种情况我感觉也不能称为死锁……

 

3.1.3 Deadlock Modeling死锁模型

 

上图是资源分配图的几个例子,也称为可重用资源图,进程用圆形表示,资源用方形表示,从进程P到资源R的一条有向箭头表示进程P请求获取资源R,但是还没有被分配;从资源R到进程P的一条有向箭头表示资源R被分配给进程P但是还没有被释放,此时我们称进程P持有资源R。

Homework 15

以下这些可重用资源图都是合法的吗?

 

        考虑两个并发进程P1和P2,在画出各种可能执行过程的资源分配图,指出何时发生死锁,何时死锁不再可以避免。

P1                     P2

Request R1              Request R2

Request R2              Request R1

Release R2              Release R1

Release R1              Release R2

 

四种处理死锁的方式:

  1. 忽略这个问题;
  2. 检测出死锁并从中恢复;
  3. 通过破坏死锁形成的四个必要条件来防止死锁的产生;
  4. 在资源分配时仔细决定如何分配来防止死锁;

 

posted on 2022-01-06 15:16  ThomasZhong  阅读(90)  评论(0编辑  收藏  举报

导航