现代操作系统 第六章 死锁 习题答案

  1. 在美国,考虑一次总统选举,其中三名或三名以上的候选人正试图提名某一政党。在所有的初选结束后,当代表们到达党代会时,很可能没有候选人拥有多数票,也没有代表愿意改变他或她的投票。这是僵局。每个候选人都有一些资源(投票),但要完成这项工作还需要更多的资源。在议会中有多个政党的国家,每一个政党都可能支持不同版本的年度预算,而且不可能聚集多数党通过预算。这也是僵局。

  2. 假脱机分区上的磁盘空间是有限的资源。事实上,每一个块都声称有一个资源,而每一个到达的新块都需要更多的资源。如果假脱机空间为10 MB,并且10个2 MB作业的前半部分到达,那么磁盘将满,无法再存储更多的块,因此我们会出现死锁。死锁可以通过允许作业在完全假脱机之前开始打印,并为该作业的其余部分保留这样释放的空间来避免。这样,一个作业将实际打印到完成,然后下一个作业可以做同样的事情。如果作业在完全假脱机之前无法开始打印,则可能出现死锁。

  3. 打印机是不可抢占的;在上一个作业完成之前,系统无法开始打印另一个作业。spool磁盘是可抢占的;如果协议允许,您可以删除一个不完整的文件,该文件太大,并让用户稍后发送。

  4. 是的。这没有任何区别。

  5. 假设有三个进程,A、B和C,两个资源类型,R和S。进一步假设有一个R实例和两个S实例。考虑以下执行场景:A请求R并获取它;B请求S并获取它;C请求S并获取它(有两个S实例);B请求R并被阻止;A请求S并获取它。并且被阻塞。在这个阶段,所有四个条件都成立。但是,没有死锁。当C完成时,S的一个实例被重新释放,分配给A。现在A可以完成它的执行,释放R,分配给B,然后A可以完成它的执行。如果每种类型都有一个资源,这四个条件就足够了。

  6. “非阻塞盒子”是一种预分配策略,它否定了保持和等待死锁的前提条件。因为我们假设汽车可以沿着交叉口进入街道空间,从而释放交叉口。另一种策略可能允许汽车暂时进入车库,释放出足够的空间来清除交通堵塞。一些城市制定了交通管制政策来塑造交通;随着城市街道变得更加拥挤,交通监管人员调整红灯设置,以限制进入严重拥挤地区的交通。交通量越小,对资源的竞争就越少,从而降低发生交通堵塞的可能性。

  7. 上述异常不是通信死锁,因为这些车辆彼此独立,如果没有发生竞争,将以最小的延迟通过交叉口。这不是资源死锁,因为没有一辆车拥有另一辆车请求的资源。资源预分配或资源抢占机制也不能帮助控制这种异常。这种异常是竞争同步的一种,然而,在这种情况下,汽车在循环链中等待资源,而交通节流可能是一种有效的控制策略。为了区别于资源死锁,这种异常情况可能被称为“调度死锁”。“类似的死锁可能发生在一条命令之后,该命令要求两辆列车合并到一条共享的铁路轨道上,等待另一辆列车继续运行。请注意,一名警察向其中一辆竞争的汽车或火车发出前进信号(而不是其他车辆),可以在不发生倒退或任何其他开销的情况下打破这种死锁状态。

  8. 一个进程可能持有一种资源类型的部分或全部单元,并请求另一种资源类型,而另一个进程持有第二种资源,同时请求第一种资源类型的可用单元。如果没有其他进程可以释放第一个资源类型的单元,并且资源不能被抢占或同时使用,则系统将死锁。例如,两个进程都是在实际内存系统中分配的内存单元。(我们假设不支持交换页面或进程,而支持动态内存请求。)第一个进程锁定另一个资源,可能是一个数据单元。第二个进程请求锁定的数据并被阻止。第一个进程需要更多的内存来执行代码以释放数据。假设系统中没有其他进程能够完成和释放内存单元,那么系统中就存在死锁。

  9. 是的,存在非法图形。我们指出,资源只能由一个流程持有。从资源正方形到进程圆的弧线表示进程拥有资源。因此,具有从其到两个或更多个进程的弧的正方形意味着所有这些进程保持资源,这违反了规则。因此,多个弧离开一个正方形并以不同的圆结束的任何图都违反规则,除非有多个资源副本。从正方形到正方形或从圆到圆的弧也违反了规则。

  10. 任何变化都不会导致僵局。在这两种情况下都没有循环等待。

  11. 考虑三个进程,a、b和c,以及两个资源r和s。假设a在等待b持有的i,b在等待a持有的s,c在等待a持有的r。所有三个进程,a、b和c都是死锁的。但是,只有A和B属于循环链。

  12. 这显然是一个通信死锁,可以通过超时控制,并在一段时间后(启发式)重新发送其启用消息(增加窗口大小的消息)。但是,可能B同时收到了原始消息和重复消息。如果窗口大小的更新是以绝对值而不是以差分形式给出的,则不会造成任何伤害。这些消息上的序列号也可以有效地检测重复项。

  13. 所有这些资源的一部分只能由管理员拥有的进程使用,因此管理员可以始终运行一个shell和程序来评估死锁,并决定要杀死哪个进程才能使系统再次可用。

  14. 首先,一组未标记的进程,p=(p1 p2 p3 p4)
    R1不小于或等于A
    R2小于A;标记p2;A=(0 2 0 3 1);p=(p1 p3 p4)
    R1不小于或等于A
    R3等于a;标记p3;A=(0 2 0 3 2);p=(p1 p4)
    R1不小于或等于R4不小于或等于A
    因此,过程p1和p4保持未标记状态。他们陷入僵局。

  15. 抢占恢复:在过程p2和p3完成后,可以强制过程p1抢占RS3的1单元。这将使a=(0 2 1 3 2),并允许过程p4完成。一旦P4完成并释放它的资源,P1就可以完成。通过回滚进行恢复:将p1回滚到获取rs3之前的状态检查点。通过终止过程恢复:终止p1。

  16. 这个过程要求的资源比系统所拥有的要多。它无法获得这些资源,因此它永远无法完成,即使没有其他进程需要任何资源。

  17. 如果系统有两个或多个CPU,两个或多个进程可以并行运行,从而导致斜轨迹。

  18. 是的。在三维空间中完成整个事情。Z轴测量第三个进程执行的指令数。

  19. 只有提前知道资源将要被占用的确切时刻,该方法才能用于指导调度。实际上,这种情况很少发生。

  20. 存在既不安全也不死锁的状态,但会导致死锁状态。例如,假设我们有四种资源:磁带、绘图仪、扫描仪和CD-ROM(如文本中所示),以及三种相互竞争的进程。我们可以有以下情况:
    在这里插入图片描述
    此状态没有死锁,因为仍可能发生许多操作,例如,A仍然可以获得两台打印机。但是,如果每个过程都要求它的剩余需求,那么我们就有一个死锁。

  21. D的请求是不安全的,但C的请求是安全的。

  22. 系统无死锁。假设每个进程都有一个资源。有一个资源是空闲的。任何一个进程都可以请求并获取它,在这种情况下,它可以完成并释放这两个资源。因此,死锁是不可能的。

  23. 如果一个进程有m个资源,它就可以完成,并且不会陷入死锁。因此,最坏的情况是,每个流程都有m-1资源,并且需要另一个资源。如果还有一个资源剩余,那么一个进程可以完成并释放其所有资源,让其余的资源也完成。因此,避免死锁的条件是r>= p(m -1)+1。

  24. 不,D仍然可以完成。完成后,它返回足够的资源以允许
    (或A)完成,等等。

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

  26. 需求矩阵如下:
    0 1 0 0 0 2
    0 2 1 1 0 0
    1 0 3 3 0 0
    0 0 1 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。

  27. 考虑一个需要将大文件从磁带复制到打印机的过程。由于内存量有限,并且整个文件无法容纳在此内存中,因此进程必须循环执行以下语句,直到打印完整个文件:
    获取磁带驱动器
    将文件的下一部分复制到内存中(内存大小有限)释放磁带机
    获取打印机
    从内存释放打印机打印文件
    这将延长进程的执行时间。此外,由于打印机在每个打印步骤后都会被释放,因此无法保证文件的所有部分都将打印在连续的页面上。

  28. 假设进程A按顺序A、B、C请求记录。如果进程B也请求第一个记录,则其中一个将获取该记录,另一个将阻塞。这种情况总是无死锁的,因为胜利者现在可以毫无干扰地完成任务。在其他四种组合中,有些可能导致死锁,有些则没有死锁。六种情况如下:
    A B C无死锁A C B无死锁
    B A C可能死锁B C A可能死锁C A B可能死锁C B A可能死锁
    因为六个中的四个可能导致死锁,所以有1/3的机会避免死锁,有2/3的机会获得死锁。

  29. 是的。假设所有邮箱都是空的。现在A发送到B并等待答复,B发送到C并等待答复,C发送到A并等待答复。通信死锁的所有条件现在都已满足。

  30. 为避免循环等待,请使用资源(帐户)的帐号对其进行编号。读取输入行后,进程首先锁定编号较低的帐户,然后在获取锁(可能需要等待)时锁定另一个帐户。由于没有一个进程会等待一个比它已经拥有的更低的帐户,所以不会出现循环等待,因此也不会出现死锁。

  31. 更改请求新资源的语义,如下所示。如果一个进程请求一个新的资源并且它是可用的,那么它将获取该资源并保留它已经拥有的资源。如果新资源不可用,则释放所有现有资源。在这种情况下,死锁是不可能的,并且不存在获取新资源但丢失现有资源的危险。当然,这个过程只有在释放一个资源是可能的(你可以在页面之间释放一个扫描仪,或者在CD之间释放一个CD刻录机)的情况下才能工作。

  32. 我会给它打F(不及格)分。这个过程有什么作用?因为它显然需要资源,所以它只需要再次请求并再次阻塞。这不比保持封锁好多少。实际上,情况可能更糟,因为系统可能会跟踪竞争进程等待的时间,并为等待时间最长的进程分配一个新释放的资源。通过周期性地超时并重试,一个过程将失去其资历。

  33. 虚拟内存和分时系统的开发主要是为了帮助系统用户。虚拟化硬件除了防止死锁之外,还可以保护用户不受预置需求、资源分配和覆盖的详细信息的影响。然而,上下文切换和中断处理的成本是相当大的。需要专门的寄存器、缓存和电路。这项费用可能不会仅仅为了防止死锁而发生。

  34. 当一组进程被阻塞,等待只有该组中的其他进程才能导致的事件时,就会发生死锁。另一方面,活锁中的进程不会被阻塞。相反,它们继续执行检查,以确保某个条件变为永远不会变为真的条件。因此,除了它们所拥有的资源外,活锁中的进程继续消耗宝贵的CPU时间。最后,由于存在其他进程以及一系列新的传入进程,最终导致进程的优先级更高,从而导致进程饥饿。与死锁或活锁不同,饥饿可以自行终止,例如,当具有更高优先级的现有进程终止,而没有具有更高优先级的新进程到达时。

  35. 这种停滞状态是竞争同步的一种异常,可以由资源预分配控制。但是,进程不会被资源阻塞。此外,资源已经以线性顺序被请求。这种异常不是资源死锁,而是一个活锁。资源预分配将防止这种异常。作为一种启发式方法,如果进程在某个时间间隔内没有完成,那么它们可能会超时并释放资源,然后随机进入睡眠状态,然后重试。

  36. 这是答案,虽然有点复杂。
    (a)这是一种竞争同步异常。它也是一个活锁。我们可以称之为调度活锁。这不是一个资源活锁或死锁,因为站点没有持有其他站点请求的资源,因此不存在一个循环的站点链,在请求其他站点的同时持有资源。这不是通信死锁,因为各站是独立执行的,将按顺序完成传输。
    (b)以太网和时隙ALOHA要求检测到传输冲突的站点必须在重新传输之前等待随机数量的时隙。选择时隙的间隔在每次连续冲突后翻倍,动态调整以适应繁重的交通负荷。在连续16次重新传输之后,帧被丢弃。
    (c)由于通道的访问是概率性的,并且由于新到达的站点可以在重新传输若干次之前竞争并分配通道,因此启用了饥饿。

  37. 异常不是资源死锁。虽然进程共享互斥体(即竞争机制),但是资源预分配和死锁避免方法对于这种僵持状态都是无效的。线性排序的资源也是无效的。事实上,有人可能认为线性顺序可能是问题所在;执行互斥应该是进入前的最后一步,离开关键部分后的第一步。循环僵持状态确实存在,其中两个进程都等待只能由另一个进程引起的事件。这是通信死锁。为了取得进展,如果超时抢占了消费者的互斥,它将能够打破这种死锁。编写谨慎的代码或使用监视器进行互斥是更好的解决方案。

  38. 如果两个程序都先请求Woofer,计算机将以无结束的顺序饥饿:请求Woofer、取消请求、请求Woofer、取消请求等。如果他们中的一个要狗屋,另一个要狗屋,我们就有一个死锁,双方都检测到,然后打破,但它只是在下一个循环中重复。不管怎样,如果两台电脑都被预先设定好要先追踪狗或狗舍,要么饥饿,要么死锁。这两者之间没有太大的区别。在大多数僵局问题中,饥饿似乎并不严重,因为引入随机延迟通常会使饥饿变得非常不可能。这种方法在这里不起作用。

猜你喜欢

转载自blog.csdn.net/dldldl1994/article/details/86531572