文章

63

粉丝

0

获赞

0

访问

13.1k

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

int amount_bowl = m, amount_chop = n-1;
// 实现对碗这一互斥资源的互斥访问
semaphore bowl = min(amount_bowl, amount_chop);
semaphore chopsticks[n]; // 实现对筷子这一互斥资源的互斥访问
for (int i = 0; i <= amount_chop; i ++) {
   chopsticks[i] = 1; // 每两个哲学家之间的筷子数量是一只
}

CoBegin{
   while(TRUE) {
     进行思考;
     P(bowl); // (互斥)拿起一个碗
     P(chopsticks[(i+1) MOD n]); // (互斥)拿起右侧筷子
     P(chopsticks[i]; //(互斥拿起左侧的筷子)
     开始就餐;
     V(chopsticks[(i+1) MOD n]); // (互斥)放下右侧筷子
     V(chopsticks[i]); // (互斥)放下左侧的筷子
     V(bowl); // (互斥)放下一个碗
  }
}CoEnd

 


评分及理由

(1)信号量定义与初始化部分(满分3分)

得分:2分

理由:

  • 正确定义了碗的信号量bowl,并使用了min(m, n-1)作为初值(+2分)
  • 正确定义了筷子信号量数组chopsticks[n](+1分)
  • 但筷子信号量初始化循环条件有误:for (int i = 0; i <= amount_chop; i++),应该为i < n(-1分)
  • amount_bowl和amount_chop变量的定义多余,但不影响逻辑

(2)哲学家进程实现部分(满分5分)

得分:3分

理由:

  • 正确使用了P(bowl)和V(bowl)来限制同时就餐人数(+1分)
  • 正确使用了筷子的P、V操作(+1分)
  • 基本流程正确:思考→取碗→取筷子→就餐→放筷子→放碗(+1分)
  • 但存在严重逻辑错误:取筷子的顺序是先右后左,这可能导致死锁(-2分)
  • 缺少进程标识符i的定义,但考虑到是伪代码可以理解

题目总分:2+3=5分

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发