文章

397

粉丝

40

获赞

2

访问

90.3k

头像
2019年计算机学科专业基础综合试题 - 第43题回答
操作系统
发布于2025年9月11日 21:53
阅读数 274

semaphore bowls = min(m,n-1);    // 所有碗资源的信号量
semaphore chopsticks[n];   // 所有筷子资源的信号量
for(int i = 0;i < n; i++){
 chopsticks[i] = 1; //对所有筷子的信号量置1
}

CoBegin{
process_i(){
  思考;
  p(bowls);//吃完前先取碗
  if(i%2 == 1){
     p(chopsticks[(i+1)%n]);
     p(chopsticks[i%n]);

   }
  if(i%2 == 0){
     p(chopsticks[i%n]);
     p(chopsticks[(i+1)%n]);
   }
     吃饭;
     v(chopsticks[(i+1)%n]);
     v(chopsticks[i%n]);
     v(bowls);
 }
}CoEnd

评分及理由

(1)信号量定义及初值(满分2分)

得分:2分。理由:学生正确定义了bowls信号量(初值为min(m, n-1))和chopsticks数组信号量(初值均为1),与标准答案一致,符合题目要求。

(2)取碗操作(满分2分)

得分:2分。理由:学生在取筷子前先执行P(bowls)操作,正确限制了同时进餐的哲学家数量(不超过min(m, n-1)),与标准答案思路一致,且能防止死锁。

(3)取放筷子操作(满分4分)

得分:3分。理由:学生通过奇偶编号区分筷子获取顺序(奇数先右后左,偶数先左后右),这是一种常见的死锁避免策略(类似于资源有序分配法),思路正确且能有效防止死锁。但代码中存在两处细节错误:1)在奇数分支中,取筷子顺序应为先左后右(标准答案顺序),但学生写成了先右后左(chopsticks[(i+1)%n]然后chopsticks[i%n]),这实际是反向顺序,但逻辑上仍能避免死锁(因为奇偶顺序不同,不会形成循环等待);2)在放筷子操作中,学生先放右边再放左边,但获取顺序在奇偶情况下不同,释放顺序应与获取顺序相反以确保一致性,但这里释放顺序固定(先右后左),虽然不影响正确性,但不够严谨。扣1分(主要因获取顺序与常规理解不一致,...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发