上次,我们已经说过死锁的形成原因以及防止方法了,都知道,之所以会发生死锁现象,原因之一是进程执行所申请的资源得不到满足,而陷入无限期的循环等待现象,而在这里我们说的进程其实是并发进程,也就是一组,至少两个进程同时进行。出现了并发进程,随之而来的就是解决并发进程间的资源分配方法,PV操作

首先我们说一下定义:

1、p操作和v操作都是原语,即不可中断的过程。他们是对信号量进行操作

2、P操作:将信号量(定为S)S减去1,若结果小于0,则把调用P(s)的进程置成等待信号量S状态

3、V操作:将信号量S加1,若结果不大于0,则释放一个等待信号量S的进程。

4、相关临界区:并发进程中涉及到相同变量的那些临界区。(进程间所要使用的变量集的交合点)

5、信号量:通俗的理解就是相关临界区内的资源容纳量。

首先我们认识一下信号量,就拿我们这张图来说吧来说吧

在这里,我们完全可以把重心的白色的盘子看作是临界区,心形糕点就是人们需求的资源,也就是信号量=2,从其中我们可以明明白白的看到一个盘子,两个糕点,所以我们怎么定义呢?

信号量 S=2

可是这明摆着有ABCD四只饿鬼,是典型的狼多肉少啊,怎么办呢?

就是我们的PV操作了。

首先,我们已经定义好信号量s了所以,假如我们按顺序从A开始算的话

如以下表

人员

信号量值

未分配时

2

A

1

B

0

C

-1

D

-2

就和上边表里一样,也就是AB有的吃,CD没得吃,因为资源被AB吃掉了。

接下来,我们认识PV操作:

还拿上边那张图来说,假设厨房还在一直做糕点,一直不断地往盘子里补充,而ABCD也还在一直不断地吃,那又该有什么情况发生呢?

1、当盘子满了之后,厨房师傅就不能再继续往里加了,只能等到盘子有空余地方的时候,才能继续放

2、当盘子里的糕点被吃完而厨房孩没有及时补充的时候,饿鬼们就不能吃了,只能等着,一直到盘子里又有糕点后才能吃

这样,条件就设定好了,又该如何进行呢?

begin

S;semaphore;                定义信号量

S=4;

cobegin

----------------------------------------------------------------------------------------------

Process A

Begin

L1:看盘子;

P(s);   检查盘子里又没有糕点呢?当S不小于0时,就证明有, 然后A就可以拿,可以吃了

吃糕点;

V(s);吃了糕点后,释放盘子的空间,告诉厨师,你可以放了

go to L1;

end;

----------------------------------------------------------------------------------------------

Process B

Begin

L2:看盘子;

P(s); 检查盘子里又没有糕点呢?当S不小于0时,就证明有, 然后A就可以拿,可以吃了

吃糕点;

V(s);吃了糕点后,释放盘子的空间,告诉厨师,你可以放了

go to L2;

end;

----------------------------------------------------------------------------------------------

Process C

Begin

L3:看盘子;

P(s);检查盘子里又没有糕点呢?当S不小于0时,就证明有, 然后A就可以拿,可以吃了

吃糕点;

V(s);吃了糕点后,释放盘子的空间,告诉厨师,你可以放了

go to L3;

end;

----------------------------------------------------------------------------------------------

Process D

Begin

L4:看盘子;

P(s);检查盘子里又没有糕点呢?当S不小于0时,就证明有, 然后A就可以拿,可以吃了

吃糕点;

V(s);吃了糕点后,释放盘子的空间,告诉厨师,你可以放了

go to L4;

end;

----------------------------------------------------------------------------------------------

就上面的这个做法,存在一个问题,那就是如果ABCD同时看向盘子,而盘子里却只有一个糕点时,ABCD的信号量都表示为1,可是谁吃呢?这个就是并发进程里面的弊端,与时间有关的错误。这种问题十分常见于互斥性质的并发进程中。

为了改善上面的这个问题,我们把它改一下,改成同步性质的并发进程,同步的,主要体现在进程之间的信息交互上,一种依赖关系

条件:按顺序来,ABCD按顺序吃糕点

begin

S,S1,S2,S3,S4;semaphore;                定义信号量

S=4,S1=1,S2=0,S3=0,S4=0;

cobegin

----------------------------------------------------------------------------------------------

Process A

Begin

L1:看盘子;

P(s);   检查盘子里又没有糕点呢?当S不小于0时,就证明有, 然后A就可以拿,可以吃了

P(s1);

吃糕点;

V(s);吃了糕点后,释放盘子的空间,告诉厨师,你可以放了

V(s2);告诉B,自己吃完了,你可以吃了

go to L1;

end;

----------------------------------------------------------------------------------------------

Process B

Begin

L2:看盘子;

P(s);   检查盘子里又没有糕点呢?当S不小于0时,就证明有, 然后A就可以拿,可以吃了

P(s2);

吃糕点;

V(s);吃了糕点后,释放盘子的空间,告诉厨师,你可以放了

V(s3);告诉C,自己吃完了,你可以吃了

go to L2;

end;

----------------------------------------------------------------------------------------------

Process C

Begin

L3:看盘子;

P(s);   检查盘子里又没有糕点呢?当S不小于0时,就证明有, 然后A就可以拿,可以吃了

P(s3);

吃糕点;

V(s);吃了糕点后,释放盘子的空间,告诉厨师,你可以放了

V(s4);告诉D ,自己吃完了,你可以吃了

go to L3;

end;

----------------------------------------------------------------------------------------------

Process D

Begin

L4:看盘子;

