《现代操作系统(中文第三版)》课后习题——第六章 死锁

第六章 死锁

1.给出一个由策略产生的死锁的例子。

答:在美国,考虑总统选举,三个或更多的候选人正在争取某个政党的提名。初选结束后,当代表们到达党的选举大会时,可能没有候选人获得多数票,也没有任何代表愿意改变自己的投票。这是一个死锁。每个候选人都有一些资源(选票),但需要更多的选票才能胜出。在议会中有多个政党的国家,每个政党都支持不同版本的年度预算,但无法通过召集多数党来通过预算。这也是一个死锁。

2.学生们在机房的个人计算机上将自己要打印的文件发送给服务器,服务器会将这些文件暂存在它的硬盘上。如果服务器磁盘空间有限,那么,在什么情况下会产生死锁?这样的死锁应该怎样避免?

答:磁盘缓冲区是有限的资源。每一个新到达的任务都需要请求更多的资源。如果具备10MB的缓冲空间,如何10个2MB的任务的一半到来,磁盘缓冲区将会填满,没有更多的空间可以存储,就会发生一个死锁。死锁可以通过让一个任务在缓冲区填满之前就开始打印,并且在打印完成后释放空间。这样一来,任务实际上会打印完成,然后下一个可以做同样的事情。如果在缓冲区被填满前,任务还不能开始打印,死锁是可能的。

3.在图6-1中,资源释放的顺序与获得的顺序相反,以其他的顺序释放资源能否得到同样的结果?

答:对。它没有任何区别。

4.一个资源死锁的发生有四个必要条件(互斥使用资源、占有和等待资源、不可抢占资源和环路等待资源)。举一个例子说明这些条件对于一个资源死锁的发生不是充分的。何时这些条件对一个资源死锁的发生是充分条件?

答:假设有三个进程A,B和C和两种资源类型R和S。并假设有一个R的实例和两个S的实例。考虑下面的场景:A请求R并得到它;B请求S并得到它;C请求S并得到它(有两个S实例);B请求R但被阻塞;A请求S被阻塞。在这个阶段四条件都成立。但是,没有发生死锁。当C完成时,S的一个实例被释放到分配给A。现在A可以完成执行然后释放R,并分配给B,然后B可以完成其执行。如果有每种类型的资源只有一个实例,这4个条件就是充分的。

5.图6-3给出了资源分配图的概念,试问是否存在不合理的资源分配图,即资源分配图在结构上违反了使用资源的模型?如果存在,请给出一个例子。

答:是的,不合理的资源分配图存在。我们指出资源只能由一个进程获取。从方框代表的资源到圆代表的进程的弧表示进程拥有该资源。因此,一个方框如果指向两个或两个以上的圆意味着所有这些进程都持有该资源,这违反了规则。因此,在一个图中多个弧从一个方框指向不同的圆违反了规则,除非有多个资源的副本。从方框到方框或从圆到圆的弧线也违反规则。

6.假设一个系统中存在一个资源死锁。举一个例子说明死锁的进程集合中可能包括了不在相应的资源分配图中循环链中的进程。

答:考虑三个过程A,B和C和两个资源R和S。假设A等待B持有的S,B等待A持有的S,和C是等待A持有的R。所有这三个进程,A,B和C发生死锁。然而,只有A和B属于循环链。

7.鸵鸟算法中提到了填充进程表表项或者其他系统表的可能。能否给出一种能够使系统管理员从这种状况下恢复系统的方法?

答:这些资源的一部分只能由管理员拥有的进程保留使用,所以管理员总是可以运行一个shell和程序来评估死锁并决定哪些进程要被杀死以便系统再次可用。

8.解释系统是如何从前面问题的死锁中恢复的,使用a)抢占,b)回滚,c)终止进程。

答:通过抢占恢复的过程:P2和P3完成后,进程P1可以强制抢占1个RS3 资源。这将使A =(0 2 1 3 2),并让进程P4完成。一旦P4完成并释放其资源P1可能完成。

通过回滚恢复的过程:P1回滚到请求RS3之前的状态。

通过杀死进程恢复的过程:杀死P1。

9.假设在图6-6中,对某个i有Cij+Rij>Ej, 这意味着什么?

答:这个过程需要比系统更多的资源。它没有可能可以得到这些资源,所以它永远无法完成,即使没有其他进程需要任何资源。

10.请说明图6-8中的模型与6.5.2节描述的安全状态和不安全状态有什么主要的差异。差异带来的后果是什么?

答:图6-8所示的模型需要知道进程何时释放其资源。另一方面,决定一个状态是否安全或不安全并不需要这方面的知识。这样做的后果是,图6-8的模型可以用来识别如果一个状态进入由I1,I2,I5和I6边围成的框中,保证系统最终会死锁,不安全状态意味着不能保证不会发生死锁。

