CHS_04.2.1.5+进程通信

CHS_04.2.1.5+进程通信

  • 进程通信
    • 为什么进程通信需要操作系统支持?
    • 共享存储
    • 消息传递
    • 消息传递(间接通信方式)
    • 进程通信——管道通信
  • 知识回顾与重要考点

进程通信

在这里插入图片描述

在这个小节中 我们会学习进程间通信的几种方式 分别是共享 存储 消息传递 还要管道通信

那进程之间的通信指的就是两个或者多个进程之间产生了数据交互

为什么进程通信需要操作系统支持?

在这里插入图片描述

在一个系统当中 可能会同时存在多个进程 多个进程都在运行

那这些进程之间难免需要相互配合着工作 在这种情况下 进程和进程之间的这种通信 数据通信就显得很有必要了

比如说当我们在玩微博的时候 可能你会看到一篇某明星的八卦 对吧

一个吃瓜的文章 你想把这个文章分享给你的微信好友 那你是不是可以直接使用微博这个

这个应用里面内置的一个分享功能 然后把这个吃瓜文分享给你的微信好友

那可以看到 在这个过程当中 其实就已经发生了进程之间的通信了 本来这个吃瓜文的链接

是在微博这的 让你直接用微博的这个分享功能直接就把这个吃瓜文的链接分享到了微信这

所以 这个过程显然是进程和进程之间发生了这种数据交互也就发生了通信

那既然我们进程之间的通信是很有必要的 那么进程之间的通信应该如何实现呢

这个需要操作系统的支持 需要操作系统的支持好 那为了探究这个问题 我们首先要聊清楚为什么这个进程之间的通信一定要有操作系统内核的支持

原因是这样的 我们系统当中给各个进程分配内存地址空间的时候

各个进程的这个内存地址空间是相互独立的 比如 进程p它可以访问自己的空间 进程q可以访问自己的空间 但是进程p 它不可以访问进程q的地址空间

啊 这么规定是出于安全的考虑 因为你想一下 如果一个进程可以随意的访问其他进程的这个内存地址空间

那么一个进程是不是就可以随意修改其他进程的数据了 或者随意的读取其他进程的数据

那这样的话 你想一下 你的手机里面不知道什么时候安装了一个一个什么垃圾软件 对吧

然后这个垃圾软件 这个垃圾软件如果他可以随意的访问你的其他进程的地址空间 那有可能他直接把你微信里的一些私密的聊天数据或者一些私密的什么照片之类的直接就给你读走了对吧

那这显然是很很危险的 不安全的 因此出于这种安全的考虑 各个进程只能访问自己的这一片内存地址空间 而不能访问其他进程的内存地址空间 无论是读或者写数据都不行

好 因此 如果两个进程p和q 他们之间需要进行数据交互 需要进行进程之间的通信

那么 显然进程p是不可能直接把这个数据写到q的这片空间里面的

所以由于进程不可以直接访问其他进程的这个空间 因此就必须要有操作系统的支持 才可以完成进程之间的通信

才可以完成进程之间的通信好 那我们接下来会介绍三种进程之间的通信方式 分别是共享存储

消息传递还有管道通信 首先 我们来看共享存储这种进程间通信的机制

共享存储

在这里插入图片描述

共享存储的原理是这样的 各个进程只能访问自己的这片空间 但是

如果操作系统支持共享存储的这种这种功能的话 那么一个进程

他可以申请一片共享存储区 而这片共享存储区也可以被其他进程所共享

这样的话 一个进程p 如果他要给q传送数据的话 那么p是不是就可以先把数据写到这一片共享存储区里面
因为他对这片区域是由访问权限的 然后接下进程q再从这片区域里面读出数据
读数据是不是就ok了啊 所以由于这个共享存储区可以被多个进程所共享
因此 这些进程之间的数据交换就可以通过这一片被共享的区域来进行

那这就是共享存储的进程间通信方式 比如像Linux操作系统当中 大家可以去上网搜一下

如何实现共享存储呢 首先 一个进程 比如说进程p和q 他们想要通信

