文章
327
粉丝
40
获赞
2
访问
39.7k
(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是临界区,并解释了原因(写操作需要互斥访问,否则会产生数据冲突)。回答完整且准确,得2分。
(2)得分及理由(满分3分)
学生定义了3个信号量(mutex、empty、full),但题目要求"尽可能少的信号量"。实际上只需要mutex和full两个信号量即可。empty信号量是多余的,且初始值设置错误(empty=0,full=1)。正确的同步逻辑应该是:P1先wait(mutex)执行C1,然后signal(full);P2先wait(full),然后wait(mutex)执行C2。学生代码中P1先wait(full)会导致P1无法执行(因为初始full=1,但B为空应该允许P1执行)。存在逻辑错误,扣2分,得1分。
(3)得分及理由(满分3分)
学生正确使用mutex信号量实现互斥访问,代码逻辑正确。虽然题目要求"尽可能少的信号量",但学生只用了1个信号量,符合要求。回答完整且准确,得3分。...
登录后发布评论
暂无评论,来抢沙发