您的位置:首页 > 其它

进一步学习PV操作——统一于生产者消费者问题

2010-10-09 19:33 281 查看

在PV操作首先要明白P操作是在申请一个资源(可用资源数减一),V操作是在释放一个资源(可用资源数加一)。而资源数的载体的就是我们所说的信号量。

PV操作中典型的问题是消费者-生产者问题。对于此类问题,要清楚其实它们都是对那个缓冲区进行操作。如下例题》





这类问题通常涉及三个信号量,一个是用于互斥的信号量,另外两个则是控制生产者向缓冲区放入产品和消费者从缓冲区取走产品。它们分别如上图中的s1和s2。

在PV操作中,还有一个比较有意思的问题——读写者问题。它分为读者优先和写者优先两种。读者优先和写者优先的区别在于当有写者在等待时,如有又有读者来了,是否允许此读者进入去读。

说这个问题有意思是因为转换个角度看,其实它也是消费者-生产者问题。

读写者问题中的消费方和消费方是虚拟的,而这个问题中的产品也不是一般意义上的产品——读者和写者就是这个问题中的产品。不过这相对于消费者和生产者而言此次放入缓冲区内的产品是两种不同的产品了,不过这两种产品有个优先权问题(读者优先&写者优先)。以读者优先为例,如下图代码所示。





观察上图我们会发现,在读写者问题中多了一个readcount变量,以此来解决读者优先问题。此外我们还会发现这个所谓的“生产者-消费者问题”中,只有两个信号量,一个是互斥作用的mutex,另一个则是控制“产品”进入缓冲区的。而生产者-消费者中的消费过程未直接体现出来。也就是说上图所演示的读写者问题中的读者进程和写者进程都是产品的生产过程。

那么明白了这一点有什么作用呢?

典型的生产者-消费者问题中,有三个信号量。只要有不允许两个以上进程同时访问的区域就会有互斥信号量;只要存对产品进行的两种不同操作,就得有两个信号量对其控制,它们的初值决定于每个操作主体对产品作用的最大数。这样以来,类似于该问题的问题就能容易的判断出信号量的个数与初值。

此外,对于生产者-消费者问题有如下规律。

缓冲区域内没有产品肯定不要消费者取走产品,所以我们要先考虑生产者的进程。在此进程中对s1(控制生产者生产产品的信号量)进行P操作请求资源,允许则向缓冲区放入产品,而后就要告诉消费者可以消费了,也就是我们要对S2(控制消费者消费的信号量)实行V操作。由此,类似于该问题的问题就能的容易知道在哪一步应对哪个信号量实行哪种操作(P||V)了。

在典型问题中还有像理发师这样的问题也可归结为生产者-消费者问题。其中理发师是“消费者”,来理发的是“产品”,而生产者是虚拟的。此外生产者-消费者还有许多其他的变种,如下图所示。







这样看来一个生产者-消费者问题在PV操作世界里真有一统天下之感,至少在应对日常典型例题时是这样!

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  产品