那么 发起通信的这个进程p 它可以使用是m map使用这个系统调用

来申请一片共享内存区 也就黄色的这片区好 接下来进程p

和进程q都需要使用map 使用这个系统调用把这一片存储区域映射到自己的虚拟地址空间当中

现在大家还不知道什么叫虚拟地址空间 等大家学到第三章的时候 再回头看这个部分 可能会更清晰一些

如果用第三章我们要学习的内容来解释的话 相当于调用了map这个函数之后

进程的页表项或者段表项就会增加一项

然后这个页面或者这个段就可以映射到 就可以映射到刚才申请的这片共享存储区

那这样的话 各个进程的虚拟地址空间当中都包含了这个共享存储区 他们都可以访问这一篇共享存储区

好 那这个部分大家学到第三章之后再回来看可能会更清晰一些 总之只需要简单的加一个页表项或者段表项

就可以完成这种共享内存区的映射这个事情了好 另外 还需要注意一个问题 如果多个进程都往这片区域写数据的话

是不是有可能会导致写冲突啊 比如进程p 他正在往这片区域写

那进程q也往这一片写 那是不是就有可能导致数据覆盖的问题啊 好 所以各个进程他们之间如果使用共享存储的方式来进行通信的话
那么 需要保证各个进程对这个共享存储区的访问是互斥的
应该保证他们对这片区域的访问是互斥的

也就是 当进程p正在访问这片区域的时候 那其他进程就不能访问这片区域

那怎么实现这个互斥的功能呢 操作系统内核会提供一些同步护制工具 比如说我们在2 3那个部分 2 3那个部分会学习p为操作

pv操作就是操作系统会提供的这种同步互斥的工具 所以各个进程 各个进程 他们可以用类似于pv操作这种机制来实现

对共享存储区的一个互斥的访问 那具体的 大家可以学了2 3那个小节之后再回头来理解这句话

好 总之 各个进程对共享存储区的访问应该是互斥的进行的好 这是共享存储

刚才我们说的这种共享存储的方案是基于存储区的共享 就是

操作系统给你划定了这么大的一片区 比如说这这整片是四kb

这么大好 那这么大的区域当中几个进程 你到底要往这个地方写还是要往这个地方写

或者读的进程 你要从这个地方读还是从另一个地方读 这些都是很很自由的 很自由的

操作系统只负责把这片区域划给你 但是并不管你怎么使用这片区域

这是基于存储区的共享操作系统 划分出这片共享区域之后 数据你到底要怎么存 到底要存在什么位置

都是由要通信的这些进程 他们之间来来决定的 而不是由操作系统来决定
所以 这种共享方式 它灵活性非常高 是一种高级通行方式 就是传送数据的速度会很快

好 相比之下 还有一种方式叫做基于数据结构的共享 比如说操作系统
在这里插入图片描述

给你们两个进程划定的这片共享区域 它就规定只能存放一个长度为十的数组 大家可以理解为是一个特殊的全局变量

就是这个特殊的全局变量可以被各个进程所共享 为什么叫特殊的呢 因为如果我们写代码的时候 定义的全局变量其实是局部于一个进程的

而这个地方 我们所谓特殊的全局变量 是可以被各个进程所共享的

但是当我们定义这个全局变量的时候 比如说 我们是定义了一个int型的数组 长度为三

好 那各个进程来共享这个这个这个数据结构这个长度为三的数组的时候

各个进程对这一片共享区域的访问 读和写是不是就只能按照这个数据结构所规定的这种格式来进行了

只有三个inter型的变量 每一次要么读要么写一个inter型的变量好 所以可以看到 如果是基于数据结构的这种共享的话 那这个进程之间他们之间通信是不是自由度就是没有那么高

并且这个传送数据的数额速度也会比较慢 所以基于数据结构的这种共享方式是一种低级的通行方式
低级的通讯模式好 那这就是进程之间通信的第一种方法 叫做共享存储

共享存储又可以进一步划分为基于数据结构的共享和基于存储区的共享 上面这种共享方式灵活性差 速度慢

