当前位置: 首页 > article >正文

Linux-进程之间的通信


目录

​编辑

一.什么是进程之间的通信

二.进程之间的通信所访问的数据

三.进程之间的通信是如何做到的

四.基于内存文件级别的通信方式——管道

        1.什么是管道                

        2.管道的建立过程——匿名管道

                a.什么是匿名管道

                b.匿名管道特点:

                c.使用匿名管道的四种情况:

五.具有血缘关系的进程之间的通信的代码实现

六.使用匿名管道实现简易版本的进程池

七.匿名管道和我们之前在bash命令行中使用的 | 有什么关系

八.命名管道

九.使用命名管道通信并完成程序日志的打印

十.通过system V 共享内存实现的进程之间的通信

        1.什么是system V 共享内存

        2.从共享内存的申请到共享内存的使用

        3.共享内存的释放

        4.问题


一.什么是进程之间的通信

        定义:两个或多个进程之间实现数据层面的交互。

        进程之间的通信实现的成本是很高的,因为我们都知道在操作系统中,进程之间的是有独立性的。

二.进程之间的通信所访问的数据

        1.基本数据

        2.发送命令

        3.某种协议

        4.通知

三.进程之间的通信是如何做到的

        1.进程之间的通信必须让不同的进程之间看到同一份“资源”。

        2.这个“资源”是指特定形式的存储空间。

        3.这个特定形式的存储空间是谁来提供的:

                假设a:如果这个特定的存储空间是由进行通信的双方的其中一方提供的。

                                那么这个资源属于谁?    属于该进程独有的。

                                        那么此时我们在进行进程之间的通信那么势必会破会进程之间的独立性,这是个万万不可以的。

                假设b:如果这个特定的存储空间是又操作系统提供的。

                                在两个进程要发生进程之间的通信时,操作系统会为两者开辟一段第三方空间来满足进程通信的需要。

                                那么访问这个空间,进行通信,本质就是访问操作系统,进程代表的就是用户,“资源”从创建到使用到释放,这一系列过程都是由操作系统来提供系统级别的调用接口的。

                                从底层设计,从接口设计 都是要由操作系统独立设计的。

                                一般的操作系统都是有一个独立的通信模块-隶属于文件系统-----IPC通信模块

        4.关于进程通信是有标准的:system V (本机内部的通信)&& posix(网络之间的通信)。

四.基于内存文件级别的通信方式——管道

        1.什么是管道                

                管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。其思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。由于这种方式具有单向传递数据的特点,所以这个作为传递消息的共享文件就叫做“管道”。

        2.管道的建立过程——匿名管道

                a.什么是匿名管道

        

                        这种使带有血缘关系的进程之间可以通信的管道称匿名管道。

                b.匿名管道特点:
                         只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。
                        管道提供流式服务。
                        一般而言,进程退出,管道释放,所以管道的生命周期随进程。
                        一般而言,内核会对管道操作进行同步与互斥。
                                在读取管道的数据后,会将对应的数据变为可覆盖的数据。
                        管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。

                c.使用匿名管道的四种情况:

                        读写端正常,管道如果为空,读端就会被阻塞。

                        读端慢,写端快

                                会一瞬间将管道文件写满,此时写端会被阻塞,然后读端在自己的用户级缓存区没满的前提下,有多少读多少。

                                管道文件的是有大小的:使用 ulimit -a 指令可以查看重要文件的规定。 

                        其中可以看到这个里面表明管道的大小是4kb,但是实际的管道大小是4kb吗?

                        我们将读端关闭,然后此时一直向管道写入一个字符:

                        我们发现:

                        此时管道文件的大小是64kb。不同的内核平台下这个大小不同

                        如何查看Linux的内核是什么版本:uname -r

                        那么我们上面查到的4kb是什么,实际上在我们进行读写时有一个大小是PIPE_BUF 这个大小是4kb,如果单次写入时写入的数据是小于PIPE_BUF的那么此时读写就是原子的,此时即使管道有数据,但是写端还没有写完,读端也不会从管道中读取数据。

                        读写端不正常

                              读正常,写不正常:

                                        此时读文件时文件中没有数据,read接口会识别到文件的结尾,所以什么都不会读到。

                              写端正常,但是读端关闭:

                                        此时写端在向管道文件中写入数据是没有意义的,而其操作系统也不会允许友这样的行为存在,此时操作系统会像进程发送型号,使进程退出。

