当前位置: 首页 > 编程日记 > 正文

进程的同步、互斥以及PV原语

在处理进程间的同步与互斥问题时,我们离不开信号量和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做为初值,表示当前系统资源只有一个,多个进程需要轮流使用这个资源。

image

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

实现同步模型

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

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


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

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

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

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

image

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

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

image

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

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

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

image

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

image

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

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

参考资料:

1、Process Synchronization PV

2、Linux死锁浅谈

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

4、百度百科PV原语

5、PV原语

6、PV原语解释

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

相关文章:

ListT中,Remove和RemoveAt区别

Remove删除的是匹配的第一项。比如你的list里面有2个相同的项。那么就删除第一个。后面的不删除&#xff0c;找不到元素和删除失败都返回falseRemoveAt是删除索引下的项 转载于:https://www.cnblogs.com/mcyushao/p/9526208.html

vue 如何处理两个组件异步问题_Vue动态异步组件实现思路及其问题

前言&#xff1a;在vue官方资料中&#xff0c;我们可以可以很学会如何通过vue构建“动态组件”以及“异步组件”&#xff0c;然而&#xff0c;在官方资料中&#xff0c;并没有涉及到真正的“动态异步”组件&#xff0c;经过大量的时间研究和技术分析&#xff0c;我们给出目前比…

[转载] 七龙珠第一部——第004话 掳人的妖怪——乌龙

转载于:https://www.cnblogs.com/6DAN_HUST/archive/2013/04/07/3003566.html

如何解决资料下载下来为index.html和PHP文件的问题?

最近很多Down友反映&#xff0c;在下载中心下载资料时&#xff0c;明明是pdf、rar、zip格式的文件&#xff0c;下载完后怎么就变成index.html、php格式的文件了&#xff1f;既浪费了下载豆&#xff0c;文件还不能用&#xff0c;心疼啊&#xff01;这是因为下载系统是动态获取的…

给大家推荐8个SpringBoot精选项目

前言 2017年&#xff0c;曾在自己的博客中写下这样一段话&#xff1a;有一种力量无人能抵挡&#xff0c;它永不言败生来倔强。有一种理想照亮了迷茫&#xff0c;在那写满荣耀的地方。 如今2018年已过大半&#xff0c;虽然没有大理想抱负&#xff0c;但是却有自己的小计划。下面…

点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例...