下面这种共享方式灵活性高 速度快好 接下来看第二种进程之间的通信方式 叫做消息传递

消息传递

在这里插入图片描述

如果采用这种方式的话 那么进程之间的数据交换会以格式化的消息为单位
在这里插入图片描述

通过操作系统提供的发送和接收这样的两个原语来进行数据交换 一会我们会用动画的方式带大家来理解这个过程

好 什么叫格式化的消息呢 先来看这个 所以格式化的消息有两个部分组成 一个是消息 头一个是消息体

那消息头要写明要注明这个消息 这一枕头消息到底是由谁发送的

到底要发送给谁 然后整个消息的长度是多少等等就是一些概要的信息 这是消息头

然后消息体里边呢 就是具体的一个进程要传送给另一个进程的这个数据

好 那么这种消息传递的进程之间通信方式又可以进一步的划分为直接通信方式和间接通信方式

其中 直接通信方式就是发送进程 要指明接收进程的id

我们系统里的每一个进程都会有一个进程的pid吗 那发送的进程需要指明到底是谁来接收
在这里插入图片描述

所以直接通信方式相当于我发送进程直接点名我就是要他接受 就这个意思

消息传递(间接通信方式)

在这里插入图片描述

而间接通信方式呢 会通过一个叫做信箱的一个中间实体来进行通信

所以间接通信方式又称为信箱通信方式 好 我们来看一下这两种消息传递的这种通信方式的区别

首先来看什么是直接通信方式进程p现在要给进程

发送一个消息 那么在操作系统的内核区域 操作系统的内核区域

是不是管理着各个进程的pcb啊 进程控制快 这是由操作系统来管理的数据结构

好 那在各个进程的这个pcb当中 有一个包含了一个对列 叫做消息对列

消息对列 比如说进程q的pcb当中 其中就包含了一个进程q的消息对列

也就是其他进程 其他进程要发送给进程q应该被进程q接收的这些消息

这些消息都挂在进程q的 这个消息对列一遍好 那来看一下

现在故事是这样的 进程p要给进程q发一个消息 那首先进程p需要在自己的地盘

自己的这片地址空间站来啊 来完善这个消息的信息 包括消息头消息体

接下来 进程p进程p 它会使用到刚才我们说的这个发送原语

操作系统提供的发送原语send 用这个原语来指明我的这个message 这个消息是要发送给q这个进程

指明了这个消息的接收者指明了消息的接收者好 那这个发送原语会导致

操作系统内核接收到这个消息 并且会把刚才的这个消息把它挂到进程q的消息对列里边

也就是说 这个消息体 这个消息体是从进程p的这个空间 进程p的用户空间
被复制到了内核空间 被复制到了内核空间好接下来接下来如果进程
开始运行那进程q 它可以使用接收源与receive来指明

我现在要接收一个message 接收一个消息 那接收谁发来的message呢 是接收p进程发来的message

所以这个接收源于这 他需要指明我要接收的这个这个这个消息是来自于哪个进程

好 所以进程q执行这个接收原语之后 操作系统内核会检查进程q的这一这些消息对列

看一下哎 这几个消息 到底哪个消息是由p发过来的 好

现在找到了由p发过来的消息 那么操作系统内核会把这个消息体的数据又从操作系统的内核区给复制到 给复制到这个进程q的

这个用户区这个地址空间这啊 所以所谓的直接通信方式 直接通信方式就是

要点名到信的来进行这个消息传递 我一个进程 到底是要传给谁然后接收的这个进程

他接收的时候 我要接收的是来自于谁的那个消息 需要点名到信的进行这个消息传递好 这是直接通信方式

接下来我们再来看什么叫间接通信方式 刚才我们说间接通信方式

呃 他需要通过一个中间实体所谓的信箱来进行消息的传递 所以又称之为信箱通信方式

那这种通信方式是这么来实现的 比如进程p和进程q 他们之间要通信

那么进程p可以通过系统调用 可以通过系统调用申请一个邮箱

一个所谓的邮箱 比如说他可以向操作系统申请一个新的邮箱 这个邮箱的名字叫做a

