一、什么是临界区?对临界区的访问应该遵循什么准则?
临界区:访问临界资源的那段代码。
准则:
- 互斥,如果有进程在某个临界区执行,其他进程将被排斥在临界区外,有相同临界资源的临界区都需要互斥,无相同临界资源的临界区不需要互斥。
- 有空让进,临界区内无进程执行,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效利用临界资源。
- 有限等待,每个进程进入临界区前的等待时间必须有限,以免陷入“死等”状态。
二、请谈谈同步信号量的值有什么含义。
同步信号量的值大于0时,表示这一资源没有被使用的数量,或者释放的数量,可分配请求使用这个资源的进程。
同步信号量的值等于0时,表示这一资源分配完毕,或者没有被释放,如果现在有进程申请这个资源,必须等待。
同步信号量的值小于0时,表示请求这一资源没有得到而正在等待这一资源的数目。
三、有四个进程S1、R1、R2和R3,其中S1向缓冲区BUFF发送消息,R1、R2和R3从缓冲区中接收消息。发送和接收的规则如下:
- 缓冲区BUFF任何时候只能存放1个消息;
- R1、R2和R3每次可取S1存放在缓冲区中的消息;
- 每个存放在缓冲区中的消息必须被R1、R2和R3均接收后才能清除。
请用信号量机制来实现这4个进程间的同步。
信号量初值S1=1,S2=0,S3=0,S4=0,MUTEX=1;
int Count=0;
S1 R1 R2 R3
repeat repeat repeat repeat
P(S1) P(S2) P(S3) P(S4)
Send message get message get message get message
P(MUTEX) P(MUTEX) P(MUTEX) P(MUTEX)
Count=0 Count=Count+1 Count=Count+1 Count=Count+1
V(S2) if(Count=3) if(Count=3) if(Count=3)
V(S3) V(S1) V(S1) V(S1)
V(S4) V(MUTEX) V(MUTEX) V(MUTEX)
V(MUTEX) until false until false until false
until false
四、桌上有一个空的水果盘,且盘中一次只能放一个水果。爸爸专向盘中放苹果,妈妈专向盘中放桔子,一个儿子专等吃盘子中的桔子,一个女儿专等吃盘子中的苹果。固定每次当盘子空时爸爸或妈妈可向盘中放一个水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出。请用PV操作实现爸爸、妈妈、儿子和女儿四个进程的同步。
信号量初值apple=0,orange=0,plate=1
Dad(){
while(1){
准备苹果;
P(plate);
放苹果;
V(apple);
}
}
Daughter(){
while(1){
P(apple);
拿苹果;
V(plate);
吃苹果;
}
}
Mom){
while(1){
准备桔子;
P(plate);
放桔子;
V(orange);
}
}
Son(){
while(1){
P(orange);
拿桔子;
V(plate);
吃桔子;
}
}