P(s);   检查盘子里又没有糕点呢?当S不小于0时,就证明有, 然后A就可以拿,可以吃了

P(s4);

吃糕点;

V(s);吃了糕点后,释放盘子的空间,告诉厨师,你可以放了

V(s1);告诉A,自己吃完了,你可以吃了

go to L4;

end;

----------------------------------------------------------------------------------------------

就这样,有互斥转为同步,他们之间就会按顺序吃饭,不会争夺,也不会吵架,按部就班,而他们之间呢,主要是信息的交互,我吃了告诉你,然后你就去吃就行了,没有打架的理由啊!

本人相对于各位大牛纯属菜鸟级别,对于这片文章大家还有什么不明白或不理解的或者是有建议或者意见的,可直接找我,也可以发我邮箱18333617223@163.com,欢迎指教

P and V的更多相关文章

  1. J a v a 的“多重继承”

    接口只是比抽象类“更纯”的一种形式.它的用途并不止那些.由于接口根本没有具体的实施细节——也就是说,没有与存储空间与“接口”关联在一起——所以没有任何办法可以防止多个接口合并到一起.这一点是至关重要的 ...

  2. Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V

    在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...

  3. [Erlang 0118] Erlang 杂记 V

       我在知乎回答问题不多,这个问题: "对你职业生涯帮助最大的习惯是什么?它是如何帮助你的?",我还是主动回答了一下.    做笔记 一开始笔记软件做的不好的时候就发邮件给自己, ...

  4. v$session中server为none与shared值解析

    查询V$SESSION,你会看到SERVER可能会有DEDICATED| SHARED| PSEUDO| NONE 四种值,如果SERVER字段的值除了DEDICATED,还有NONE,则说明当前实例 ...

  5. 引用js或css后加?v= 版本号的用法

    <span style="font-size:14px;">css和js带参数(形如.css?v=与.js?v= 或 .css?version=与.js?version ...

  6. 操作系统中的P,V操作(转)

    无论是计算机考研.计算机软件水平考试.计算机操作系统期末考试还是其他计算机岗位考试,P.V原语操作都是一个常考点.下面笔者总结了关于P.V操作的一些知识. 信号量是最早出现的用来解决进程同步与互斥问题 ...

  7. 关于P,V操作理解的突破,关于并发设计与并行

    今天又找了一篇博客研究P,V操作.. 发现..它有一个变量没有声明.. 我就换了篇博客..http://c.biancheng.net/cpp/html/2600.html 然后就看懂了.. 关键突破 ...

  8. XV Open Cup named after E.V. Pankratiev. GP of Tatarstan

    A. Survival Route 留坑. B. Dispersed parentheses $f[i][j][k]$表示长度为$i$,未匹配的左括号数为$j$,最多的未匹配左括号数为$k$的方案数. ...

  9. XVII Open Cup named after E.V. Pankratiev. GP of SPb

    A. Array Factory 将下标按前缀和排序,然后双指针,维护最大的右边界即可. #include<cstdio> #include<algorithm> using ...

  10. XVI Open Cup named after E.V. Pankratiev. GP of Ukraine

    A. Associated Vertices 首先求出SCC然后缩点,第一次求出每个点能到的点集,第二次收集这些点集即可,用bitset加速,时间复杂度$O(\frac{nm}{64})$. #inc ...

随机推荐

  1. 导入安全证书到jdk步骤详细说明-原

    一.首先要在浏览器打开需要证书的网站,然后把证书下载下来,保存的证书名称随意命名,只要保证唯一性(这个唯一性下文有解释) 二.然后把证书复制到%JAVA_HOME%/jre/bin/路径下,即保证证书 ...

  2. Scheme笔记(1)

    (define pi 3.14159) (define radius 10) (* pi (* radius radius)) (define circumference (* 2 pi radius ...

  3. 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.

    在网上看到过一个面试题,感觉挺有意思,看别人的代码写的逻辑不够谨慎,重写了一个,较真了又... package com.array7.algorithm; public class Algorithm ...

  4. HLG2040二叉树遍历已知前中,求后

    二叉树的遍历 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 60(34 users) Total Accepted: 34(30 us ...

  5. Python fopen,open,和popen的区别

    1.  fopen     打开普通文件 带缓冲区撒点粉撒点粉阿桑地方 缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符.字符串.格式化数据,也可以读写二 ...

  6. RPM软件包管理的查询功能

    以后大家升级rpm包的时候,不要用Uvh了! 我推荐用Fvh 前者会把没有安装过得包也给装上,后者只会更新已经安装的包   总结:未安装的加上小写p,已安装的不需要加p   查询q    rpm {- ...

  7. C++类编程(一)const的使用

    设计类时,考虑以下五点 1.构造函数初始化列表 2.函数该不该加const 3.参数传递尽量考虑用引用传递,考虑加不加const 4.返回用不用引用 5.数据尽量放在private,函数尽量放在pub ...

  8. java类的封装 继承 多态

    1.猜数字小游戏 package cn.jiemoxiaodi_02; import java.util.Scanner; /** * 猜数字小游戏 * * @author huli * */ pub ...

  9. git无法clone远程代码库及git代理设置

    git作为一个版本管理神器,日常工作中自然也就少不了了:特别是Android开发,github和google是逃不过的了.然而很多时候需要用到git克隆远程的代码库,众所周知的原因google.and ...

  10. swift 中delegate的使用

    今天写了delegate,遇到以下问题: 这里protocol的写法有问题,如果delegate指向一个实现了某个协议对象的引用,在oc里是这样写delegate的类型 id<protocol& ...