叫做a 当然也可以申请多个邮箱啊 比如说另一个邮箱叫做b好 现在

这两个进程怎么通信呢 进程p首先他在自己的这个地址空间 这

嗯 来来 完善这个消息题的内容 在自己的地址空间内来来填充这个消息的内容

呃 这个过程大家理解吗 其实就相当于你写这个进程批的代码 你定义了一个变量叫message

然后message到底要等于多少 你给他赋一个值 这就是所谓的在自己的地址空间内 在自己的地址空间内完善这个消息体的信息其实就就是一个赋值 就是一个赋值 这个意思
在这里插入图片描述

好 现在进程p 他已经给他要发送的这个消息 这个消息体已经赋好值了

那么 进程p可以用发送原语send来指明我要发送到哪个信箱

指明 我要发送到的是a信箱 然后发送的是message 这个消息体好注意哈 这个间接通信方式是指明了

我要发送到哪个信箱 是要发送到a信箱 并没有指明我要发送给哪个进程

刚才我们说的直接通信方式 直接通信方式是指明了

点名到信的指明了我是要发给q这个进程的 这是直接通讯方式

但现在我们的这间接通信方式 也就是信箱通信方式 我并没有指明到信的说

我要发给q 我只是指明了我要发送到a这个邮箱 这

好 那进程q进程q他使用接收原语的时候 他可以指明我是要从a这个信箱 这

接收一个message 接收一个消息体 那这样的话 信箱a的这个这个这个消息message

就会被操作系统复制给复制到这个进程q的自己的这个空间站了

好 所以这就是使用信箱来完成消息传递的一个过程 那通常来说 操作系统是可以允许
多个进程往同一个信箱里就是发消息 也允许多个进程从同一个信箱里啊 去receive就接收消息
好 那这是消息传递里边的间接通信方式 又叫信箱通信方式 注意体会和之前直接通信方式的一个区别
直接通信方式需要点名到信的指明我是谁 我要发给谁好
接下我们再来看最后一种进程之间的通信方式 叫做管道通信

进程通信——管道通信

在这里插入图片描述

那管道这个词还是很形象的 它就像我们的一个水管 水管的管道一样 就是写进程

写进程可以从水管的一边写入数据 读进程从水管的另一边就取走数据

这个数据的流动只能是单向的 就从左到右或者从右到左只能是单向的

就像水管当中的水流一样 这个水流的方向只可能是单向的 对吧 要么从左到右

要么从右到左 大家有没有见过一个水管里边那个水流既往右同时又往左的水流的

没有见过这样的水管 对吧 而所以管道通信的这个管道和水管是一样的 嗯 我们可以从一端

写入数据 从另一端读出数据 这个数据的流向只能是单向的 而不可以是双向同时进行的

好 那站在操作系统的层面 照我们提到的管道 它是一种特殊的共享文件

又叫pip文件 pip就是英文的水管的意思吗 管道的意思 也就说如果两个进程

他们之间要用管道通信的方式进行这个进程间通信 那么首先我们需要通过这个系统调用的方式

就某一个进程通过系统调用的方式来申请一个管道文件

操作系统会新建这个管道文件 这个文件的本质其实就是在内存当中开辟了一个大小固定的内存缓冲区

然后 两个进程可以往这个内存缓冲区里面写数据和读数据

但是这个数据的读写是先进先出的 先进先出有这样的特性

啊 去年有很多同学在这个地方是有疑问的哈就是一个管道 一个管道文件 本质上是一个大小固定的内存内存区域

那这不和我们那个共享内存的方式就没有什么区别了吗 刚才我们说就是之前我们说共享内存的那种

通信方式也是操作系统给两个进程给两个进程p和q 给他们分配了一片可以共享可以被共享访问的内存区 对吧

而现在我们的这个管道 我们这个管道也是一个大小固定的内存区域

也是可以被两个进程p和q来访问的 那和我们共享内存有什么区别呢

有什么区别呢 好区别在这啊 在共享内存的这种通信方式当中

我们刚才说过这一片内存区域p和q 你想怎么 你想 怎么玩就怎么玩