五.具有血缘关系的进程之间的通信的代码实现

        Linux-模拟实现基于内存级文件的单向进程通信-CSDN博客

六.使用匿名管道实现简易版本的进程池

        Linux-使用管道实现简易版本的进程池-CSDN博客

七.匿名管道和我们之前在bash命令行中使用的 | 有什么关系

        eg:cat test.txt | head -10 | tail -5

                此时这里使用的管道就是匿名管道,这三个指令在启动为进程后,都有同样的父进程bash。

八.命名管道

        1.什么是命名管道

                命名管道就是创建在当前工作目录的一个系统级文件。

                命名管道是用于没有血缘关系的进程之间的通信,也是单向通信。

        2.如何定义命名管道

                使用mkfifo 加管道名称就可以创建一个命名管道。                

        命名管道和匿名管道除了适用对象不同其他的基本相同。

九.使用命名管道通信并完成程序日志的打印

        Linux-实现小型日志系统-CSDN博客

          

十.通过system V 共享内存实现的进程之间的通信

        1.什么是system V 共享内存

                共享内存就是由操作系统为进程之间想要通信在物理内存上所开辟的一段存储空间。

                

 

        2.从共享内存的申请到共享内存的使用

                a.进程向操作系统发出请求,希望操作系统为它开辟一段共享内存,以满足它通信的需求。

                b.操作系统接收进程发来的请求完成对共享内存的开辟。

                c.操作系统将在物理内存中开辟好的共享内存通过页表和发出请求的进程的进程地址空间进行建立链接。

                d.为了使发出请求的进程可以使用操作系统开辟好的共享内存,在建立关联时操作系统还会将共享内存在进程地址空间中的启始虚拟地址返回给进程。 

        3.共享内存的释放

                首先因该先去关联,然后在使用系统调用接口来释放共享内存。

         

        4.问题

                a.从共享内存的创建到共享内存的管理,都是又操作系统来完成的,为什么不能是进程自己完成。

                        因为共享内存如果是由进程之间创建的话,因为进程有独立性的原因,其他的进程是没有办法去访问它的空间的,此时就没有办法实现进程间的通信了。

                b.系统中会开辟很多的共享内存来实现不同进程之间的通信的需要,所以操作系统会将它们管理起来。  先描述在组织。

        5.代码实现通过system v共享内存实现的进程间的通信

                Linux-代码实现通过system v共享内存实现的进程间的通信-CSDN博客

        

        6.共享内存的特点

                a.共享内存没有同步和互斥的特点。

                b.共享内存是所有的进程之间通信速度最快的。

                c.共享内存中的数据由用户自己管理。


http://www.kler.cn/a/161387.html

相关文章:

  • 记录使用documents4j来将word文件转化为pdf文件
  • Linux 函数在多个地方被同时调用时,函数中的变量如何管理,确保互不影响
  • 【C++】一种针对代码的连续条件检查方案,累计布尔结果
  • 基于混合配准策略的多模态医学图像配准方法研究
  • 在 Ubuntu 上安装 `.deb` 软件包有几种方法
  • 24/11/13 算法笔记<强化学习> DQN算法
  • 【UE5】使用场系统炸毁一堵墙
  • C# 使用FluentScheduler触发定时任务
  • 视频分割方法:批量剪辑高效分割视频,提取m3u8视频技巧
  • 什么是数据架构
  • uniapp 使用 flex布局 将 图片展示 循环排列两列
  • 微信小程序中生命周期钩子函数
  • Python Tornado 框架的终极指南!
  • 交易历史记录20231207 记录
  • chatgpt用到哪些算法
  • 【android开发-14】android中fragment用法详细介绍
  • 简单实现Spring容器(二)
  • linux远程桌面管理工具(xrdp)、向日葵
  • UE4 双屏分辨率设置
  • 浅聊JAVA开发下环境部署与使用工具的安装与部署
  • yml配置文件获取数值不一致
  • ASP.NET Core 使用IIS调试出现505.24错误
  • electron调用dll问题总汇
  • 插件原理与开发
  • Tap虚拟网卡
  • 如何使用 Oracle SQL Developer 连接 pgvector