操作系统 PV深度剖析 PV操作的例题 联系客服

发布时间 : 星期五 文章操作系统 PV深度剖析 PV操作的例题更新完毕开始阅读ae240f8cd0d233d4b14e69b0

P(full)

bufferV消

P(mutex2)

(out)中取out=(out+1)mod

(mutex2

出n

)品产

品;

; ;

V(empty);

; }

需要注意的是无论在生产者进程中还是在消费者进程中,两个P操作的次序不能颠倒。应先执行同步信号量的P操作,然后再执行互斥信号量的P操作,否则可能造成进程死锁。 【例题六】桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。 分析在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。

解:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下: int S=1; int Sa=0; int So=0; main() { cobegin father(); son(); daughter(); coend } father() { while(1) { P(S); 将水果放入盘中; if(放入的是桔子)V(So); else V(Sa); } } son() {

从盘吃

中取桔

出桔子

while(1)

{ P(So); 子;

V(S); ; } }

daughter()

{ while(1)

{ P(Sa);

从盘中取出苹果; V(S); 吃苹果; } }

思考题:

四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F。但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F。为了使这四个进程并发执行时能按系统要求使用文件,现用PV操作进行管理,请回答下面的问题: (1)应定义的信号量及初值: 。 (2)在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作: A() B() C() D() { { { { [1]; [3]; [5]; [7]; read F; read F; read F; read F; [2]; [4]; [6]; [8]; } } } } 思考题解答: (1)定义二个信号量S1、S2,初值均为1,即:S1=1,S2=1。其中进程A和C使用信号量S1,进程B和D使用信号量S2。 (2)从[1]到[8]分别为:P(S1) V(S1) P(S2) V(S2) P(S1) V(S1) P(S2) V(S2)

习题1:有三个并发进程使用同一个缓冲区,进程P1负责读数据到缓冲区,P2负责加工缓冲区中的数据,进程P3负责将缓冲区中加工后的数据输出.在进程P3没有输完之前,进程P1不能读入新的数据到缓冲区中.请用P、V操作编程. 解:信号量初值:S1=0,S2=0,S3=0 进程P1 进程P2 进程P3 读数据到 P(S1) P(S2) 缓冲区 加工 输出 V(S1) V(S2) V(S3) P(S3)

习题2:设有六个进程P1、P2、P3、P4、P5、P6,它们并发执行。由P1开始执行,P6执行后结束。当进程P1执行后,进程P2、P3才能执行;当进程P2执行后,进程P4才能执行;当进程P3执行后,进程P5才能执行;当进程P4、P5都执行后,进程P6才能执行;请用P、V操作编程. 解:这是一个同步问题,信号量初值:S2=0,S3=0,S4=0,S5=0,S6=0 进程P1 进程P2 进程P3 执行P1 P(S2) P(S3) V(S2) 执行P2 执行P3 V(S3) V(S4) V(S5)

进程P4 P(S4) 执行P4 V(S6) V(S6) 执行P6

进程执

P5 进P(S5) 行

P5

程P6 P(S6) P(S6)