你想把数据写在这 写在这 写在这都ok 没有问题 然后你想从这读数据 想从这读数据都ok 没问题 没有任何的限制

很自由 这是共享存储的通信方式 没有任何的限制 但是管道通信的这种方式哈管道通信的这种方式

嗯 相当于是这样的 照操作系统给两个进程分配了一个内存缓冲区 也就是一个管道文件

也就是一个管道文件好 现在p可以往这个管道文件里面写数据 然后q是要从这个管道文件里面读数据

那什么叫先进先出的特性呢 可以这么理解 这个区域 它大小肯定也是有限的 对吧

好 现在p往里边写 那么如果他的头部 这头部 这是空的 那么他先往这写 写 写 写一个字节 比如说一个字节的数据 然后这写了 之后再再往这写

然后再往这写再往这写啊 对于q来说 他要取走数据的时候并不是说

他想读哪 他想读哪就读哪 他想去哪就去哪 他只能先把头部 头部的这些数据给取了

这些取了一次的 往后取 明白我意思吧 就是在共享存储的那个通信方式里边

我可以 我可以把我的数据写在中间这儿 直接就写在中间这儿 虽然前面有空的 但我直接写在那中间站 或我直接写在尾部这儿都是ok的 没有任何限制

让我这个读进程读数据的时候也是一样 我可以直接从中间取数据 或者直接从尾部取数据的

但是在这个管道通信里面 在管道通信里面 它是一个数据流的形式

我这个数据如果前边还有空位的话 这个数据肯定是先放在前面 这个位置放在前边 这位置只有前面填满了 只有前面填满了

我才会往继续往后面写这个数据 而读数据的时候也是一样的 只能先把前边的这些数据读空了 然后才可以读后续的这些数据

才可以读后续的这些数据 而所以管道通信和这个和这个共享内存的通信

嗯 区别还是很大的 管道通信就要求这个数据的就是读写 一定是先进先出的 一定是先进先出的

就是一个对列 嘛 或者更准确的讲 我们应该把这个管道

管道的这个内存缓冲区 这小片内存缓冲区把它理解为 一个循环对列 一个循环对列

现在应该都学过数据结构了 循环队列的原理我们知道对吧 就是循环队列的话

如果说如果说这个他嗯 整片区域后半部分满了 后半部分就是p

他写入数据 然后后边的这些位置都写满了 但是前边这些位置如果空出来的话 如果空出来的话

那是不是p就可以往这个循环队列的另外这个空的这一边继续写入数据啊 继续写数据

所以这个固定大小的内存缓冲区本质上就是一个循环对列 而写进程往里面写数据或者读进程从里面读数据都需要遵循这个对列的先进先出的一个规则

这就是管道的这个内存缓冲区和我们刚才提到的共享存储的这个共享内存区的一个区别

一个是没有限制的 一个是先进先出 这种限制的好 那刚才我们还提过一个点

用管道通信的这种方式 一个管道的数据流向一定是单向的 而不可以是双向的

所以一个管道 他只能支持半双共通性 也就是在某一段时间内只能实现这种单向的传输

但如果说两个进程我需要给你传 同时你也需要给我传 就是两个方向的数据传输都需要同时进行的话

我们称这种双向同时进行的数据传输为双工 全双工通信

全双共通性这些是既往的一个概念 哈半双共通信指的就是

同一时刻 我只能支持单向的传输 但是这个方向的传输结束之后

我也可以把这个传输的方向改过来 但是两个方向的传输不可以同时进行 这是半双工通信

而全双工通信指的是两个方向的数据传输都要同时进行啊 所以如果需要两个方向的传输都同时进行的话 那么这种情况下我们就需要申请向操作系统申请两个管道文件

一个管道文件负责从左往右的这个数据传输 另一个管道文件负责从右往左的这个数据传输

好 另外 各个进程对管道的访问也应该是互斥的进行的 也应该是互斥的进行的

但是呢 对管道的互斥访问是由操作系统来保证的 不需要由这个进程自己来保证

好 第三点需要注意的是 刚才我们说这个管道 它是一个大小固定的

