操作系统练习题new 下载本文

}

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 页