NotificationManager notificationManager (NotificationManager)getSystemService(NOTIFICATION_SERVICE);Notification notification new Notification(R.drawable.logo_icon_16,"移动营销", System.currentTimeMillis());Intent intent new Intent(Intent.ACTI…

函数返回类的对象与拷贝构造函数

C中&#xff0c;如果我们在一个函数中&#xff0c;定义了一个类的对象&#xff0c;然后返回这个对象&#xff0c;在main函数中用一个对象去接受这个返回的对象的时候&#xff0c;这里面参与的函数调用大家可能不熟悉&#xff0c;这里通过程序和注释的方式给大家讲解一下。编译的…

ai条码插件免安装_ai条码插件2款下载|Barcode Toolbox插件+Barcode条码插件下载 - 偶要下载站...

本次一次性打包两款ai条码插件和大家分享&#xff0c;分别是Barcode Toolbox插件和Barcode脚本插件&#xff0c;支持Illustrator CS5~CC2015的条形码脚本&#xff01;这两个插件不是一个插件&#xff0c;是有区别的两个插件。Barcode Toolbox是AI的一个非常有用的生成条码的插件…

GridView的DataKeyNames属性 转载的

偶今天用到这个了,转载 "事在人为"楼主的,原文地址: http://www.cnblogs.com/andhm/archive/2010/05/07/1730024.html DataKeyNames表示主键的列名&#xff0c;可以通过GridViewEntity.DataKeys[RowIndex]["ColumsName"]来获取他的值&#xff0c;当然它是…

反射 -- 通过字符串操作对象中的成员

getattr()setattr()hasattr()delattr()class C:def __init__(self, name):self.name namedef f(self):return Pythonobj C(Pyhton) get_name getattr(obj, name) get_func getattr(obj, f) get_func() hasattr(obj, name) setattr(obj, age, 10) delattr(obj, name)转载于:…

android默认exported_android:exported 属性详解

转自http://blog.csdn.net/watermusicyes/article/details/46460347昨天在用360扫描应用漏洞时&#xff0c;扫描结果&#xff0c;出来一个Android:exported属性&#xff0c;其实之前根本不知道这个属性&#xff0c;更不知道这个属性用来干嘛的&#xff0c;详情见下图&#xff1…

Chipset

Chipset 芯片组是一组集成电路&#xff08;芯片&#xff09;用于管理计算机处理器、内存和外设的数据流&#xff0c;通常位于主板上。 Northbridge (Memory Controller Hub) 北桥用来处理高速信号&#xff0c;负责CPU、RAM、AGP和PCI Express之间的通信。 Southbridge (I/O Con…

正确设置php-fpm和nginx防止网站被黑

2019独角兽企业重金招聘Python工程师标准>>> 核心总结&#xff1a;php-fpm 子进程所使用的用户&#xff0c;不能是网站文件所有者。 凡是违背这个原则&#xff0c;则不符合最小权限原则。 根据生产环境不断反馈&#xff0c;发现不断有 php网站被挂木马&#xff0c;绝…

一个数字键盘引发的血案——移动端H5输入框、光标、数字键盘全假套件实现...

https://juejin.im/post/5a44c5eef265da432d2868f6 为啥要写假键盘&#xff1f; 还是输入框、光标全假的假键盘&#xff1f; 手机自带的不用非得写个假的&#xff0c;吃饱没事干吧&#xff1f; 装逼&#xff1f;炫技&#xff1f; 宝宝也是被逼的&#xff0c;宝宝也很委屈~.~ …

姿态检测 树莓派_怎样在树莓派上轻松实现深度学习目标检测?

原标题&#xff1a;怎样在树莓派上轻松实现深度学习目标检测&#xff1f;雷锋网按&#xff1a;本文为 AI 研习社编译的技术博客&#xff0c;原标题 How to easily Detect Objects with Deep Learning on Raspberry Pi&#xff0c;作者为 Sarthak Jain。翻译 | 小哥哥 狒狒 校对…

Linux目录读写和可执行权限

一 . 进入目录权限如果我在普通用户下创建了一个目录f1&#xff0c;然后使用chomd u-rwx,g-rwx,o-rwx之后&#xff0c;我在普通用户下想进入f1目录&#xff0c;权限不允许。然后我切换到超级用户下&#xff0c;再次尝试进入到f1目录&#xff0c;这个时候允许进入。然后回到普通…

【译】表变量和临时表的比较(转)

关于表变量是什么&#xff08;和表变量不是什么&#xff09;&#xff0c;以及和临时表的比较让很多人非常困惑。虽然网上已经有了很多关于它们的文章&#xff0c;但我并没有发现一篇比较全面的。在本篇文章中&#xff0c;我们将探索表变量和临时表是什么&#xff08;以及不是什…

grub加密。

一、介绍 安全无小事 linux系统的安全分为很多方面&#xff0c;什么端口啊&#xff0c;什么网络啊&#xff0c;听着都特么烦&#xff0c;今天谈谈最简单明显的密码安全。 二、单用户模式 单用户模式个人觉得相当有用&#xff0c;可以用来修复系统&#xff0c;修改密码…… 但是…

Linux下stat + 文件名后, Access,Modify,Change的含义

我们首先在一个目录下创建了一个文件使用命令touch file然后输入命令&#xff1a;stat file&#xff0c;这个时候会输出一系列信息大家注意红色框中的三个时间Access : 文件最近一次被访问的时间Modify: 文件内容最近一次被修改的时间Change: 文件属性最近一次被改变的时间接着…

基于设计模式的学习之旅-----访问者模式(附源码)

基于设计模式的学习之旅-----访问者模式 1、初始访问者模式 2、什么是访问者模式 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 3、模式结构图 4、模式代码事例 场景&#xff1a;年会&#xff0c;每个小组表演…

x is y python_Python 基础

2.1 程序与用户交互在python3中#input&#xff1a;无论用输入何种类型&#xff0c;都会存成字符串类型nameinput(please input your name:) #name18print(id(name),type(name),name)在python2中#raw_input与python3的input是一样的nameraw_input(please input your name:)print…

【leetcode 简单】 第八十九题 赎金信

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串&#xff0c;判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成&#xff0c;返回 true &#xff1b;否则返回 false。 (题目说明&#xff1a;为了不暴露赎金信字迹&#xff0c;要从杂…

创建专属博客栏目

今天给大家get新技能了&#xff0c;是不是很期待捏我们一般看到的博客页面是这样的但是你是不是特别期待这样的捏其实技术上面也不是特别的 难&#xff0c;我们登录自己的csdn博客&#xff0c;然后选择“管理博客”&#xff0c;跳转页面之后选择“博客栏目”进入到这个页面之后…

《帝企鹅日记》观后感

第一次看到是在高中的英语周报上&#xff0c;那时候蛮好奇的&#xff0c;企鹅也写日记&#xff0c;呵呵&#xff0c;后来想了想应该是纪录片&#xff0c;时隔三年&#xff0c;发现当初的猜测果然不假。 我觉得那些企鹅很可爱&#xff0c;也很漂亮。最重要的是&#xff0c;那一条…

合并道路_资质改革已经确定!盘点被合并的资质!有这资质的要注意了

资质改革可以说是在行业里掀起了轩然大波&#xff0c;众多资质面临改革&#xff0c;有的资质被取消&#xff0c;有的资质被合并&#xff0c;有的资质继续保留。此文就带大家来盘点一下那些在近期资质定稿中被取消&#xff0c;被改变的资质&#xff1a;勘察资质勘察资质中&#…

如何为ccflow工作流引擎增加一个优先级PRI?

为什么80%的码农都做不了架构师&#xff1f;>>> 如何为ccflow工作流引擎增加一个优先级PRI&#xff1f; 对于一条流程的优先级可分为 低&#xff0c;中&#xff0c;高三个级别&#xff0c;用这个状态来标示这条流程的紧急程度。 以以前版本的ccflow中是以节点表…

SQL Server (MSSQLSERVER) 服务因 2148081668 服务性错误而停止。

https://zhidao.baidu.com/question/151448005.html 具体步骤&#xff1a;运行-> 输入&#xff1a;“services.msc” ->找到 “SQL Server (SQLEXPRESS)” 服务&#xff0c;双击 -> 在“SQL Server (SQLEXPRESS) 的属性”界面&#xff0c;点登录 -> 默认登录身份是…

面试题--特别是字节对齐

来源&#xff1a;http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html 【1】设置或者清除某位。 示例代码如下: 1 #include<iostream>2 using namespace std;3 4 #define BIT3 (0x1<<3)5 6 void Set_bit3(int &a)7 {8 a|BIT3;9 } 10 11…

vim基础入门

一. vim的三种模式在Linux操作系统下&#xff0c;我们一般会使用vim进行文本编辑&#xff0c;它相当于Windows下的记事本&#xff0c;但是它比记事本的功能强大的多。vim一般有三种模式分别是普通模式&#xff0c;编辑模式和命令模式。普通模式和编辑模式可以来回的切换&#x…

python html解析查找字符串_用python的BeautifulSoup分析html

序言之前用python爬取网页的时候&#xff0c;一直用的是regex或者自带的库sgmllib里的SGMLParser。但是遇到复杂一点的情况时&#xff0c;SGMLParser往往就不那么给力了&#xff01;(哈&#xff0c;难道说我 too native了&#xff1f;毕竟beautifulSoup是继承sgmlparser的么~)所…