11.图6-8所示的资源轨迹模式是否可用来说明三个进程和三个资源的死锁问题? 如果可以,它是怎样说明的?如果不可以,请解释为什么。

答:可以。在三个维度中考虑。z轴代测量第三进程请求的资源数。

12.理论上,资源轨迹图可以用于避免死锁。通过合理的调度,操作系统可避免进人不安全区域。请列举一个在实际运用这种方法时会带来的问题。

答:该方法仅能在提前知道资源被请求的确切时刻时才能用于指导调度,但在实践中,这种情况很少。

13.一个系统是否可能处于既非死锁也不安全的状态?如果可以,举出例子,如果不可以,请证明所有状态只能处于死锁或安全两种状态之一。

答:有些状态家既不安全也不是死锁,但是会导致死锁。例如,假设有四个资源:磁带,绘图仪,扫描仪和CD-ROM,如下表所示,有三个进程存在竞争。可能存在以下情况:

       拥有      需要      可用

A: 2 0 0 0   1 0 2 0   01 2 1

B: 1 0 0 0   0 1 3 1

C: 0 1 2 1   1 0 1 0

       这种状态不会发生死锁,因为许多操作还可以发生,例如A仍然可以得到两台打印机。但是,如果每个进程请求其剩余的要求,就会产生死锁。

14.考虑一个使用银行家算法避免死锁的系统。某个时刻一个进程P请求资源R,但即使R当前可用这个请求也被拒绝了。如果系统分配R给P,是否意味着系统将会死锁?

答:否。如果系统通过该请求有可能发生死锁,使用银行家算法的系统就会拒绝该进程获得请求的可用资源,如果同意该进程的请求,系统当然也可能不会发生死锁。

15.银行家算法的一个主要限制就是需要知道所有进程的最大资源需求的信息。有没有可能设计一个不需要这些信息而避免死锁的算法?解释你的方法。

答:如果所有进程的最大资源需求的信息不知道,只能强制顺序执行进程,这不可能避免死锁。考虑要在CD-ROM上记录扫描文档的两个进程的示例。当进程B请求CD-ROM刻录机时,无法确定授予该请求是否会进入不安全状态,由于不知道A是否需要CD-ROM刻录机,而B稍后需要扫描仪。

16.仔细考察图6-11b,如果D再多请求1个单位,会导致安全状态还是不安全状态?如果换成C提出同样请求,情形会怎样?

答:D请求1个单位是不安全的,但换成C请求则是安全的。

17.某一系统有两个进程和三个相同的资源。每个进程最多需要两个资源。这种情况下有没有可能发生死锁?为什么?

答:该系统不可能发生死锁。假设每个进程都拥有一个资源。有一个资源是空闲的。任何一个进程可以要求它,并获得它,在这种情况下,它可以完成和释放这两种资源。因此,死锁是不会发生的。

18.再考虑上一个问题,但现在有p个进程,每个进程最多需要m个资源,并且有r个资源可用。什么样的条件可以保证死锁不会发生?

答:如果进程有m个资源,它可以完成并且不会发生死锁。因此,最糟糕的情况是每个进程都有m-1个资源,需要另外一个资源。如果剩下一个资源,一个进程可以完成和释放所有资源,让其余的进程完成。因此,避免死锁的条件为r≥p(m-1)+ 1。

19.假设图6-12中的进程 A请求最后一台磁带机,这一操作会引起起死锁吗?

答:不会,进程D还能完成,当它完成时,它返回足够的资源以允许进程E(或进程A)完成,等等。

20.一个计算机有6台磁带机,由n个进程竞争使用,每个进程可能需要两台磁带机,那么n是多少时系统才没有死锁的危险?

答:对于三个进程,每个进程可以有两个磁带机。对于四个进程,磁带机的分配将是(2,2,1,1),允许前两个进程完成。对于五个进程,分配将是(2,1,1,1,1),这仍然允许第一个进程完成。对于六个进程,每个持有一个磁带机,但需要另一个磁带机,发生了死锁。因此,对于n <6,系统无死锁。

21.银行家算法在一个有m个资源类型和n个进程的系统中运行。当m和n都很大时,为检査状态是否安全而进行的操作次数正比于ma和nb,a和b的值是多少?

答:将矩阵中的一行与可用资源的向量进行比较,可以进行m次操作,此步骤必须按顺序重复n次,以找到可以完成的进程并对其进行标记。因此,按照顺序标记一个进程需要进行mn步。对所有n个进程重复该算法意味着操作数为mn2。因此a = 1和b = 2。

