借生产者/消费者问题讲PV操作
来源:互联网 发布:mac装linux虚拟机 编辑:程序博客网 时间:2024/05/16 09:20
生产者/消费者问题
假定有一个生产者和一个消费者。他们共用一个缓冲器。生产者不断地生产物品。每生产一件物品就存入缓冲器,但缓冲器中每次只能存放一件物品,只有当消费者把物品取走后,生产者才能把第二件物品存入缓冲器。同样,消费者不断地取走物品去消费。当缓冲器中有物品是,他就可以去取。每取走一件物品后必须等生产者再放入一件物品才可再取。
用PV操作实现生产者/消费者之间的同步
定义信号量:
SP:表示是否可以把物品存入缓冲器。初始值为1。
SG:表示缓冲器中是否存有物品。初始值为0。
具体过程如下:
Begin
buffer:integer;
SP,SG:semaphore;
SP:= 1; SG:= 0;
Cobegin
Process producer
Begin
L1:produce aproduct;/生产一件物品/
P(SP);
buffer:=product;/将生产的物品存入缓冲器/
V(SG);
Go to L1;
End;
Process consumer
Begin
End;
coend
End
以上就是经典的生产者/消费者问题,也许有人对PV操作的具体实现过程不是很理解,下面说几点来帮助大家理解PV操作。
1、信号量
理解信号量的含义是理解PV操作的关键。如何理解上面生产者/消费者问题中的两个信号量SP、SG呢?其实SP和SG是从不同角度对同一现象的描述。也就是说,SP和SG中的一个变了,另一个一定会跟着改变(这一点很重要)。
2、P操作
具体过程如下:
Begin
S: = S - 1;
If S < 0 then
W(S)
End
问题:为什么信号量要减一?
拿生产者的例子来说,执行P(SP)时,生产者已经生产了一个物品,而且不管条件允不允许,他都准备将物品放入缓冲器中,所以信号量SP会减一。
3、V操作
具体过程
Begin
S: = S + 1;
If S <= 0 then
R(S)
End
从生产者/操作者的例子可以看出,P操作的后面肯定会有V操作出现,只是操作的信号量不一样罢了。
问题一:为何P操作后面一定有V操作?
讲信号量的时候说过,SP、SG其实是从不同的角度对同一现象的描述,SP的改变必定会导致SG的变化,所以P操作后一定有V操作。故V操作的第一步就是使信号量加一。
问题二:V操作中的条件判断的是什么?
判断的是信号量S描述的进程是否有等待的。
4、R(S)唤醒的进程从哪步继续执行?
R(S)唤醒的进程从处于等待的位置开始执行,而不是从开始执行P操作。再具体一点:
P操作的具体过程如下:
Begin
S: = S - 1;
If S < 0 then
W(S)
End
R(S)唤醒此进程时,直接从W(s)处开始执行,而不是从Begin处开始执行。
- 借生产者/消费者问题讲PV操作
- 生产者消费者问题【pv操作】
- PV操作——生产者消费者问题
- 生产者消费者问题(PV操作)
- PV生产者消费者问题
- PV操作(生产者-消费者问题)-1【转帖】
- PV操作(生产者-消费者问题)-2【转帖】
- 用PV操作 实现生产者-消费者问题(C++语言)
- pv 生产者和消费者
- 进一步学习PV操作——统一于生产者消费者问题
- 用C语言实现--生产者与消费者的问题(PV操作)
- 操作系统学习笔记-信号量及PV操作与进程互斥和消费者生产者问题
- linux 使用共享内存实现生产者消费者,PV操作。
- 生产者和消费者(PV操作、共享内存)
- linux c pv 实现生产者消费者模型
- 关于网宿厦门研发中心笔试的一道PV操作题:利用java中的多线程实现生产者与消费者的同步问题
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
- Linux 用pv操作和共享内存实现生产者与消费者机制
- 原码 反码 补码
- 函数调用中缺少哨兵 [-Wformat]
- POJ 2251 Dungeon Master
- 电驴提示“该内容尚未提供权利证明,无法提供下载”之解决办法详解
- MD(d)、MT(d)编译选项的区别
- 借生产者/消费者问题讲PV操作
- Android中的线程处理
- 稀疏表示+子空间学习 (ICCV2011)
- ostringstream用法
- Shell脚本语法-- if/then/elif/else/fi
- 转发ECCV2012感兴趣的文章列表
- 【怀念张国荣继续宠爱十年音乐会】下载
- jsp的九大内置对象?对应servlet中的java对象?
- Hibernate常用配置属性