内存缓冲区既然大小固定 那么这片缓冲区肯定会被写满 对吧 那如果写满的话这个进程是不是就不能继续往里面写数据了

好 所以如果管道被写满的话 那么写进程 写进程应该被阻塞

他写数据的这个这个动作应该被阻塞 等待直到读进程把管道里边的数据取走

等这个管道有空位了 我们再把这个写进程给唤醒好 另一个方面

读进程是从这个这个内存缓冲区里面读数据的 那同样的 这个数据有可能会被读空 对吧

所以如果管道被读空的话 那么读进程这个动作

就应该被阻塞 直到写进程往这个管道里面写入数据 才可以把这个读进程给唤醒

所以 管道通信的这种方式 不管是读进程还是写进程 都有可能进入阻塞的状态

好 接下来第五点也是我们管道通信这个部分很多教材最有争议的一个点

管道通信的实现方式决定了管道当中的这些数据一旦被读出就彻底的消失了 就彻底的消失了

所以如果如果说有多个毒进程 有多个毒进程同时读一个管道的时候 就有可能会导致

错乱导致混乱 因为我们管道里边的这些数据并没有指明说我到底是要给进程q的还是要给进程进程m的

没有说明 对吧 所以如果多个进程 如果多个进程都从同一个管道这读数据的话

那么有可能 有可能这个数据的读取 这个动作就是就是会比较乱的

第一块数据可能被m读走了 然后第二块数据可能被q读走了 那针对于这个问题

不同的操作系统会有不同的解决方案 比如说像早期的sisterfive

这种操作系统 它在实现管道的时候就规定一个管道 一个管道

允许多个写进程 多个进程同时晚这个管道里面写

写就完了 但是呢 读进程只允许有一个 只允许有一个 不允许多个读进程同时读这个管道

那我们2014年的有个408真题当中高等教育出版社的那个官方答案

也是这么说的 就是 他说一个管道可以有多个写进程 一个读进程

这是高等教育出版社官方给的答案 但是在有的操作系统当中 比如说Linux里边 Linux里面

呃 又允许有多个写进程和多个读进程 只不过系统会让各个读进程轮流的从管道当中读数据

比如说有两个进程q和m 进程q和进程m都需要从这个管道里面读数据

那么 q和m就是轮流着读的 你读一次我读一次 你读一次 我读一次 由操作系统来控制这个轮流读数据的过程

所以在很多操作系统的教材里面 大家又有可能会看到说一个管道可以被多个进程写多个进程读

而在有的操作系统教材里面 他又会说 一个管道允许多个进程写 但是只允许一个进程读

因此 这个地方也是去年和前年 争议非常非常大 很多同学都不知道该姓谁的

一个一个地方 因此 这个地方 我们要知道 在实际应用当中 一个管道是可以被允许多个写进程 多个读进程的

但是我们毕竟最终是要面对考试而考试呢这种

应试类的这种考试 肯定都得有一个所谓的标准答案 对吧 那以后以后大家在讨论这个管道通信的时候

我们都和这个高教社14年的这个真体统一就说可以有多个写进程

然后只能有一个读进程 我们以这种说法为准 同时大家在做题的时候 如果看到有的题目说一个管道可以有多个写进程 多个读进程也不要觉得奇怪

从现实应用的角度来看 这种说法并没有什么错误 那这就是最后一种进程间通信的方式管道通信

那在这个小节中 我们介绍了共享 存储 消息传递和管道通信这三种常见的进程间通信方式

那这三种通信的功能都是需要操作系统的底层来支持的

知识回顾与重要考点

在这里插入图片描述

共享存储的这种通信方式意味着操作系统会分配一个共享内存区并且把这个共享内存区映射到

各个进程的虚拟地址空间当中 那这个地方现在大家还暂时看不懂 等我们学到第三章

知道什么是断表 什么是页表 之后再回来看这块 你就会恍然大悟了 要把一片内存去映射到进程的虚拟地址空间当中 只需要

加一个段表项就可以做到非常简单 另外呢 采用共享存储的时候 需要注意各个进程 我们需要保证他们是互斥的访问这个共享

