文章

313

粉丝

0

获赞

0

访问

59.9k

头像
2019年(408)计算机学科专业基础综合试题 - 第43题回答
操作系统
发布于2025年12月1日 17:39
阅读数 187


评分及理由

(1)得分及理由(满分8分)

学生作答整体思路是解决哲学家就餐问题,并引入了碗资源的限制。其方案为:

  1. 为每根筷子设置一个信号量chopstick[1..n],初值为1。
  2. 为每个筷子资源额外设置一个互斥信号量mutex[1..n],初值为1,意图可能是防止对同一根筷子的并发争夺,但这一设计实际上冗余且可能导致死锁或降低并发度。
  3. 设置碗资源信号量bowl = m,并设置一个互斥信号量mutexb = 1来保护对碗的获取与释放。
  4. 采用奇偶哲学家拿筷子顺序不同的策略来预防死锁。
  5. 流程上,哲学家先按奇偶策略获取两根筷子,然后互斥地获取一个碗,进餐,再互斥地释放碗,最后释放两根筷子。

扣分点分析:

  • 主要逻辑错误(严重): 学生对碗资源的处理存在根本性错误。题目要求“每位哲学家必须取到一个碗和两侧的筷子后,才能就餐”,这意味着碗和筷子是并列的必要条件,获取顺序理论上可以任意(但需避免死锁)。标准答案通过将碗信号量bowls的初值设为min(n-1, m),并将其作为“进餐名额”首先获取,巧妙地限制了并发进餐的哲学家数量,从而预防了死锁。而学生的方案是先获取两根筷子,再获取碗。这种顺序下,即使碗资源不足(m < n-1),哲学家也可能先占用了筷子,导致其他哲学家因无法凑齐筷子而饿死,同时持筷的哲学家也可能因等不到碗而阻塞,形成循环等待的条件之一,未能有效防止死锁。此外,对碗的获取和释放使用互斥锁mutexb,使得碗资源信号量bowl本身失去了计数信号量的同步意义,变成了在互斥保护下的一个普通计数器,这不符合信号量用于资源计数的初衷,且会降低效率。
  • 冗余与错误设计: 为每根筷子设置单独的互斥信号量mutex[1..n]是不必要且错误的。对筷子资源chopstick[i]P/V操作本身就是原子的,足以实现互斥访问。额外包裹一层P(mutex[i])V(mutex[i]),不仅多余,还可能破坏信号量的语义(例如,在P(chopstick[i])之后立即V(mutex[i]),其他进程可以在该哲学家仍持有筷子时通过P(mutex[i]),但随后P(chopstick[i])会阻塞,这虽然不会导致数据错误,但增加了不必要的复杂性且无益于解决死锁)。
  • 细节错误: 代码中(n + 1) % n的写法在索引从1开始时可能导致错误(应为(i + 1) % n(i % n) + 1等,这里n是哲学家编号,此写法混淆了索引与总数),但根据上下文可判断是意图表示右边筷子,属于表述瑕...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发