第3章 同步,通信与死锁
1.有三个并发进程:R负责从输入设备读入信息块,M负责对信息块进行加工处理,P负责打印输出信息块。现提供(1)一个缓冲区,可放置K个信息块;(2)两个缓冲区,每个缓冲区可放置K个信息块。
试用信号量和PV操作写出三个进程正确工作的流程。
答:(1)进程R,M和P之间存在同步的关系。设置资源信号量sread,初始值为K,用于R进程和M进程之间的同步;资源信号量smanage,初始值为0,用于M进程和P进程之间的同步;资源信号量sprint,初始值为0,用于P进程和R进程之间的同步。
item B[K]; //缓冲区大小
semaphore sread=K;//资源信号量,初始值为K,表示缓冲区中空位的个数,当sread<0时用于阻塞R进程。
semaphore smanage=0;//资源信号量,初始值为0,表示已处理信息块的个数,当smanage<0时用于阻塞M进程。
semaphore sprint=0;//资源信号量,初始值为0,表示可输出的信息块个数,当sprint<0时用于阻塞P进程。
int rptr=0; //R进程输入信息块的位置
int mptr=0;//M进程处理信息块的位置
int pptr=0;//P进程输出信息块的位置
item x;
void R(){
while(TRUE){
read(x);//读入信息块保存在x中
wait(sread);//缓冲区中空的位置减1
B[rptr]=x;
rptr=(rptr+1)%K;
signal(smanage);//当smanage>0时,唤醒M进程
}
}
void M(){
while(TRUE){
wait(smanage); //可处理的信息块个数减1
x=B[mptr];
manage(x);
B[mptr]=x;
mptr=(mptr+1)%K;
signal(sprint);//当sprint>0,唤醒P进程
}