文章

397

粉丝

40

获赞

2

访问

88.5k

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

semaphore bowls = m;    // 所有碗资源的信号量
semaphore chopsticks[n];   // 所有筷子资源的信号量
for(int i = 1;i <= n; i++){
 chopsticks[1] = 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分)

得分:1分

理由:学生定义了bowls信号量并初始化为m(正确),但chopsticks数组初始化有逻辑错误:代码中循环内始终设置chopsticks[1]=1(应为chopsticks[i]=1),导致除索引1外其他筷子信号量未正确初始化(实际未定义初值)。扣1分。

(2)资源获取顺序与死锁避免(满分4分)

得分:2分

理由:学生通过奇偶编号区分拿筷子顺序(奇数先右后左,偶数先左后右),该方法可避免死锁(正确)。但未考虑碗资源限制对并发进餐人数的约束——标准答案中bowls信号量初值应为min(m, n-1)以最大化并发并防死锁,而学生直接使用m(当m≥n时可能超过n-1人同时拿碗,导致死锁风险)。扣2分。

(3)资源释放与完整性(满分2分)

得分:2分

理由:学生正确释放了左右筷子(顺序无关)和碗资源,且流程完整(思考→取碗→取筷→进餐→放筷→放碗)。无扣分项。

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

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发