从最初接触PV操作,到有些许理解时候的赞叹,但是具体问题下,自己并不能做到顺畅的分解出问题中的进程与进程之间交织的关系。虽然作者在书中很清晰的总结了一些判断标准。

需要处理的关系只有两种:同步和互斥。
互斥的问题尤其简单,只是设置一个变量mutex,令其初值为1。每个进程进来前先P一下,表示想要用临界区,从临界区出来就要V一下,重置mutex为1。
对于同步问题也并不太难,只需要用变量表示同步进程中间传递的资源数目。这是一个有向图的模型,经常可以用一个看似复杂的有向图的前驱模型来显示PV操作的使用。最简单的便是:从A->B,假设A->B之间设置的信号量是a,那么:A结束后就要V(a),表示V一下a,B在启动之前,首先要P(a),表示P一下a.这样对一个变量的P、V分散在两个进程间,像是在茫茫人海,各执一个信物,表示一种微妙的联系,这个联系叫同步。

还是拿经典的生产者–消费者问题来深入解释。

在生产者–消费者问题中,很容易理解的是对缓冲区的互斥访问,我们设置一个信号量mutex = 1,表示初始可用数为1.
对我来说,我还能体会到第一次看到设置两个信号量:full和empty分别表示空闲缓冲区和满缓冲区的时候,很不理解。
总是以为:full和empty是可以相互推导的关系,何必要设置两个呢?

事实上,这个认识直到现在才真的被打破。我一直忽略了,这里设置两个变量的出发点是我们刚说的A->B这个例子。

这里假设生产者进程是A,消费者进程是B,那么A和B之间的关系除了互斥访问缓冲区外,还有两个同步关系:A->B 和 B->A。

因此必须有两个信号量来表现这两个关系。

那么这两个信号量是什么呢?
A->B ,这里生产者进程结束后,V的是什么呢?V的是生产的东西对吧!所以设计一个full表示缓冲区中已经有的东西,刚好到B准备启动的时候,先P一个full。
同理,B->A,消费者进程消费结束后,需要V一个什么?V的是它用过的空壳子吧!所以设计一个empty来表示缓冲区的空白,在A启动时,先P一下empty。

由此分析,问题就很明确了。

但是或许你会问,怎么推出来的有两道同步关系呢?

既然A和B是面对缓冲区进行的,并没有直接接触,哪里来的同步关系?

这个问题需要看的角度应该是这样的:如果A和B之间没有这两道同步关系,A不管缓冲区空不空,直接生产,B也不管缓冲区有没有东西,直接消费,这样没有限制,一定是混乱的。有一种原则在告诉我们,如果A和B想要进行下去一定是互相牵制的。缓冲区不过是两者之间的一个媒介罢了,真正的关系还是A和B之间。

semaphore mutex = 1;
semaphore empty = n;
semaphore full = 0;producer()
{while(1){生产一个;P(empty);P(mutex);放到缓冲区; //访问临界区V(mutex);V(full);}
}consumer()
{while(1){P(full);P(mutex);从缓冲区取出一个; //访问临界区V(mutex);V(empty);}
}

以上。

对PV操作问题的理解综合相关推荐

  1. 进程管理之PV操作的个人理解

    在了解PV操作之前,我认为有必要先简单理解进程的状态与其之间的转换. 三态模型(图左)中最基本的三个状态:运行.等待和就绪. 运行:进程正在处理机上运行.对于单处理机系统,处于运行状态的进程只有一个. ...

  2. 简单理解操作系统中的PV操作

    可以这样理解: 临界区门前有棵树 用来挂红灯 进程想进CPU的门 先得上树取下盏灯(调用一次P) 取下一个去敲门(S=S-1) 如果树上没有灯取(S<=0) 树说暂时欠你一盏灯(S为负时) 进程 ...

  3. 关于PV操作和信号量临界值的一些理解

    进程通常分为就绪.运行和阻塞三个工作状态.在编写需要使用资源的异步程序时,由于资源占用导致的进程三个状态之间的转换就是靠PV操作来控制的.PV操作主要就是P操作.V操作和信号量.其中信号量起到了至关重 ...

  4. 信号量机制与PV操作的理解

    目录 基本概念 PV操作处理相关问题 正确理解信号量机制 基本概念 信号量机制是一种有效的进程同步和互斥工具.信号量有整形信号量.记录型信号量.二进制信号量等.常用整型信号量实现PV操作.P操作表示申 ...

  5. java中的pv操作,PV操作简单理解

    进程通常分为就绪.运行和阻塞三个工作状态.三种状态在某些条件下可以转换,三者之间的转换关系如下: 进程三个状态之间的转换就是靠PV操作来控制的.PV操作主要就是P操作.V操作和信号量.其中信号量起到了 ...

  6. java pv操作_理解同步的PV操作

    PV操作是Edsger Dijkstra提出的一种经典的解决同步不同执行线程的问题的方法,这种方法是基于一种叫信号量的特殊变量来实现的. 简单理解为就是通过共享变量+信号量实现的一种同步机制,其应用与 ...

  7. 操作系统中的P-V操作(转)

    信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信号量的变量及对它进行的两个原语操作.信号量为一个整数,我们设这个信号量为:sem.很显然,我们规定在sem大于等于 ...

  8. 操作系统pv操作学习总结

    PV操作 PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思. 目录 1 简介 2 详细资料 3 解释 ▪ 信号量的概念 ▪ 典型理解偏差 简介 1962年,狄克斯特拉离开数学中心进入位于 ...

  9. 系统架构设计师考试知识点整理-3:信号量与PV操作

    出现场景 进程之间会出现互斥和同步两种关系.为了处理这两种情况,提出信号量和PV操作. 1.信号量:是一种特殊的变量,变现形式是一个整型S和一个队列. 2.P操作:S=S-1,若S<0,进程暂停 ...

最新文章

  1. Map接口及其常用方法
  2. opencv java match_Java OpenCV-从knnMatch提取匹配项
  3. Git的学习与使用(一)——Git 与 SVN 区别
  4. 设置默认Browser
  5. goaccess-nginx日志分析工具简介
  6. 内是不是半包围结构_轻钢别墅的体系结构
  7. 我的AJAX 学习系列文章
  8. 7.Hibernate查询
  9. 如何从iPhoto检索丢失的照片?
  10. 802.11 对于multicast 和 broadcast的处理
  11. union all关联两个不相关的表,按时间排序
  12. es6 将字符串转换为json_ES6中Json、String、Map、Object之间的转换
  13. Java入门教程——下载JAVA
  14. android简单日记案例,android日记本实现源代码
  15. Docker学习中文文档大全、dockerdocker-compose实战
  16. java与模式孙悟空_设计模式之原型模式 - chenxkang的个人空间 - OSCHINA - 中文开源技术交流社区...
  17. vscode中输入感叹号无法识别html模板
  18. Windows10 微软拼音 翻页按键 设置
  19. 如何删除360奇安信软件
  20. 持安科技CEO何艺:零信任在实战攻防演练中的价值

热门文章

  1. visual studio 删除附加项
  2. Git 使用方法(一)-本地篇
  3. array函数参数 scala_3小时Scala入门
  4. voms下的反射大师_晓星说数学:让数学家折服的艺术大师埃舍尔
  5. mysql的数据层基类_C# 基于MySQL的数据层基类(MySQLHelper)
  6. NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python)
  7. 安装Windows版C / GCC编译器
  8. python冒泡循环示例_Python循环示例–循环在python中
  9. 自定义iOS UIPickerView
  10. java 合并两个列表_如何在Java中合并两个列表?