-
PV操作
-
定义:由P操作原语和V操作原语(不可中断),对信号量进行操作
-
具体定义:
-
P(S):1。.信号量S减1;如果S>=0,则继续执行;否则该进程置于等待状态,排入等待队列。
-
V(S):1.信号量S加1;2.如果S>0,则进程继续执行;S<0应该要释放队列中第一个等待信号量的进程,然后继续执行。
注:如果这里的S=0? 解析:这里不会出现S=0;因为S=0的话,那么V之前的信号量为-1。再P之前,信号量为0。反推过程,S-1后为-1,进程应该进入等待队列。
-
-
意义:使用信号量和PV操作实现进程的同步和互斥。
-
-
信号量
- 信号量的值: 与相应资源的使用情况联系
- 当值大于0,表示当前可用资源的数量;
- 当值小于0,其绝对值表示等待使用该资源的进程个数。
- 当值等于0,此时有一个进程是在使用该资源的,但还没有等待的进程。下一个进程会进入等待队列。
- 信号量的值: 与相应资源的使用情况联系
-
信号量和PV操作实现进程互斥
一般模型: 进程P1 ... P(S); 临界区; V(S); 信号量S用于互斥,初值为1。 使用PV操作实现进程互斥应该注意: 1.成对性:每个程序实现互斥的PV操作应成对出现,先做P操作,进临界区,后做V操作,出临界区。有多个分支,要仔细检查成对性 2.PV操作应紧靠临界区头尾部,且临界区代码尽可能短,不能有死循环 3.互斥信号量初值一般为1。注意:这里不一定为1哦! -
信号量和PV操作实现进程同步
-
一个信号量与一个消息联系起来,
- 当信号量值为0,表示期望消息尚未产生
- 当信号量为非0,表示期望消息已经存在
-
调用P操作测试消息是否到达,调用V操作发送消息
-
PV操作实现进程同步时注意:
- 成对性:同一信号量的PV操作要成对出现,但要分别在不同的程序代码中。
- 分析进程间制约关系,来确定信号量种类。
- 同步信号量的初值与相应资源的数量有关,也与P、V操作在代码中的位置有关
-
问题:
例1 生产者-消费者问题 1)一个生产者、一个消费者,公用一个缓冲区。 解析:定义两个同步信号量 empty===表示缓冲区是否为空,初值为1 full===表示缓冲区是否为满,初值为0 思考:为什么这里不用一个同步信号量呢? 个人见解: 生产者进程: while(TRUE){ 生产一个产品; P(empty); //empty>=0则继续执行,否则加入等待队列;还有缓存 产品送往Buffer; V(full); } 消费者进程: while(TRUE){ P(full);//full>=0则继续执行,否则加入等待队列;还有产品了 从Buffer中取出一个产品; V(empty); } 2)一个生产者、一个消费者,公用n个环形缓冲区。 解析:定义两个同步信号量: empty==表示缓存区是否为空,初值为n; full===表示缓冲区是否为满,初值为0; 设缓冲区编号为1-n-1,定义两个指针in和out 生产者进程 while(TRUE){ 生产一个产品; P(empty); //empty>=0则继续执行,否则加入等待队列;还有缓存 产品送往Buffer; in=(in+1)mod n; V(full); } 消费者进程: while(TRUE){ P(full);//full>=0则继续执行,否则加入等待队列;还有产品了 从Buffer中取出一个产品; out=(out+1) mod n; V(empty); } 3)一组生产者、一组消费者,公用n个环形缓冲区。 解析:这里还要考虑生产者之间、消费者之间必须互斥地访问缓冲区 定义4个信号量 empty===表示缓冲区是否为空,初值为n full===表示缓冲区是否为满,初值为0 mutex1---生产者之间的互斥信号量,初值为1 mutex2---消费者之间的互斥信号量,初值为1 生产者进程 while(TRUE){ 生产一个产品; P(empty); //empty>=0则继续执行,否则加入等待队列;还有缓存 P(mutex1);//互斥信号量应紧贴临界区。 产品送往Buffer; in=(in+1)mod n; V(mutex1); V(full); } 消费者进程 while(TRUE){ P(full);//full>=0则继续执行,否则加入等待队列;还有产品了 P(mutex2); 从Buffer中取出一个产品; out=(out+1) mod n; V(mutex2); V(empty); } 注意:无论生产者进程还是消费者进程中,两个P的操作不能颠倒次序。否则会造成死锁。 例2 桌子上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定盘空时一次只放一只水果供吃者取用。请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。 1.首先分析 信号量
-
-
PV原语对信号量的操作的3种情况
- 视为一个加锁标志位,实现对一个共享变量的互斥访问
- 视为某种类型的共享资源的剩余个数
- 做为进程间的同步工具
-
补充:同步和互斥的概念
- 互斥:同一资源只允许一个访问者对齐进行访问,具有唯一性和排它性。访问无序。
- 同步:在互斥的基础上(大多数情况),通过其他机制实现访问者对资源的有序访问。
816

被折叠的 条评论
为什么被折叠?



