操作系统之哲学原理第2版 邹恒宇课后习题第三章答案(二)

目录

9.四方恋爱问题:假如我们有两男:尤尔、夏士和两女:左怡、尚珊。左怡和尚珊都喜欢玫瑰,谁送他们玫瑰,她们就跟谁谈恋爱。尤尔和夏士都则喜欢名表,谁送他们名表,他们就跟谁谈恋爱。如果两位男士给同一位女士送玫瑰,或者一位女士同时给两位男士送名表,则两位男士将大打出手(死锁)。如果两位女士给同一位男士送名表,或者一位男士同时送给两位女士玫瑰,则两位女士将大打出手(死锁)。请你帮助他们建立一对一的恋情关系,并在建立过程中防止大打出手(死锁)。

10.饥饿和死锁是多道编程要防止的两个问题。但这真的是两个问题吗?

11.本章讨论的哲学家就餐问题有多个解决方案,请给出一个不同于书中解答的方案。

请问多道编程是什么意思?


9.四方恋爱问题:假如我们有两男:尤尔、夏士和两女:左怡、尚珊。左怡和尚珊都喜欢玫瑰,谁送他们玫瑰,她们就跟谁谈恋爱。尤尔和夏士都则喜欢名表,谁送他们名表,他们就跟谁谈恋爱。如果两位男士给同一位女士送玫瑰,或者一位女士同时给两位男士送名表,则两位男士将大打出手(死锁)。如果两位女士给同一位男士送名表,或者一位男士同时送给两位女士玫瑰,则两位女士将大打出手(死锁)。请你帮助他们建立一对一的恋情关系,并在建立过程中防止大打出手(死锁)。

在这个情景中,我们可以使用资源分配的算法来避免死锁,确保建立一对一的恋情关系。下面是一种可能的解决方案:

  1. 引入一个中介者,可以是一个第三方或者一个共享的实体,来处理资源分配和冲突解决。

  2. 每个人都有一个标识符,例如尤尔为Y,夏士为X,左怡为L,尚珊为S。

  3. 中介者维护四个状态变量,分别表示玫瑰的拥有者和名表的拥有者,初始时都为无拥有者。

  4. 当一个人想要送花或者送表时,先向中介者发送请求。

  5. 中介者收到请求后,根据当前状态进行判断:

    • 如果玫瑰的拥有者为空,则中介者将该人设为玫瑰的拥有者,并回复请求成功。
    • 如果名表的拥有者为空,则中介者将该人设为名表的拥有者,并回复请求成功。
    • 如果玫瑰的拥有者和名表的拥有者都不为空,或者该人正好是当前拥有者,则回复请求失败。
  6. 如果请求成功,该人可以向对应的女士送花或者送表,建立恋情关系。

通过中介者的资源分配机制,可以避免出现多人同时争夺同一资源的情况,从而避免死锁的发生。当资源被占用时,其他人只能等待或者尝试获得其他资源。这种方法能够确保每个人最终都能建立一对一的恋情关系,而不会陷入死锁的情况。

这种解决方案可以看作是死锁避免策略中的资源分配策略。通过合理的资源分配和冲突解决机制,可以避免资源竞争导致的死锁情况的发生。

10.饥饿和死锁是多道编程要防止的两个问题。但这真的是两个问题吗?

饥饿(Starvation)和死锁(Deadlock)确实是多道编程中要防止的两个问题,但它们在本质上是不同的概念。

饥饿指的是一个或多个进程(或线程)由于资源分配不公平或调度策略不当而无法获得所需的资源,从而导致长时间等待或无法继续执行的情况。简单来说,某些进程会被其他进程无限期地推迟,无法完成其工作。

死锁是指在多进程系统中,每个进程都在等待一个只能由其他进程释放的资源,导致所有进程都无法继续执行的情况。死锁通常涉及多个进程之间的循环等待,每个进程都在等待其他进程所持有的资源。

虽然饥饿和死锁都是与资源分配和调度有关的问题,但它们的本质和表现形式是不同的。

饥饿问题是指某个进程因为某种原因(如优先级低、资源分配不公平等)无法获得所需资源而无法继续执行,但其他进程仍然可以正常执行。它是一种不公平性的问题,其中某些进程无法满足其资源需求,导致它们长时间等待。