22.一个系统有4个进程和5个可分配资源,当前分配和最大需求如下:

       若保持该状态是安全状态,x的最小值是多少?

答:需求矩阵如下:

0 1 0 0 2

0 2 1 0 0

1 0 3 0 0

0 0 1 1 1

       如果x为0,会立即死锁。如果x为1,则进程D可以运行完成。完成后,可用的资源为1 1 2 2 1,不幸的是,现在已经死锁了。如果x为2,进程D运行后,可用资源为1 1 3 2 1,进程C可以运行完成,并返回其资源,可用的资源为2 2 3 3 1,这将允许进程B运行和完成,然后进程A运行并完成。因此,避免死锁的x的最小值是2。

23.一个消除环路等待的方法是用规则说明一个进程在任意时刻只能得到一个资源。举例说明在很多情况下这个限制是不可接受的。

答:考虑一个需要将大型文件从磁带复制到打印机的过程。因为内存量是有限的,整个文件不能直接复制到这个内存,所以该进程必须循环遍历以下语句直到整个文件被打印出来:

获取磁带机

将文件的下一部分复制到内存中(限制内存大小)

释放磁带机

获取打印机

从内存打印文件

释放打印机

这将延长进程的执行时间。此外,由于打印机在每次打印步骤之后被释放,所以不能保证文件的所有部分都将被打印在连续的页面上。

24.两个进程A和B,每个进程都需要数据库中的3个记录1、 2、 3。如果A和B都以1、2、3的次序请求,将不会发生死锁。但是如果B以3、2、1的次序请求,那么死锁就有可能会发生。对于这3种资源,每个进程共有3!(即6)种次序请求,这些组合中有多大的可能可以保证不会发生死锁?

答:假设进程A以a,b,c的顺序请求记录。如果进程B首先请求a,其中一个进程将获得a,另一个将阻塞。这种情况总是不会死锁的,因为赢家现在可以完成而没有干扰。在其他四种组合中,有些可能导致死锁,有些可能不会导致死锁。六种情况如下:

a b c无死锁

a c b无死锁

b a c可能死锁

b c a可能死锁

c a b可能死锁

c b a可能死锁

       由于六种情况中的四种可能导致死锁,所以有1/3的机会避免死锁和2/3的机会导致死锁。

25.一个使用信箱的分布式系统有两条 IPC原语:send和receive。receive原语用于指定从哪个进程接收消息,并且如果指定的进程没有可用消息,即使有从其他进程发来的消息,该进程也等待。不存在共享资源,但是进程由于其他原因需要经常通信。死锁会产生吗?请讨论这一问题。

答:会。假设所有的邮箱最初都是空的。现在A发送消息到B并等待回复,B发送到C并等待回复,C发送到A并等待回复。通信死锁的所有条件现在已经满足了。

26.在一个电子资金转账系统中,有很多相同进程按如下方式工作:每一进程读取一行输人,该输入给出一定数目的款项、贷方账户、借方账户。然后该进程锁定两个账户,传送这笔钱,完成后释放锁。由于很多进程并行运行,所以存在这样的危险:锁定x会无法锁定y,因为y已被一个正在等待x的进程锁定。设计一个方案来避免死锁。在没有完成事务处理前不要释放该账户记录。(换句话说,在锁定一个账户时,如果发现另一个账户不能被锁定就立即释放这个已锁定的账户。)

答:为了避免循环等待,使用资源(帐户)的号码进行编号。读取输入行后,进程首先锁定较小编号的帐户,然后在成功锁定该账户后(可能需要等待)再去锁定另一个帐户。由于没有任何进程等待一个编号小于现有账户的账户,所以永远不会构成循环等待,因此永远不会发生死锁。

27.一种预防死锁的方法是去除占有和等待条件。在本书中,假设在请求一个新的资源以前,进程必须释放所有它已经占有的资源(假设这是可能的)。然而,这样做会引入这样的危险性:使竞争的进程得到了新的资源但却丢失了原有的资源。请给出这一方法的改进。

答:更改请求新资源的语义如下。如果一个进程请求一个新的资源并且该资源是可用的,它就获取该资源并保持它已经拥有的资源。如果新资源不可用,则该进程所有已经占有的资源都将被释放。在这种情况下,死锁是不会发生的,并且没有新的资源获得后原有的资源丢失的危险性。当然这个进程只能工作在资源能够释放的情况下(你可以在页之间释放扫描仪,CD之间释放CD刻录机)。

28.计算机系学生想到了下面这个消除死锁的方法。当某一进程请求一个资源时,规定一个时间限。如果进程由干得不到需要的资源而阻塞,定时器开始运行。当超过时间限时,进程会被释放掉,并且允许该进程重新运行。如果你是教授,你会给这样的学生多少分?为什么?

