}
coend
get() { }
compute() { }
while(计算工作未完成) { }
p(Sf);
从缓冲区中取出数据; v(Se); 进行数据计算; while (采集工作未完成) { }
采集一个数据: p(Se);
将数据送入缓冲区中; v(Sf);
图2.7给出了四个进程合作完成某一任务的前趋图,试说明这四个进程间的同步关系,并用P、V操作描述它。P35
图2.7 四个合作进程的前趋图
解:图2.7说明任务启动后S1先执行。当S1结束后,S2、S3可以开始执行。S2、S3
完成后,S4才能开始执行。为了确保这一执行顺序,设三个同步信号量b2、b3、b4分别
表示进程S2、S3、S4是否可以开始执行,其初值均为0。这四个进程的同步描述如下:
int b2=0; /*表示进程S2是否可以开始执行*/ int b3=0; /*表示进程S3是否可以开始执行*/
第 21 页 共 37 页
int b4=0; /*表示进程S4是否可以开始执行*/ main() {
cobegin
S1 ( ); S2 ( ); S3 ( ); S4 ( ); coend }
S1 ( ) {
┇
v(b2); v(b3); } S2 ( ) {
p(b2); ┇
v(b4); }
S3 ( ) {
p(b3): ┇ v(b4); }
S4 ( ) {
p(b4);
p(b4); /*因在S2及S3完成时均对b4做了v操作,因此这里要用两个p操作*/ ┇ }
8. 桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专
等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
[分析及相关知识] 在本题中,爸爸、儿子、女儿共用一个盘子,且盘中一次只能放一个水果.当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子
第 22 页 共 37 页
吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者—消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
解:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值 为1;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初 值为0。同步描述如下: int S=1; int Sa=O: int So=O: main( ) { cobegin father(); son();
daughter():
coend
} father() { while (1) { p(S);
将水果放入盘中; if(放入的是桔子)
else v(Sa); }
)
son( ) { while(1) { p(So);
从盘中取出桔子; v(S); 吃桔子;
}
}
dau[shter() { while(1) { p(Sa);
从盘中取出苹果; v(So): 第 23 页 共 37 页
}
}
v(S): 吃苹果;
9. 有三个进程PA、PB和PC合作解决文件打印问题:PA将文件记录从磁盘读入主存的
缓冲区1,每执行一次读一个记录;PB将缓冲区1的内容复制到缓冲区2,每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小等于一个记录大小。请用P、V操作来保证文件的正确打印。
1)P、V操作是两条原语,定义如下:
P操作:P操作记为P(S),其中S为一信号量,它执行时主要完成下述动作: S=S-1
若S>=0,则进程继续运行。
若S<0,则该进程被阻塞,并将它插入该信号量的等待队列中。
V操作:V操作记为V(S),其中S为一信号量,它执行时主要完成下述动作: S=S+1
若S>0,则进程继续运行。
若S<=0,则从信号量的等待队列中移出队首进程。使其变为就绪状态。
(2)描述如下:
Var empty1,empty2,full1,full2:semaphore:=1,1,0,0; begin parbegin
process1: begin
repeat
从磁盘读一个记录;
P(empty1);
将记录存入缓冲区1; V(full1); until false;
end
process 2: begin
第 24 页 共 37 页