在处理进程间的同步与互斥问题时,我们离不开信号量和PV原语,使用这两个工具的目的在于打造一段不可分割不可中断的程序。应当注意的是,信号量和PV原语是解决进程间同步与互斥问题的一种机制,但并不是唯一的机制。

信号量:

信号量的概念1965年由著名的荷兰计算机科学家 Edsger Wybe Dijkstra 艾兹格·迪科斯彻 提出。

其核心思想是用一种新的变量类型(Semaphore)来记录可用资源的数量。有两种实现方式:

1、Semaphore的取值必须大于或等于0。0表示当前已经没有空闲资源,而正数表示当前空闲资源的数量;

2、Semaphore的取值可正可负,负数的绝对值表示正在等待进入临界区的进程个数;

信号量是一个二元组(S,Q)。S是一个具有非负初值的整型变量,Q是一个初始状态为空的队列。

PV原语

P原语:P是荷兰语Proberen(测试)的首字母。为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另一个进程唤醒它。具体操作为:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程被阻塞。

V原语:V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,他有一个参数表,存放着等待被唤醒的进程信息。具体操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒。

表示方法

P(S):表示将信号量S的值减一,即S=S-1;如果S>=0,则该进程继续执行,否则该进程置为等待状态,排入等待队列(队列Q)。

V(S):表示将信号量S的值加一,即S=S+1;如果S>0,则该进程继续执行,否则释放队列(Q)中第一个等待信号量的进程。

实现互斥模型

在互斥模型中,多个进程对可用资源进行争用,使用信号量S表示可用资源的数量。一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S<=0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。

如下表所示,我们使用S=1做为初值,表示当前系统资源只有一个,多个进程需要轮流使用这个资源。

在互斥模型的问题中,关键的问题在于使用PV操作来保证有限的系统资源被正常的使用和释放,而不是多人争抢谁都抢不到,或者某人独占而不释放的情况。有点类似于北京现在的摇号制度,实际上资源就是两万个号牌,每个申请的人都执行了一次P操作,表示自己想要使用资源,在摇号结果出来之前没有资源可用,大家都进入Q队列等候,放号之时,获得资格的用户执行V操作,释放一个等待位置,其他人可以进入下一次的排号等候队列。

实现同步模型

所谓同步,是指多个相互合作的进程,在一些关键点上可能需要相互等待或相互交换信息,这种互相制约的关系称为进程同步。例如系统中有两个合作的进程,他们共用一个单缓冲区。这两个进程一个是计算进程,负责对数据进行计算;另一个为打印进程,负责对计算结果进行打印。当计算进程没有计算完毕,计算结果没有送到缓冲区的时候,打印进程就不能打印。一旦计算进程把计算结果送入缓冲区,就应该给打印进程发送一个信号,打印进程收到信号后就可以从缓冲区中取出计算结果进行打印。

之前我在想这个同步模型的时候,考虑可以使用定时轮询的方式,计算进程定时查询缓冲区,可用即开始写入;打印进程定时查询缓冲区,有内容即开始打印。但是这种没有相互合作沟通的方式,非常容易出现问题,比如计算进程内容还没有写完,打印进程就开始读取打印,造成分页的不正确或者数据的不完整。实际上,一般我们都会有多个计算进程,这种情况下就会同时存在资源争用的问题。


进程同步是进程之间直接的相互作用,是合做进程间有意识的行为。与互斥模型不同,进程同步时的信号量只与制约进程、被制约进程有关而不是与所有的同类并发进程有关,所以同步模型中的信号量为私有信号量。

生产者-消费者模型是同步模型的典型代表,其也存在多种情况,分别叙述如下:

1、一个生产者,一个消费者,共用一个缓冲区。

定义两个同步信号量,生产者需要一个EMPTY信号量来判断当前是否能够写入,设置初值为1,消费者需要一个FULL信号量,来判断当前是否能够读取,设置初值为0。

2、一个生产者,一个消费者,共用N个缓冲区。

与上面的例子不同的是,EMPTY的初值为N,则生产者的阻塞时间会减少很多。

3、多个生产者,多个消费者,共用N个缓冲区。

在这种场景下,除了同步之外,还需要在生产者之间、消费者之间进行互斥的访问缓冲区,所以需要设置四个信号量,分别是EMPTY、FULL、生产者之间的互斥信号量Mutex1、消费者之间的互斥信号量Mutex2。

非生产者、消费者模型的例子有一个司机和售票员的。设置RUN信号量供司机判断是否应该开车,初始值为0;设置STOP信号量供售票员判断是否可以开门,初始值为0。描述如下:

前驱图(Precedence Graph)是一种有向无循环图,记为DAG(Directed Acyclic Graph),用于描述进程间执行的前后关系。如下图:

图中的每个结点可用于描述一个进程段或进程,乃至一条语句;结点间的有向边则用于表示两个结点之间存在的偏序(Partial Order)或前驱关系。可以使用PV原语,来描述前驱图。

PS:互斥的问题可以用硬件方法解决,如何解决,不太清楚。

参考资料:

1、Process Synchronization PV

2、Linux死锁浅谈

3、Linux的多线程编程的高效开发经验