共享空间呢 而这个互斥的过程需要由通信进程 就是各个通信的进程 他们自己来负责实现

比如说使用操作系统提供的p为操作等等 就是使用操作系统的同步护齿的机制

来确保各个进程是互斥的 访问这片区的其实本质上对于共享存储区的访问

是一个读者斜着问题 这个是我们在2 32点三那个小节里边会学的一个经典的同步呼出问题

读者 写者问题 也就是说 多个进程可以同时从这片区域里读

但是不可以同时往这片区域里面写 等大家学到读者写这问题的时候会知道我这说的是什么 怎么回事

好 接下来 第二种进程间通信的方式叫做消息传递 消息传递又可以进一步分为直接通信和间接通信方式

直接通信方式就是啊 要指名道姓的说明我要把这个消息发送给哪个进程

然后操作系统会把这个消息直接挂到接收进程的消息对列里面 这是直接通行方式

间接通信方式 又叫信箱通信 消息会被操作系统先放到一个指定的信箱当中

而消息的接收者也需要指明自己要从哪个信箱当中取走一个消息 那这个小杰最后我们又介绍了管道通信

对于操作系统而言 管道通信的这个管道其实是一个特殊的共享文件 你在另一个词里边采用管道通信的话 你是可以在自己的系统里面找到这个文件的

但本质上 这个文件它就是一个内存缓冲区 如果结合我们数据结构的知识来看的话 这个内存缓冲区其实就是一个循环对列 一个循环对列

写进程可以往这个循环对列里面写写一些数据 然后当这个内存缓冲区这个循环对列满了之后

写进程需要阻塞 那读进程读的时候也是一样的 如果说整个内存缓冲区或者说这个这个循环队列被毒空了 那么读进程就需要阻塞等待

那需要注意的是 一个管道文件只能实现半双弓的通信 这就类似于我们现实生活中的水管

一根水管 我可以让水从左往右流 然后也可以让水从右往左流

但是我不可能让这个水管里面的水既往左流也往右流 所以如果我想要从左往右和从右往左的这个水流同时都存在的话
那么我就需要建立两个管道 两个水管才可以实现好的 那么这就是进程间通信的三种方式

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/323579.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试|Selenium 元素不可交互异常ElementNotInteractableException问题分析与解决

简介 在使用 Selenium 进行 Web 自动化测试时,我们可能会遇到各种异常情况。其中之一就是 ElementNotInteractableException 异常,这通常意味着在尝试与页面元素交互时出现了问题。本文将详细介绍这个异常的原因、可能的解决方法,并提供示例…

Git仓库管理笔记

问题: hint: the same ref. If you want to integrate the remote changes, use Done 解决: 解决方法: 1、先使用pull命令: git pull --rebase origin master 2、再使用push命令: git push -u origin master

银行网络安全实战对抗体系建设实践

文章目录 前言一、传统攻防演练面临的瓶颈与挑战(一)银行成熟的网络安全防护体系1、缺少金融特色的演练场景设计2、资产测绘手段与防护体系不适配3、效果评价体系缺少演练过程维度相关指标 二、实战对抗体系建设的创新实践(一)建立…

【RTOS】快速体验FreeRTOS所有常用API(4)队列

目录 四、队列2.1 概念2.2 创建队列2.3 写队列2.4 读队列2.5 队列集(可跳过) 四、队列 该部分在上份代码基础上修改得来,代码下载链接: https://wwzr.lanzout.com/iBNAS1l75bvc 密码:7xy2 该代码尽量做到最简,不添加多…

解决Qt的release构建下无法进入断点调试的问题

在工作的时候遇到了第三方库只提供release版本的库的情况,我需要在这基础上封装一层自家库,在调试的时候遇到如下问题,但是在Qt环境下,release的库只能在进行release构建和调试。 卡在了一直进不了断点的情况。提示内容如下&#…

【IPC通信--共享内存】

进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如…

Linux操作系统——文件详解

