文章
246
粉丝
40
获赞
2
访问
12.6k
(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分)
学生定义了三个信号量(mutex、empty、full),但题目要求“尽可能少的信号量”,且标准答案仅需两个(mutex和full)。学生使用empty和full进行同步,虽然逻辑正确(能实现同步和互斥),但信号量数量多于必要(empty和full实际是冗余的,只需一个full即可)。此外,full初值应为0(表示空),但学生设为1(错误),这会导致P1先执行时无法通过wait(full)(因为full初值1,P1会减为0并执行,但逻辑上B初始为空,应阻止P2执行,但这里P2的wait(empty)初值0会阻塞,整体能工作,但信号量设计和初值不最优)。代码逻辑能正确同步,但信号量定义未满足“尽可能少”的要求,且full初值错误。扣1分。得2分。
(3)得分及理由(满分...
登录后发布评论
暂无评论,来抢沙发