#PV操作#408真题系列

知识回顾】PV操作

PV大题宝典

(1)草稿纸上写出进程行为轨迹,多留点空位;

(2)按逻辑一步一步推进,分析:哪些地方可能会等待【同步关系】?哪些地方会访问临界资源【互斥关系】?

(3)坚持一个原则(PV操作一定是成对出现的)。利用这个特性,先在可能阻塞的地方P一下,再思考应该在什么地方V

(4)先确定PV操作的位置,再思考该设置什么样的信号量、信号量的含义是什么

生产者-消费者问题

问题】多个生产者进程和多个消费者进程共享一个初值为空、大小为n的缓冲区(临界资源)。

只有缓冲区没满,生产者才能放东西进缓冲区,否则等待;

只有缓冲区不空,消费者才能从缓冲区取东西,否则等待。

分析

第一步:关系分析】生产者和消费者对缓冲区互斥访问是互斥关系;只有生产者生产后消费者才能消费,所以生产者和消费者也是同步关系。

第二步:信号量设置

mutex:互斥信号量,控制互斥访问缓冲区,初值=1;

full:同步信号量,表示当前缓冲区的东西数,初值=0;

empty:同步信号量,表示当前缓冲区的空位数,初值=0。

#PV操作#408真题系列_第1张图片

#PV操作#408真题系列_第2张图片

注意】生产者前面的2个P不能调换位置

————【原因】如果生产者进程已将缓冲区放满,消费者进程没取(empty=0);

而热心市民生产者这时先P(mutex)即共享区被生产者锁住占用,但其实生产者执行到P(empty)停住了(需要消费者取数后~解救生产者,但其实消费者进不去共享区),造成死锁现象。

题一:生产者消费者改编

#PV操作#408真题系列_第3张图片

【解析】原来生产者-消费者的改版(full拆分成even和odd)。mutex=1;(缓冲区操作的互斥信号量)

odd=0,even=0 //缓冲区奇数/偶数个数(同步信号量); empty=N //缓冲区空位(同步信号量)

P1{
    X=produce();
    P(empty);
    P(mutex);
    Put();
    V(mutex);
    if(X%2==0)
        V(even);
    else
        V(odd);
}
P2{
    P(even);
    P(mutex);
    getodd();
    V(mutex);
    V(empty);
    countodd();
}
P3{
    P(even);
    P(mutex);
    geteven();
    V(mutex);
    V(empty);
    counteven();
}

注意】其实P2和P3的countodd和counteven可以放到get后,但是为了早点释放(V)临界资源,count放了最后。

题二:简单PV题

#PV操作#408真题系列_第4张图片

#PV操作#408真题系列_第5张图片

注意:以往做的题对临界区设置empty和full同步信号量,这里其实也可以把V(empty)写成V(full).

题三:复杂典型PV

#PV操作#408真题系列_第6张图片

#PV操作#408真题系列_第7张图片

【解析】

一般答案的逻辑(×):

empty=10;mutex=1

空座位时顾客才去取号,所以设置同步信号量empty;

营业员空闲时才叫
有顾客的时候营业员才叫号,所以设置同步信号量full;号,所以设置同步信号量service;

符合逻辑的思路(√):

(1)empty空座位的V可以放在顾客进程的等待叫号后、接收服务前(由顾客被叫号后离开导致释放座位资源),也可以放在营业员进程的叫号之后(叫号后导致顾客离开座位)

(2)顾客进程中:P(b)一定要放在V(a)之前(否则是顾客先释放座位即起身再等待叫号——不合理)

(3)解题过程:看哪里需要【等待】确定P位置,想这个P应该是什么信号量;再看哪里能够 触发【停止等待】确定V位置,最后重命名信号量方便答题。

process 顾客 i{ //表示第i个顾客

P(a);//等座位----初值a=10

从取号机上取号

V(c);//顾客取号后座位就有人啦~

由顾客释放c资源

 

等待叫号

P(b);//等待叫号---初值b=0

若b初值≥1则一开始营业员没叫号下顾客也能动

 

V(a);

接受服务

}

process 营业员{

while(True){

P(c);//等座位上的顾客---初值为0(一开始0个顾客)

 

叫号;

V(b);

 

为顾客服务

}

}

题四:

 

 

--------------------------未完待续-----------------------------

你可能感兴趣的:(操作系统)