4、百度百科PV原语

5、PV原语

6、PV原语解释

7、PV原语实现进程的同步与互斥

进程的同步、互斥以及PV原语相关推荐

  1. 十二、进程的同步与互斥

    一.知识总览 主要是讲解进程的同步互斥问题:即什么是进程同步,什么是进程互斥. 二.什么是进程同步 1.进程具有异步性的特征.异步性是指,并发执行的进程以各自独立的.不可预知的速度向前推进.而进程同步 ...

  2. python 同步 互斥 信号量 锁 简介

    目录 进程间的信号 信号量(信号灯) 进程的同步互斥 Event事件 Lock 锁 进程间的信号 信号是唯一的异步通信方法 一个进程向另一个进程发送一个信号来传递某种信息,接受者根据传递的信息来做相应 ...

  3. Skr-Eric的网络编程课堂(八)-- 信号通信、信号量、进程的同步互换和Lock锁

    信号通信 一个进程向另一个进程发送一个信号来传递某种讯息,接受者根据接收到的信号进行相应的行为 kill -l   查看系统信号 kill  -sig  PID   向一个进程发送信号 关于信号 信号 ...

  4. pv原语,生产者-消费者等同步互斥问题

    1.问题描述:一组生产者进程和一组消费者进程共享一个初始为空.大小为n的缓冲区,只有缓冲区没满时,生产者才能把消息放入缓冲区,否则必须等待:只有缓冲区不空时,消费者才能从中取出消息,否则必须等待.由于 ...

  5. 【中级软考】PV操作是什么?(passeren【通过、申请资源、减量】、vrijgeven【释放、释放资源、增量】【荷兰文】)(用于进程间同步)

    PV操作是一种实现进程互斥与同步的有效方法.PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思. PV操作是典型的同步机制之一.用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望 ...

  6. 用信号量解决进程的同步与互斥

    转自:http://www.cnblogs.com/whatbeg/p/4435286.html 现代操作系统采用多道程序设计机制,多个进程可以并发执行,CPU在进程之间来回切换,共享某些资源,提高了 ...

  7. 进程的同步和互斥反映了_用信号量解决进程的同步与互斥探讨【持续更新】

    现代操作系统采用多道程序设计机制,多个进程可以并发执行,CPU在进程之间来回切换,共享某些资源,提高了资源的利用率,但这也使得处理并发执行的多个进程之间的冲突和相互制约关系成为了一道难题.如果对并发进 ...

  8. 信号量解决进程的同步和互斥

    转自:http://www.cnblogs.com/whatbeg/p/4435286.html 现代操作系统采用多道程序设计机制,多个进程可以并发执行,CPU在进程之间来回切换,共享某些资源,提高了 ...

  9. 用信号量解决进程的同步与互斥探讨【持续更新】

    现代操作系统采用多道程序设计机制,多个进程可以并发执行,CPU在进程之间来回切换,共享某些资源,提高了资源的利用率,但这也使得处理并发执行的多个进程之间的冲突和相互制约关系成为了一道难题.如果对并发进 ...

最新文章

  1. Python进程池,线程池,协程池
  2. python正则表达式模块
  3. 神策数据荣获北京市广播电视局优秀推荐项目
  4. python矩阵运算numpy_Python Numpy中的几个矩阵乘法
  5. app pay开发遇到的坑
  6. angular依赖注入_Angular依赖注入简介
  7. python产品发布会_【Mac系统 + Python + Django】之开发一个发布会系统【Django模型(三)】...
  8. python向量化编程技巧_神经网络基础之Python与向量化
  9. 7-160 验证“哥德巴赫猜想” (20 分)
  10. 非名校学生如何进入一二线互联网公司
  11. 简单读取winfrom资源文件
  12. [代码审计]云优cms V 1.1.2前台多处sql注入,任意文件删除修复绕过至getshell
  13. HaaS EDU K1设备资源总体介绍
  14. linux 安装qq2014,Ubuntu14.04安装wine QQ
  15. 纯HTML+CSS实现3D炫酷魔方(相册)
  16. springboot毕设项目商城积分兑换系统pez18(java+VUE+Mybatis+Maven+Mysql)
  17. win8.1系统中迅雷看看闪退问题
  18. 电脑如何设置uefi启动 电脑设置uefi启动方法
  19. HANA 如何创建XS Job来完成定时任务
  20. Java模拟实现ATM系统

热门文章

  1. Java项目:平行志愿管理系统(java+Springboot+Maven+mybatis+Vue+Mysql)
  2. 龙岩学院和三明学院计算机专业,龙岩学院和三明学院哪个比较好?
  3. html无序列表空心圆_列表样式的使用CSS入门基础(018)
  4. java中的分页 效率考虑_面试官:数据量很大,分页查询很慢,有什么优化方案?...
  5. java 匿名类调用方法_java – 从匿名类调用新定义的方法
  6. linux源码编译安装nginx
  7. Windows环境下启动Mysql服务提示“1067 进程意外终止”的解决方案
  8. 写一篇C语言入门第一讲
  9. js 使用 Lawnchair 存储 json 对象到本地
  10. 你需要的大概不是 enumerated