PV操作(OS里面)

  PV操作,是在OS中提到的一个概念,是用来实现进程同步和互斥的常用方法,两个操作都是低级的通信原语
P操作属于申请资源,V操作属于释放支援(假设存在信号量S)
其中
 执行P操作时: S=S-1  当S>=0时执行将要进行的操作    S<0 时,置该进程为阻塞状态
 执行V操作时: S=S+1  当S>0 时执行将要进行的操作    S<=0时,唤醒一个进程
下面讲一个存取货物的例子:
-------------------------
P1:代表着存放货物     信号量为S1  初值=1
P2:代表着获取货物    信号量为S2  初值=0
//当个缓冲区情况:
P1(){
   生产;
   P(S1);  //请求存放货物  此时S1-1=0 -> S1>=0 ->执行操作  
   存放货物; //通过了上层的判断,得知有空间予以存放可以存放货物
   产品送到存放区;
   V(S2);  //更新操作,告知已有货物存入,有货物供取去  此时S2=S2+1 -> S2=1
}
P2(){
   P(S2);  //请求获取货物  此时S2=S2-1;  S2=0  -> S2>=0  执行操作
   获取货物; //得知有货物可以获取,可以获取
   V(S1);  //更新操作,告知货物已取,有空间存放新的虎屋   此时 S1=S1+1  -> S1=1
   消费;
}
-------------------------
P1:代表着存放货物     信号量为S1  初值=0 注意这里的S1初值有上面的1->0
P2:代表着获取货物    信号量为S2  初值=0 此处仍然是不变的
//只能存取意见货物的情况下:
P1(){
   存放一个货物;
   货物送至存放区;
   V(S2); //我还是认为这个V有点像一个更新操作   S2=S2+1  ->  S2=1
   P(S1);  //此时这里的不同是,S1-1=-1 -> S1<0 ->进程阻塞   ->不能执行存放操作
}
P2(){
   P(S2);  //请求获取货物  此时S2=S2-1;  S2=0  -> S2>=0  执行操作
   获取货物; //得知有货物可以获取,可以获取
   V(S1);  //更新操作,告知货物已取,有空间存放新的虎屋   此时 S1=S1+1  -> S1=0
   消费;
}


===============================================================================================
多个缓冲区情况下:
设置3个信号量 S=1(互斥信号量) S1=n(缓冲区可存放量) S2=0(缓冲区已存放量)
P1(){
   生产产品;
   P1(S1);  //每次的S1-=1;表示还能存放的空间减少1  -> 执行存入操作
   P(S);  //执行P1的时候不能执行P2
   产品送到缓冲区;
   V(S);  //解除互斥信号
   V(S2);      //更新操作,让缓冲区获得相应的表示
}
P2(){
   P(S2);  //S2-=1; ->执行取去操作
   P(S);  //设置互斥信号
   从缓冲区里面找产品;
   V(S);  //解除互斥信号
   V(S1);  //更新操作,让缓冲区知道还有多少的存放量
   消费;
}
 各位亲,静下心,,慢慢理解!!
(PS:最近在看软件设计师教程准备考软考了!
                                虽说上午的才三遍,让我真郁闷,但是加油。杨某某,我遇到你容易吗我)

 
 

posted @ 2013-03-09 15:54  后飞IT  阅读(851)  评论(0编辑  收藏  举报