主观题:h405.有如图2-3所示的工作模型:三个进程P0、P1、P2和三个缓冲区B0、B1....
有如图2-3所示的工作模型:
三个进程P0、P1、P2和三个缓冲区B0、B1、B2,进程间借助相邻缓冲区传递消息:P0每次从B0中取出一条消息经加工后送入B1中,P1每次从B1中取出一条消息经加工后送入B2中,P2每次从B2中取出一条消息经加工后送入B0中。B0,B1,B2分别可存放3,2,2个消息。初始时B0中有2个消息,B1 ,B2中各有1个消息。用P、V操作写出P0,P1,P2的同步及互斥流程。

【2-3】
答案:解:
semaphore empty0,full0,empty1,full1,empty2,full2,mutex;
empty0=1;full0=2; //冲区B0有2个消息,还可放1个消息
empty1=1; full1=1; //冲区B1有1个消息,还可放1个消息
empty2=1; full2=1; //冲区B2有1个消息,还可放1个消息
mutex=1; //互斥信号量
parbegin
Process P0
{
while (1) {
P(full0); //看看B0中是否有消息
P(mutex); //互斥访问B0
从缓冲区B0中取一个消息x;
V(mutex);
V(empty0); //B0中空出一个存放消息的位置
加工消息x;
P(empty1); //看看B1中是否可放一个消息
P(mutex); //互斥访问B1
将加工后的x存入缓冲区B1;
V(mutex);
V(full1); //B1中增加一个消息(3分)
}
}
Process P1
{
while (1) {
P(full1); //看看B1中是否有消息
P(mutex); //互斥访问B1
从缓冲区B1中取一个消息y;
V(mutex);
V(empty1); //B1中空出一个存放消息的位置
加工消息y;
P(empty2); //看看B2中是否可放一个消息
P(mutex); //互斥访问B2
将加工后的x存入缓冲区B2;
V(mutex);
V(full2); //B2中增加一个消息(3分)
}
}
Process P2
{
while (1) {
P(full2); //看看B2中是否有消息
P(mutex); //互斥访问B2
从缓冲区B2中取一个消息z;
V(mutex);
V(empty2); //B2中空出一个存放消息的位置
加工消息z;
P(empty0); //看看B0中是否可放一个消息
P(mutex); //互斥访问B0
将加工后的z存入缓冲区B0;
V(mutex);
V(full0); //B0中增加一个消息(4分)
}
}
parend
三个进程P0、P1、P2和三个缓冲区B0、B1、B2,进程间借助相邻缓冲区传递消息:P0每次从B0中取出一条消息经加工后送入B1中,P1每次从B1中取出一条消息经加工后送入B2中,P2每次从B2中取出一条消息经加工后送入B0中。B0,B1,B2分别可存放3,2,2个消息。初始时B0中有2个消息,B1 ,B2中各有1个消息。用P、V操作写出P0,P1,P2的同步及互斥流程。

【2-3】
答案:解:
semaphore empty0,full0,empty1,full1,empty2,full2,mutex;
empty0=1;full0=2; //冲区B0有2个消息,还可放1个消息
empty1=1; full1=1; //冲区B1有1个消息,还可放1个消息
empty2=1; full2=1; //冲区B2有1个消息,还可放1个消息
mutex=1; //互斥信号量
parbegin
Process P0
{
while (1) {
P(full0); //看看B0中是否有消息
P(mutex); //互斥访问B0
从缓冲区B0中取一个消息x;
V(mutex);
V(empty0); //B0中空出一个存放消息的位置
加工消息x;
P(empty1); //看看B1中是否可放一个消息
P(mutex); //互斥访问B1
将加工后的x存入缓冲区B1;
V(mutex);
V(full1); //B1中增加一个消息(3分)
}
}
Process P1
{
while (1) {
P(full1); //看看B1中是否有消息
P(mutex); //互斥访问B1
从缓冲区B1中取一个消息y;
V(mutex);
V(empty1); //B1中空出一个存放消息的位置
加工消息y;
P(empty2); //看看B2中是否可放一个消息
P(mutex); //互斥访问B2
将加工后的x存入缓冲区B2;
V(mutex);
V(full2); //B2中增加一个消息(3分)
}
}
Process P2
{
while (1) {
P(full2); //看看B2中是否有消息
P(mutex); //互斥访问B2
从缓冲区B2中取一个消息z;
V(mutex);
V(empty2); //B2中空出一个存放消息的位置
加工消息z;
P(empty0); //看看B0中是否可放一个消息
P(mutex); //互斥访问B0
将加工后的z存入缓冲区B0;
V(mutex);
V(full0); //B0中增加一个消息(4分)
}
}
parend