文章

50

粉丝

0

获赞

0

访问

2.4k

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

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)信号量定义及含义(满分2分)

得分:1分。理由:学生定义了互斥信号量me(相当于mutex)和同步信号量empty(用于记录空白单元),这符合要求。但是缺少专门用于P1与P2(奇数)和P1与P3(偶数)之间同步的信号量(如odd和even),只使用了j和o变量来记录个数,但变量无法实现进程同步(例如当j=0时P2无法阻塞等待)。因此扣1分。

(2)同步与互斥实现(满分4分)

得分:1分。理由:学生使用了P(empty)和P(me)/V(me)来实现缓冲区的互斥访问和空单元同步,这部分正确。但P2和P3中使用if判断j>0和o>0而不是信号量等待,这会导致忙等待(不符合信号量同步机制),且无法保证P2/P3在无奇数/偶数时阻塞。另外,P1中V(empty)的位置错误(应该在消费者中释放,但学生写在了P1的P(empty)之后,实际上P1中缺少V(empty)的释放,而P2/P3中正确释放了V(empt...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发