文章
327
粉丝
40
获赞
2
访问
39.8k
(1)实现C1的代码是临界区,因为不同进程同时对缓冲区B进行写操作时,需要互斥访问,否则可能会产生脏数据,造成数据冲突
(2)
CoBegin{
semaphore mutex = 1;互斥访问缓冲区的锁
semaphore empty = 0;//缓冲区内还能读多少数据
semaphore full = 1;//缓冲区内还能写多少数据
P1(){
wait(full);
wait(mutex);
执行C1;
signal(mutex);
signal(empty);
}
P2(){
wait(empty);
wait(mutex);
执行C2;
signal(mutex);
signal(full);
}
}CoEnd
(3)
CoBegin{
semaphore mutex = 1;互斥访问缓冲区的锁
P1(){
wait(mutex);
执行C3;
signal(mutex);
}
P2(){
wait(mutex);
执行C3;
signal(mutex);
}
}CoEnd
评分及理由
(1)得分及理由(满分2分)
学生正确指出C1是临界区,并解释了原因:多个进程同时对缓冲区B进行写操作时需要互斥访问,否则会产生数据冲突。这与标准答案一致。得2分。
(2)得分及理由(满分3分)
学生使用了三个信号量:mutex、empty和full。但题目要求"定义尽可能少的信号量",标准答案只用了两个信号量(mutex和full)。学生额外使用了empty信号量,虽然逻辑正确,但不符合"尽可能少"的要求。此外,full初值应为0(表示缓冲区空),但学生设为1,这是逻辑错误。代码结构正确,但信号量定义和初值有误。扣1分。得2分。
(3)得分及理由(满分3分)
学生正确使用一个mutex信号量实现互斥,代码结构与标准答案一致。虽然题目要求B初始不为空,但这对C3的互斥实现没有影响。得3分。
题目总分:2+2+3=7分
登录后发布评论
暂无评论,来抢沙发