借生产者/消费者问题讲PV操作

来源:互联网 发布:mac装linux虚拟机 编辑:程序博客网 时间:2024/05/16 09:20

生产者/消费者问题

假定有一个生产者和一个消费者。他们共用一个缓冲器。生产者不断地生产物品。每生产一件物品就存入缓冲器,但缓冲器中每次只能存放一件物品,只有当消费者把物品取走后,生产者才能把第二件物品存入缓冲器。同样,消费者不断地取走物品去消费。当缓冲器中有物品是,他就可以去取。每取走一件物品后必须等生产者再放入一件物品才可再取。

 

PV操作实现生产者/消费者之间的同步

定义信号量:

SP:表示是否可以把物品存入缓冲器。初始值为1

SG:表示缓冲器中是否存有物品。初始值为0

具体过程如下:

Begin

bufferinteger;

SP,SGsemaphore;

SP= 1; SG= 0;

 

Cobegin

Process producer

Begin

L1produce aproduct;/生产一件物品/

P(SP);

buffer=product;/将生产的物品存入缓冲器/

V(SG);

Go to L1

End;

 

Process consumer

Begin

End;

coend

End

 

以上就是经典的生产者/消费者问题,也许有人对PV操作的具体实现过程不是很理解,下面说几点来帮助大家理解PV操作。

1、信号量

理解信号量的含义是理解PV操作的关键。如何理解上面生产者/消费者问题中的两个信号量SPSG呢?其实SPSG是从不同角度对同一现象的描述。也就是说,SPSG中的一个变了,另一个一定会跟着改变(这一点很重要)。


2P操作

具体过程如下:

Begin

S = S - 1;

If S < 0 then

W(S)

End

问题:为什么信号量要减一?

拿生产者的例子来说,执行P(SP)时,生产者已经生产了一个物品,而且不管条件允不允许,他都准备将物品放入缓冲器中,所以信号量SP会减一。


3V操作

具体过程

Begin

S = S + 1;

If S <= 0 then

R(S)

End

从生产者/操作者的例子可以看出,P操作的后面肯定会有V操作出现,只是操作的信号量不一样罢了。

问题一:为何P操作后面一定有V操作?

讲信号量的时候说过,SPSG其实是从不同的角度对同一现象的描述,SP的改变必定会导致SG的变化,所以P操作后一定有V操作。故V操作的第一步就是使信号量加一。

问题二:V操作中的条件判断的是什么?

判断的是信号量S描述的进程是否有等待的。


4R(S)唤醒的进程从哪步继续执行?

R(S)唤醒的进程从处于等待的位置开始执行,而不是从开始执行P操作。再具体一点:

P操作的具体过程如下:

Begin

S = S - 1;

If S < 0 then

W(S)

End

R(S)唤醒此进程时,直接从W(s)处开始执行,而不是从Begin处开始执行。

原创粉丝点击