PV操作

本文详细介绍了PV操作在解决进程同步与互斥问题中的应用,包括一个生产者三个消费者的模型,以及如何用信号量实现资源的共享。通过具体的代码示例,解释了P操作和V操作的含义,强调了信号量的重要性,并提供了信号量的初始化和使用规则。此外,文章还提及了生产者-消费者问题的多种情况,包括单个和多个生产者、消费者的情况,以及如何避免进程死锁。最后,给出了一个父子女儿进程同步的例子,展示了不同类型的消费者如何通过PV操作共享资源。
摘要由CSDN通过智能技术生成

【问题】

A,B,C,D 四个进程, A 向 buf 里面写数据, B,C,D 向 buf 里面读数据,

当 A 写完,且 B , C , D 都读一次后, A 才能再写。用 P , V 操作实现。


解答:

一个生产者,三个消费者,公用 1 个缓冲区

在这个问题中,不仅生产者与消费者之间要同步,同时每生产一个产品,三个消费者必须并且只能消费一次。

定义四个信号量:

mutexB—— 消费者 B 和生产者之间的互斥信号量,初值为 1 。

mutexC—— 消费者 C 和生产者之间的互斥信号量,初值为 1 。

mutexD—— 消费者 D 和生产者之间的互斥信号量,初值为 1 。

 

生产者进程

while(TRUE)

{

生产一个产品 ;

// 因为这里需要确认三个消费者都已经消费了

P(mutexB);

P(mutexC);

P(mutexD);

 

产品送往 buffer();

 

// 三个消费者可以消费了

V(mutexB);

V(mutexC);

V(mutexD);

}

消费者进程 B ,每个产品,该消费者只能消费一次

while(TRUE)

{

P(mutexB);

    从 buffer() 中取出产品 ;

    V(mutexB);

    消费该产品 ;

}

消费者进程 C ,每个产品,该消费者只能消费一次

while(TRUE)

{

P(mutexC);

    从 buffer() 中取出产品 ;

    V(mutexC);

    消费该产品 ;

}

消费者进程 D, 每个产品,该消费者只能消费一次

while(TRUE)

{

P(mutexD);

    从 buffer() 中取出产品 ;

    V(mutexD);

    消费该产品 ;

}

下面是从网上找来的参考资料:

信号量PV操作
http://hi.baidu.com/superluo/blog/item/f2389618ef01febe4aedbcc3.html

阐述P,V原语的理论不得不提到的一个人便是赫赫有名的荷兰科学家 E.W.Dijkstra。如果你对这位科学家没有什么印象的话,提起解决图论中最短路径问题的Dijkstra算法应当是我们再熟悉不过的了。P,V原语的概念以及P,V操作当中需要使用到的信号量的概念都是由他在1965年提出的。

信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信号量的变量及对它进行的两个原语操作。信号量为一个整数,我们设这个信号量为:sem。很显然,我们规定在sem大于等于零的时候代表可供并发进程使用的资源实体数,sem小于零的时候,表示正在等待使用临界区的进程的个数。根据这个原则,在给信号量附初值的时候,我们显然就要设初值大于零。

p操作和v操作是不可中断的程序段,称为原语。P,V原语中P是荷兰语的Passeren,相当于英文的pass, V是荷兰语的Verhoog,相当于英文中的incremnet。

且在P,V愿语执行期间不允许有中断的发生。

对于具体的实现,方法非常多,可以用硬件实现,也可以用软件实现。这种信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。

--

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值