文章

50

粉丝

0

获赞

0

访问

2.4k

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

semaphore me=1;//用于实现缓冲区互斥使用

semaphore empty=N;//用于记录缓冲区空白单元
int j=0;//用于记录奇数个数

int o=0;//用于记录偶数个数

int n;//用于记录生成的数
P1{
 while(1){

  P(N)

  P(me)
   n=produce()

if(n%2==0){

o++;

}else{

j++;

}

   put()

V(me)

}
}
P2{

while(1){

 if(j>0){

P(me);
   getodd();

   countodd();

j--;

V(empty);

V(me);

}

}

}

P3{

while(1){

 if(o>0){

P(me);
  geteven();

   counteven();

o--;

V(empty);

V(me);

}

}

}


评分及理由

(1)得分及理由(满分7分)

学生答案存在多处逻辑错误:

  • 信号量定义不完整:缺少控制P1与P2(奇数)、P1与P3(偶数)同步的信号量(如odd和even),仅定义了互斥信号量me和空缓冲区信号量empty。这会导致消费者进程(P2和P3)无法正确等待生产者生产特定类型的数据,可能造成忙等待或无法触发的问题。
  • 同步逻辑错误:P2和P3中使用if语句检查j>0和o>0(即检查奇数和偶数计数)而不是等待信号量,这违反了同步原则(检查条件与等待操作不是原子性的),可能导致竞态条件(例如,在检查后条件可能被改变)和忙等待。
  • 缓冲区管理错误:在P1中,P(N)应该是P(empty)(等待空缓冲区单元),但学生写成了P(N),这是一个未定义的信号量,属于严重错误。
  • 计数变量j和o的修改位置错误:在P1中,j和o(奇数和偶数计数)在放入缓冲区之前就被修改,而不是在消费者取出后修改,这会导致计数与缓冲区实际内容不一致。...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发