- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
经典PV操作问题
经典P、V操作问题详解
lionxcat@gmail.cn
一、基本概念
1. 信号量
struct semaphore
{
int value; // 仅且必须附初值一次,初值非负
PCBtype* wait_queue; // 在此信号量上阻塞的进程队列
} S; // 信号量实例为S
2. P、V操作
P(S){
S := S-1;
if (S0)
调用进程自己阻塞自己,等待在S的等待队列末尾;
}
V(S){
S := S+1;
if (S≤0)
从S等待队列头释放一进程就绪在就绪队列尾;
调用进程继续执行;
}
3. 使用方法
(i). P、V操作成队出现,处理互斥时出现在同一进程中;处理同步时出现在不同进程中。
(ii). 同步P先于互斥P调用,V的顺序无关。
4. 另类P、V操作导致的问题(或信号量的栈实现方法或漏斗法)
[习题P174-23]
某系统如此定义P、V操作:
P(S): S = S-1; 若S<0,本进程进入S信号量等待队列的末尾;否则,继续执行。
V(S): S=S+1; 若S≤0,释放等待队列中末尾的进程,否则继续运行。
(1)上面定义的P、V操作是否合理?有什么问题?
(2)现有四个进程P1、P2、P3、P4竞争使用某一个互斥资源(每个进程可能反复使用多次),试用上面定义的P、V操作正确解决P1、P2、P3、P4对该互斥资源的使用问题。
答:
(1)不合理:先进后出;可能“无限等待”,即等待队列头的进程得不到释放。
(2)思路:令每个信号量上的等待队列中始终只有一个进程。解决方案如下:(n个进程)
n个进程至多有n-1个等待。设置n-1个信号量,每个进程阻塞在不同的信号量上,使每个等待队列至多有一个进程等待。用循环模拟队列。
Semaphore S[n-1]; // S[i]的初值为i+1
Procedure_i()
{
int j;
DO_PRE_JOB();
for(j=n-2; j=0; j--)
P(S[j]);
DO_JOB_IN_CRITICAL_SECTION();
for(j=0;j=n-2;j++)
V(S[j]);
……
}
二、经典进程同步问题
总述:进程同步问题主要分为以下几类:一(生产者-消费者问题);二(读者写者问题);三(哲学家就餐问题);四(爱睡觉的理发师问题);五(音乐爱好者问题);六(船闸问题);七(红黑客问题)等。其中前两类都是用于处理进程之间通信的问题:生产者-消费者问题主要实现进程的消息机制,而读者-写者问题用于实现管道通信。哲学家就餐问题是经典的互斥转同步防止死锁的多资源争夺。理发师问题适合I/O或外部设备的管理,如打印调度。红黑客问题是解决不同条件触发事件的思想方法。
I. 生产者—消费者问题(初始缓冲区为空)
问题:生产者生产产品放到缓冲区,消费者从缓冲区取产品消费。
①单缓冲区[书P119](适合单或多生产消费者):
同步:生产者不能往满缓冲区放产品(S1(1));消费者不能从空缓冲区取产品(S2(0))。
void Producer()
{
while (true){
生产一个产品;
P(S1); 申请一个空的缓冲区
放到缓冲区;
V(S2); 返回一个满的缓冲区
}} void Consumer()
{
while (true){
P(S2); 申请一个满的缓冲区
从缓冲区取一个产品;
V(S1); 返回一个空的缓冲区
消费产品;
}} ②环行多缓冲区(或无穷缓冲区)单生产消费者[习题P173-13]:
同步:生产者不能往满缓冲区放产品(S1(n));消费者不能从空缓冲区取产品(S2(0))。n为缓冲区大小。
互斥:设置指示下一个空缓冲区的位置变量(i(0))和指示下一个产品在缓冲区的位置变量(j(0)),由于只有一个生产者和消费者,i和j无须互斥访问。此问题无互斥关系。
void Producer()
{
while (true){
生产了一个产品;
P(S1);
把产品放入缓冲区;
i = (i+1)%n; // 无穷缓冲区无须’%n’
V(S2);
}} void Consumer()
{
while (true){
P(S2);
取一个产品;
j = (j+1)%n; // 无穷缓冲区无须’%n’
V(S1);
消费产品;
}} ③环行多缓冲区多生产消费者[书P120]:
同步:生产者不能往满缓冲区放产品(S1(n));消费者不能从空缓冲区取产品(S2(0))。n为缓冲区大小。
互斥:设置指示下一个空缓冲区的位置变量(i(0)),生产者之间互斥(mutex1(1));设置指示下
文档评论(0)