文章
281
粉丝
40
获赞
2
访问
24.2k
(1)对C1的代码是临界区,因为不同进程对缓冲区B访问需要互斥,同一时刻只有一个进程可以进入缓冲区B
(2)
cobegin{
semaphore mutex = 1;//互斥访问缓冲区B
semaphore buffer_B = 0;//B中可用数据
p_1(){
wait(mutex);
执行C1,往缓冲区中放入数据;
sighal(buffer_B);
signal(mutex);
}
p_2(){
wait(buffer_B);
wait(mutex);
执行C2,从B从读取一个数据;
signal(mutex);
}
}coend;
(3)
cobegin{
semaphore mutex = 1;//对缓冲区B上锁
p_1(){
wait(mutex);
执行C3,修改数据;
signal(mutex);
}
p_2(){
wait(mutex);
执行C3,修改数据;
signal(mutex);
}
}coend;
评分及理由
(1)得分及理由(满分2分)
学生回答正确,指出C1代码是临界区,并正确解释了原因(不同进程对缓冲区B的访问需要互斥)。答案与标准答案一致。得2分。
(2)得分及理由(满分3分)
学生定义了正确的信号量(mutex和buffer_B),并给出了初值(mutex=1,buffer_B=0)。代码逻辑基本正确,但存在一个错误:在P1进程中,signal(buffer_B)应在signal(mutex)之前执行,否则可能造成P2进程在获取buffer_B后无法立即获取mutex而阻塞,但这里错误不影响同步的正确性(因为P2中wait(buffer_B)在wait(mutex)之前,避免了死锁)。此外,学生使用了合理的同步结构(cobegin/coend)。扣1分,因为signal顺序不完美,但整体思路正确。得2分。
(3)得分及理由(满分3分)
学生正确使用了一个信号量mutex(初值为1)来实现互斥,代码逻辑正确(wait和signal操作包围C3执行)。答案与标准答案一致。得3分。
...
登录后发布评论
暂无评论,来抢沙发