1.文件理解预备知识 首先,当我们在磁盘创建一个空文件时,这个文件会不会占据磁盘空间呢? 答案是当然会占据磁盘空间了,因为文件是空的,仅仅指的是它的内容是空的,但是该文件要有对应的文件名,…

【数据库和表的管理】

数据库和表的管理 一、实验目的 了解MySQL数据库的逻辑结构和物理结构的特点。学会使用SQL语句创建、选择、删除数据库。学会使用SQL语句创建、修改、删除表。学会使用SQL语句对表进行插入、修改和删除数据操作。了解MySQL的常用数据类型。 二、实验内容SQL语句创建、选择、删…

玩转硬件之MP3的破解

MP3播放器是一种能播放音乐文件的播放器,主要由存储器(存储卡)、显示器(LCD显示屏)、中央处理器MCU(微控制器)或解码DSP(数字信号处理器) 等组成。 其中微控制器是播放器…

k8s存储卷之动态

动态pv需要两个组件 1、卷插件,k8s本身支持的动态pv创建不包含NFS,需要声明和安装一个外部插件 Provisioner 存储分配器,动态创建pv,然后根据pvc的请求自动绑定和使用 2、StorageClass,用来定义pv的属性&#xff0c…

金蝶云星空单据转换插件-选单

文章目录 金蝶云星空单据转换插件-选单 金蝶云星空单据转换插件-选单 选单使用标识报错 应该使用实体属性

LeetCode 每日一题 Day 44 || 哑节点去重

82. 删除排序链表中的重复元素 II 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1,2,3,3,4,4,5] 输出:[1,2,5] 示例 2&#x…

内存泄漏问题

内存泄漏是一种常见的问题,它可能导致系统内存不断增加,最终耗尽可用内存。解决内存泄漏问题通常需要进行调试和分析。下面是一些可能有助于解决内存泄漏问题的步骤: 1. 监控内存使用情况: a. 使用 malloc 记录日志:…

MyBatisPlus学习笔记二

接上:MyBatisPlus学习笔记一: MyBatisPlus学习笔记一-CSDN博客 1、条件构造器 MyBatisPlus支持各种复杂的where条件,可以满足日常开发的所有需求。 1.1、集成体系 1.2、实例 查询 lambda查询 更新 1.3、总结 2、自定义sql 我们可以利用MyB…

Rust-NLL(Non-Lexical-Lifetime)

Rust防范“内存不安全”代码的原则极其清晰明了。 如果你对同一块内存存在多个引用,就不要试图对这块内存做修改;如果你需要对一块内存做修改,就不要同时保留多个引用。 只要保证了这个原则,我们就可以保证内存安全。 它在实践…

入门Docker1: 容器技术的基础

目录 服务器选型 虚拟机 基于主机(物理机或虚机)的多服务实例 基于容器的服务实例 Docker Docker三要素 Docker安装 Docker基本使用 基本操作 仓库镜像 容器 服务器选型 在选择服务器操作系统时, Windows 附带了许多您需要付费的功能。 Linux 是开放源代…

光K8S的目录结构就够你学一天!

Kubernetes Project Layout设计 Kubernetes项目由Go语言编写。Go语言官方对项目的结构设计没有强制要求,早期的Go语言开发者都喜欢将包文件代码放置在项目的src/目录下,如nsqio开源项目,开发者喜欢将入口文件放入apps/目录。不同开发者的喜好…

使用WAF防御网络上的隐蔽威胁之CSRF攻击

在网络安全领域,除了常见的XSS(跨站脚本)攻击外,CSRF(跨站请求伪造)攻击也是一种常见且危险的威胁。这种攻击利用用户已经验证的身份在没有用户知情的情况下,执行非授权的操作。了解CSRF攻击的机…

运筹说 第45期丨多目标规划发展及其提出者—— Abraham Charnes和William W. Cooper

经过前面的学习,相信大家已经对运筹学的运输问题有了更加全面的了解,接下来小编将带你学习新一章的内容, 先来看看多目标规划的发展简史,然后再带你领略该理论两位提出者的传奇一生! 01目标规划发展简史 Vilfredo Pa…
最新文章