文章

397

粉丝

40

获赞

2

访问

90.3k

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

semaphore bowls = 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]);
   }
  if(i%2 == 0){
     p(chopsticks[i%n]);
     p(chopsticks[(i+1)%n]);
   }
     吃饭;
     v(chopsticks[i%n]);
     v(chopsticks[(i+1)%n]);
     v(bowls);
 }
}CoEnd

 


评分及理由

(1)信号量定义及初值设置(满分2分)

得分:1分

理由:学生定义了bowls和chopsticks信号量,chopsticks数组初值设置正确(均为1)。但bowls的初值设置为n-1,而题目中碗的数量是m(m≥1),标准答案应取min(m, n-1)。学生未考虑m可能小于n-1的情况(例如m=1时,bowls初值应为1而非n-1),因此扣1分。

(2)互斥与同步操作逻辑(满分5分)

得分:4分

理由:学生使用P(bowls)限制同时就餐人数,并通过奇偶数区分拿筷子顺序(奇数先右后左,偶数先左后右)来避免死锁,此思路正确且能防止死锁。但存在两个问题:第一,bowls的初值错误(见第1点)导致同步控制不严格;第二,在拿筷子时使用了两个if语句,但实际执行中哲学家会依次判断两个条件,但由于i是固定的,只会进入一个分支,逻辑正确但代码冗余(可改为if-else结构更清晰),此处不扣分。主要扣分点在于bowls初值未考虑m,扣1分。

(3)代码完整性及语法(满分1分)

得分:1分

理由:代码结构完整,包含信号量初始化、进程框架和P/V操作,语法基本正确(尽管使用中文分号“;”不符合一般伪代码规范,但题目允许使用中文描述,故不扣分...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发