P and V
上次,我们已经说过死锁的形成原因以及防止方法了,都知道,之所以会发生死锁现象,原因之一是进程执行所申请的资源得不到满足,而陷入无限期的循环等待现象,而在这里我们说的进程其实是并发进程,也就是一组,至少两个进程同时进行。出现了并发进程,随之而来的就是解决并发进程间的资源分配方法,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相关推荐
- linux怎么卸载webpack,安装webpack后,执行webpack -v命令时报错:SyntaxError: Block-sc
安装webpack后,执行webpack -v命令时报错如下: [root@FreeServer ~]# webpack -v /usr/local/node-v4.4.7-linux-x64/lib ...
- 心音数据库_小V云端数据库 | 2020.9.14—2020.9.18
桂花的芬芳 在雨后空气中弥散开来 似为湿润的情绪 赠予了一丝甜蜜 小V云端数据库 2020.9.14-2020.9.18 资讯情报关键词 健康.示范.安全 V宝体检,助力成长 2020年9月14日上午 ...
- 女士细线毛衣起多少针_潇洒帅气的男童V领开襟毛衣编织,带教程图解
终于又完工一件. 用线:宝宝毛9号8团多用针:ADD2.75,3.0成衣尺寸:衣长43cm,胸围72cm,袖长42cm,肩宽32cm编织过程:1,用另线起针法起222针,织双螺纹5cm,排花,织20c ...
- 【实用】几个实用的webstorm、IDEA编辑器窗口快捷键设置,Alt+V垂直复制当前窗口,Alt+Shift+V将当前窗口复制到另一边的分割窗口显示,Alt+Shift+M移动当前活动窗口到另一边
Alt+V垂直复制当前窗口 Alt+Shift+V将当前窗口复制到另一边的分割窗口显示,Alt+Shift+M移动当前活动窗口到另一边
- 基于持久内存的 单机上亿(128B)QPS -- 持久化 k/v 存储引擎
文章目录 性能数据 设计背景 设计架构 Hash 索引结构 及 PMEM空间管理形态 基本API 及 实现 API 初始化流程 写流程 读流程 删除流程 PMEM Allocator设计 主要组件 空 ...
- KVell 单机k/v引擎:用最少的CPU 来调度Nvme的极致性能
文章目录 前言 KVell背景 业界引擎使用Nvme的问题 CPU 会是 LSM-kv 存储的瓶颈 CPU 也会是 Btree-kv 存储的瓶颈 KVell 设计亮点 及 总体架构实现 KVell 设 ...
- 存储引擎 K/V 分离下的index回写问题
前言 近期在做on nvme hash引擎相关的事情,对于非全序的数据集的存储需求,相比于我们传统的LSM或者B-tree的数据结构来说 能够减少很多维护全序上的计算/存储资源.当然我们要保证hash ...
- linux进程间通信:system V 信号量 生产者和消费者模型编程案例
生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...
- linux进程间通信:system V 信号量和共享内存实现进程间同步
关于信号量和共享内存的相关描述已经在前几篇提到过: 信号量:即内核维护的一个正整数,可以使用内核提供的p/v接口进行该正整数的+/-操作,它主要用来表示系统中可用资源的个数,协调各个进程有序访问资源, ...
- linux进程间通信:system V 信号量
文章目录 概念描述 通信原理 编程接口 使用流程 编程案例 概念描述 英文:semaphore 简称SEM,主要用来进行进程间同步 本质:内核维护的一个正整数,可对其进行各种+/-操作 分类:syst ...
最新文章
- JavaScript-原生Array对象方法详解(一)
- mac搭建mongodb
- 有关OVM社区产品经理对OVM的29个问题解答!
- 什么是Hexo?妈妈再也不用担心我的网页编辑能力了
- Java Web整体异常处理
- 老板让我十分钟上手nx-admin
- BZOJ1251序列终结者——非旋转treap
- EXCEL 保护工作表、工作薄不被破坏
- 3dm java32位_3DM游戏运行库合集安装包v2.3
- 艾肯4nano声卡调试教程,效果演示
- android Intent调用地图应用客户端
- 10个方法教你提升表达能力
- C1认证复习材料(参照考纲,任务)
- TIA博途中通过关键字AT实现变量覆盖的具体方法及示例程序
- Python操作word基础
- Selenium自动化测试入门(基于Python)
- CSS3过渡:在2个不同的渐变色之间进行动画处理
- NLTK词性pos_tag的含义
- MySQL鲜为人知的排序方式
- TeXstudio安装和运行
热门文章
- Word文档使用Mathtype如何实现公式自动居中并右对齐编号?
- PHP给title=赋值变量 PHP title弹出字符串拼接变量
- KONICA MINOLTA 423SeriesPS-8打印机驱动
- VR和AR只是入门,真正的元宇宙远不止于此
- Cocos Creator 3.61所有工具软件的使用
- 13、Nepxion Discovery 之 全链路调用链监控
- 如何从iPhone的音乐应用程序中删除Apple Music
- 源支付3.1版本全开源版+店员监控软件+手机监控APP源码
- 网页制作之HTML+CSS布局
- 求质数(素数)的方法