文章

397

粉丝

40

获赞

2

访问

88.2k

头像
2024年计算机学科专业基础综合试题 - 第46题回答
操作系统
发布于2025年9月17日 00:48
阅读数 294

(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;互斥访问缓冲区的锁
semaphore empty = 1;//缓冲区内还能读多少数据


P1(){
wait(empty);
wait(mutex);
执行C3;
signal(mutex);
signal(empty);


}
P2(){
wait(empty);
wait(mutex);
执行C3;
signal(mutex);
signal(empty);
}

}CoEnd

 


评分及理由

(1)得分及理由(满分2分)

学生正确指出C1代码是临界区,并解释了原因(互斥访问避免数据冲突),与标准答案一致。得2分。

(2)得分及理由(满分3分)

学生定义了三个信号量(mutex、empty、full),但题目要求“尽可能少的信号量”,实际上只需要两个(mutex和full,或mutex和empty)。学生使用full和empty来同步,但初始值设置错误:full初值应为0(表示空),empty初值应为1(表示可写),但学生设置full=1、empty=0,这会导致P1先执行时能直接进入(正确),但P2先执行时会被empty阻塞(正确),但full初值错误(应为0表示空,但设为1表示非空)。逻辑上能工作,但信号量命名和初值不标准(通常full表示满缓冲数量,初值0;e...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发