死锁问题则是多个进程之间相互等待彼此所持有的资源,从而导致所有进程都无法继续执行。死锁是一种互相依赖的问题,其中多个进程相互阻塞,无法继续向前推进。

虽然饥饿和死锁是不同的问题,但它们都需要在多道编程中加以注意和防止。系统设计者和开发者需要采取适当的资源分配和调度策略,以避免饥饿和死锁的发生,保证系统的正常运行和公平性。

11.本章讨论的哲学家就餐问题有多个解决方案,请给出一个不同于书中解答的方案。

在哲学家就餐问题中,通常的解决方案是通过引入限制条件或算法来防止死锁的发生。一个常见的解决方案是引入资源分级的概念,例如使用信号量或互斥锁来控制哲学家对餐具的访问。

除了书中提到的解答之外,以下是一个不同于传统解答的方案,称为"资源共享"方案:

  1. 每个哲学家需要的资源包括左右两个餐叉。
  2. 引入一个资源管理者(RM)来控制餐叉的分配。
  3. RM 维护一个餐叉池,其中包含 n 个可用的餐叉。
  4. 每个哲学家在就餐之前,必须向 RM 申请获取两个餐叉。
  5. RM 根据当前可用的餐叉数量和哲学家的请求情况来判断是否分配餐叉。
  6. 如果当前有足够的餐叉可供分配,则 RM 分配给该哲学家,并更新餐叉池的状态。
  7. 如果当前没有足够的餐叉可供分配,则该哲学家需要等待,直到有餐叉可用为止。
  8. 哲学家在使用完餐叉后,归还给 RM,并更新餐叉池的状态。

这种方案中,通过引入资源管理者 RM 来协调餐叉的分配,避免了传统方案中的死锁问题。RM 负责分配餐叉,并根据当前可用的资源数量进行判断,以避免哲学家之间产生争用或竞争导致的死锁。

这种资源共享方案能够更好地控制资源的分配和使用,确保每个哲学家都能够获得所需的资源,从而避免死锁的发生。它提供了一种可行的解决方案,以平衡资源的利用和避免死锁的风险。

12.本章给出的哲学家就餐问题解决方案是否为最优方案?请说明理由。

13.有同学提出,本章给出的哲学家就餐问题解决方案可能导致饥饿,即某个或某些哲学家永远得不到足够的筷子来就餐。你同意该同学的看法吗?如果你同意,那么本解决方案是否不公平?如果你不同意,请说明你的理由

如果公平性是一个非常重要的考虑因素,可以探索其他解决方案,例如引入优先级机制或使用其他资源分配算法来确保每个哲学家都能够获得公平的资源访问机会。这样可以减少饥饿的可能性,但也可能增加死锁的风险。因此,在设计解决方案时需要综合考虑系统的需求和特点,以平衡安全性和公平性的要求。

请问多道编程是什么意思?

多道编程(Multithreading Programming)是一种并发编程的概念,它指的是在一个程序中同时运行多个独立的执行线程(或进程)。每个线程都是程序中的一个独立执行序列,具有自己的指令流、程序计数器、栈和局部变量等。

多道编程的目的是利用计算机系统的并行性,提高系统的资源利用率和响应能力。通过将一个程序分成多个独立的线程,并让它们并行地执行,可以同时处理多个任务,提高程序的执行效率。

多道编程可以用于各种应用场景,例如图形界面程序中的用户界面线程和后台数据处理线程、服务器中的并发请求处理、多媒体应用中的音视频处理等。通过合理地设计和管理多个线程,可以实现更高效、更灵活的程序执行。

然而,多道编程也带来了一些挑战,如线程同步、资源竞争和死锁等问题。在编写多线程程序时,需要特别注意线程之间的相互影响和竞争条件,以确保程序的正确性和可靠性。

总结来说,多道编程是指在一个程序中同时运行多个独立的线程,通过并发执行来提高程序的效率和响应能力。它是并发编程的一种重要手段,广泛应用于现代计算机系统和软件开发中。

多道编程其实就是进程和线程出现的意义,让不同的程序能够独立地同时运行

其实个人感觉多道编程还挺重要的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值