文章

397

粉丝

40

获赞

2

访问

90.3k

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

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%n]);
     p(chopsticks[(i+1)%n]);

   }
  if(i%2 == 0){
     p(chopsticks[(i+1%n]);
     p(chopsticks[i%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)取筷子操作(满分2分)

得分:1分

理由:学生采用奇偶编号差异化的取筷顺序(奇数先左后右,偶数先右后左),这是一种常见的死锁避免策略,思路正确。但代码存在两处逻辑错误:①第二个if应为else if,否则可能重复执行;②(i+1%n)应改为(i+1)%n(缺少括号)。由于策略正确但实现有瑕疵,扣1分。

(4)放回操作(满分2分)

得分:2分

理由:学生正确释放了两根筷子和碗资源(V操作顺序合理),与标准答案一致,无逻辑错误。

题目总分:2+2+1+2=7分

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发