文章

145

粉丝

0

获赞

0

访问

8.2k

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


评分及理由

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

学生作答整体思路是使用一个互斥锁(lock)来保护对共享资源(碗和筷子)的检查和修改,并尝试在满足条件时获取资源。然而,该方案存在多处逻辑错误和安全隐患:

  1. 信号量使用不当:题目要求使用信号量的P、V操作描述互斥与同步,但学生将碗(Wan)和筷子(k[])定义为整型变量,通过lock保护进行判断和修改。这本质上是用一个二元信号量(lock)模拟了一个大的临界区,而不是为碗和筷子分别设置信号量来实现资源的同步分配。这不符合题目要求使用信号量进行同步的意图。
  2. 死锁风险:方案中,哲学家在持有lock锁的情况下,循环检查条件(while (Wan > 1 && k[i - 1] == 1 && k[i % n] == 1))。如果条件不满足,它会释放锁(v(lock))然后重新循环。这虽然不会导致死锁,但会导致忙等待(busy-waiting),效率低下,且未体现信号量让进程阻塞等待的核心机制。
  3. 逻辑与数组索引错误
    • 条件 Wan > 1 意味着只有当碗的数量大于1时哲学家才能尝试进餐。这与题目中“有m(m≥1)个碗”的条件不符,且当m=1时,任何哲学家都无法进餐,不合理。
    • 筷子数组 k[i] 的初始化和使用混乱。第一次识别中初始化为0,第二次识别中初始化为1。根据常理,可用资源信号量初值应为正数。在检查条件时使用 k[i-1] == 1k[i%n] == 1,意味着筷子可用时值为1。但在获取资源时,对 k[i-1]k[i%n] 进行减减操作。这里存在严重的数组索引问题:对于哲学家i,其左手筷子应为 i(或 i-1 需处理边界),右手筷子应为 (i+1)%n。学生的代码中 k[i-1]k[i%n] 不能正确表示左右筷子,且当i=0时,i-1 会导致数组下标越界。
    • 获取资源部分的代码逻辑放置不当。在满足条件的while循环内,它获取资源后执行 v(lock); break; 跳出循环。但跳出循环后,代码流程会执行到while循环外的 v(lock);(第一次识别版本)或直接到“吃饭”部分(第二次识别版本)。第一次识别版本在获取资源后多执行了一次 v(lock),第二次识别版本逻辑稍好,但整体结构依然混乱。
  4. 未能防止死锁:标准答案通过限制同时进餐的哲学家数量(碗的数量或n-1)来预防死锁。学生的方案虽然...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发