文章

225

粉丝

40

获赞

2

访问

11.9k

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

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]);
   }else{
     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)哲学家进程中的资源请求顺序(满分4分)

得分:3分

理由:学生使用了奇偶编号区分筷子请求顺序(奇数先右后左,偶数先左后右),这是一种避免死锁的有效方法(与标准答案的对称性破坏思路一致,但实现方式不同)。但存在一个细节问题:在请求筷子时,奇数哲学家的代码中p(chopsticks[(i+1)%n])(先取右)和p(chopsticks[i%n])(后取左)是正确的,但偶数哲学家的代码中p(chopsticks[i%n])(先取左)和p(chopsticks[(i+1)%n])(后取右)也是正确的(注意i%n等价于i,因为i范围是0到n-1)。然而,学生代码中奇数哲学家的右筷子索引应为(i+1)%n(正确),但左筷子索引应为i(而不是i%n,虽然结果相同但冗余)。此处虽无功能性错误,但索引写法不够简洁(i%n在i

(3)资源释放部分(满分2分)

得分:2分

理由:学生正确释放了左右筷子(顺序无关紧要)和bowls信号量,与标准答案一致,无错误。...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发