答:我会给它一个F(失败)的成绩。进程会做什么?很显然由于它需要资源,所以它再次询问并再次阻塞,这不如保持阻塞。事实上,可能会更糟糕的是,系统可能会跟踪竞争进程等待了多长时间,并将新释放的资源分配给等待时间最长的进程。通过定期释放和重新运行,一个进程丢失了它已经等待的时间的记录。

29.解释死锁、活锁和饥饿的区别。

答:当一组进程被阻塞等待只有该集合中的其他进程可以释放的事件时,会发生死锁。另一方面,活锁中的进程不会被阻塞。相反,它们会继续检查永远不会成立的执行条件是否成立。因此,除了持有的资源之外,活动中的进程继续消耗宝贵的CPU时间。最后,会发生进程的饥饿,由于存在其他进程以及新的进程流,最终会导致饿死高优先级的进程。不像死锁或活锁,饥饿可以自己终止,例如当具有较高优先级的现有进程终止并且没有更高优先级的新进程到来时。

30.Cinderella和Prince要离婚,为分割财产,他们商定了以下算法。 每天早晨每个人发函给对方律师要求财产中的一项。由于邮递信件需要一天的时间,他们商定如果发现在同一天两人请求了同一项财产,第二天他们会发信取消这一要求。他们的财产包括狗Woofer、Woofer的狗屋、金丝雀Tweeter和Tweeter的鸟笼。由于这些动物喜爱它们的房屋,所以又商定任何将动物和它们房屋分开的方案都无效,且整个分配从头开始。Cinderella和Prince都非常想要Woofer,于是他们分别去度假,并且每人都编写程序用一台个人计算机处理这一谈判工作。当他们度假回来时,发现计算机仍在谈判,为什么?产生死锁了吗?产生饥饿了吗?请讨论。

答:如果两个程序首先要求Woofer,那么电脑会无休止的饥饿:请求Woofer,取消请求,请求Woofer,取消请求等。如果其中一个请求狗窝,另一个请求狗,会发生死锁,双方会检测到该死锁,然后取消,但会在下一个循环中重复发生。无论哪种方式,如果两台计算机都被编程为首先去请求狗或狗屋,那么饥饿或死锁就会发生。两者之间没有太大的区别。在大多数死锁问题中,饥饿似乎并不严重,因为引入随机延迟通常会使它不太可能发生,但这种方法在这里不起作用。

31.一个主修人类学、辅修计算机科学的学生参加了一个研究课题,调查是否可以教会非洲狒拂理解死锁。他找到一处很深的峡谷,在上边固定了一根橫跨峡谷的绳索,这样狒拂就可以攀住绳索越过峡谷。同一时刻,只要朝着相同的方向就可以有几只狒狒通过。但如果向东和向西的狒拂同时攀在绳索上那么会产生死锁(拂拂会被卡在中间),因为它们无法在绳索上从另一只的背上翻过去。如果一只狒拂想越过峡谷,它必须看当前是否有别的狒拂正在逆向通行。利用信号量编写一个避免死锁的程序来解决该问题。不考虑连续东行的狒拂会使得西行的狒拂无限制地等待的情况。

答:略。

32.重复上一个习题,但此次要避免饥饿。当一只想向东去的狒狒来到绳索跟前,但发现有别的狒狒正在向西越过峡谷时,它会一直等到绳索可用为止。但在至少有一只狒拂向东越过峡谷之前,不允许再有拂狒开始从东向西越过峡谷。

答:略。

33.编写银行家算法的模拟程序。该程序应该能够循环检查每一个提出请求的银行客户,并且能判断这一请求是否安全。请把有关请求和相应决定的列表输出到一个文件中。

答:略。

34.写一个程序实现每种类型多个资源的死锁检测算法。你的程序应该从一个文件中读取下面的输入:进程数、资源类型数、每种存在类型的资源数(向量E)、 当前分配矩阵C (第一行,接着第二行,以此类推)、需求矩阵R(第一行,接着第二行,以此类推)。你的程序输出应表明在此系统屮是否有死锁。如果系统中有死锁,程序应该打印出所有死锁的进程id号。

答:略。

35.写一个程序使用资源分配图检测系统中是否存在死锁。你的程序应该从一个文件中读取下面的输入:进程数和资源数。对每个进程,你应该读取4个数:进程当前持有的资源数、它持有的资源的ID、它当前请求的资源数、它请求的资源ID。程序的输出应表明在此系统中是否有死锁。如果系统中有死锁,程序应该打印出所有死锁的进程id号。

答:略。

猜你喜欢

转载自blog.csdn.net/cztqwan/article/details/72796596