文章

397

粉丝

40

获赞

2

访问

88.6k

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

semaphore bowls = min(m,n-1);    // 所有碗资源的信号量
semaphore chopsticks[n];   // 所有筷子资源的信号量
for(int i = 1;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。但注意代码中数组索引从1开始(for循环i从1到n),而标准答案通常从0开始,但逻辑上正确(因为取模运算会处理索引),故不扣分。

(2)哲学家进程中的资源请求顺序(满分4分)

得分:3分

理由:学生采用了奇偶编号区分筷子请求顺序(奇数先右后左,偶数先左后右),这是一种常见的死锁避免策略(与标准答案不同但正确),因此思路正确不扣分。但存在以下逻辑错误:
- 在P操作取筷子时,使用了`(i+1)%n`和`i%n`,但注意i的取值:若哲学家编号从1开始,则i%n可能为0(当i=n时),而0索引是有效的,但通常哲学家编号从0到n-1更常见。这里索引处理存在潜在问题(例如当i=n时,i%n=0,而chopsticks索引从1到n,因此索引0未初始化),这会导致错误。扣1分。
- 另外,代码中使用了两个if分支,但未用else连接,若第一个if条件满足(i为奇数),执行后还会检查第二个if条件(i为偶数),但由于i不可能同时...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发