您的位置:首页 > 其它

操作系统——关于PV操作

2014-03-25 21:50 316 查看

操作系统——关于PV操作

在操作系统的进程管理中,PV是重点和难点。

先来看一下信号量PV操作的定义:


信号量:
信号量是个数据结构。

struct semaphore

{

int value;

pcb *blockqueue;

}mutex;

其中value是信号量的值;blockqueue是等待使用该信号量的进程排成的队列的对手指针。


PV操作


p操作:当一个进程对对信号量mutex执行p操作时,执行两个动作:

mutex.valu–;
//申请一个资源

if
(mutex.value<0)
//申请失败

sleep();
//本进程进入该信号量等待队列睡眠

v操作:当一个进程对对信号量mutex执行v操作时,执行两个动作:

mutex.value++;
//释放一个资源

if
(mutex.value>=0)
//如果有进程在等待使用本进程

wakeup();
//从该信号量的等待队列中唤醒一个进程

注:操作系统会保证PV操作的原子性,也就是说当一个进程执行PV操作,检测信号量时,不受中断。

接下来来看一下PV操作实现的功能:

实现进程之间的互斥;

实现进程之间的同步;


区别:
互斥是为了保证资源一次只能由一个进程使用;而同步是为了实现进程通信,即传递资源当前的态
是否适合一个进程进行使用。

分别看个例子:

1.


互斥:
进出教室问题:有一个变量count,初值为0,一个学生进入教室则count++,出教室则count–。

mutex = 1;


IN:
OUT:


p(mutex);
p(mutex);

count++;
count–;

v(mutex);
v(mutex);

过程:一个学生进入教室执行IN,p操作,mutex.value =
0;假设在进行count++之前遇到了中断,而中断之后跳回来时正好这个学生又在出教室,那么这时候就会执行OUT,mutex.value
= -1,该OUT进程进入睡眠,返回IN进程,count =
1,v操作,mutex.value =
0(说明有等待使用count的进程);唤醒OUT进程,count
= 0,v操作,mutex.value = 1。

注意上面划线部分的假设。PV操作在这就是为了保证这种竞争情况的发生。

2.


同步:


桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。


分析
:在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。


:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下:

int S=1;

int Sa=0;

int So=0;

main()

{

cobegin

father();

son();

daughter();

coend



father()

{

while(1)

{

P(S);

将水果放入盘中;

if(放入的是桔子)V(So);

else V(Sa);

}

}

son()

{

while(1)

{

P(So);

从盘中取出桔子;

V(S);

吃桔子;



}

daughter()

{

while(1)

{

P(Sa);

从盘中取出苹果;

V(S);

吃苹果;






一些问题:
为什么要设计三个信号量?因为这里盘子的状态有三种情况。所以在PV操作用在同步的时候,资源都多少种状态,就应该有多少个信号量(高并发的不一定好,需要更多的信号量,这样消耗系统的资源就更多)。还有,有没有留意到,每一次“吃”的操作都是在V操作之后进行,这是为什么呢?这是因为V操作是释放资源的一个操作,当然是越早释放对系统越有利啊。

最后来看同步机制的几条原则:

空闲让进

忙则等待

有限等待

让全等待

对于第三条原则,在此做用一个读写操作一下说明:

写进行中:所有其它进程block;

读进行中:允许读请求,block写请求;

请求顺序如下:r1, r2, w1, r3, r4, …….

如果接下去一直是读操作,即读进程始终没有结束,那么w1操作将会一直无法运行到,这也就是所谓的进程饿死现象。所以必须要有一个机制来保证有限等待。

转发至微博


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