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:最近在看软件设计师教程准备考软考了!
虽说上午的才三遍,让我真郁闷,但是加油。杨某某,我遇到你容易吗我)