Linux 进程间通信方式总结

news/2024/9/30 0:31:02/

1、常用的进程间通信方式

1、管道
2、消息队列
3、内存映射
4、信号量
5、共享内存

1. 管道 (Pipe) 和 有名管道 (FIFO)
工作机制:管道和有名管道也是基于内核的通信机制,数据在一个进程写入时进入内核缓冲区,另一个进程从内核缓冲区读取数据。因此,数据传输同样需要多次用户态与内核态的切换。
优点:管道非常简单,适合父子进程间的通信。
缺点:由于涉及内核缓存和用户态/内核态切换,效率不如共享内存高。

2. 消息队列 (Message Queue)
工作机制:消息队列是在内核中维护的一种数据结构,用于存储多个进程发送的消息。当进程发送消息时,数据会从用户态切换到内核态,内核将消息放入队列中;当进程接收消息时,内核将消息从队列中取出,再切换回用户态。整个过程需要通过系统调用来进行,因此涉及到多次用户态与内核态的切换。
优点:消息队列可以跨越多个进程,支持有序且可靠的数据传输,适合小型数据传输。
缺点:由于数据需要经过内核缓存,消息在传递过程中涉及到内核态与用户态的切换以及数据拷贝,性能相对共享内存较低。

3. 内存映射 mmap
内存映射通过将文件或设备的一部分(或全部)映射到进程的虚拟内存空间,使得进程可以像访问普通内存一样直接读取或写入该文件内容。

内存映射主要有两种类型:

文件映射(File Mapping):

将文件中的数据映射到进程的虚拟内存中,文件的内容可以像内存一样进行访问。当进程对映射区域进行读写操作时,内核负责在需要时将数据从文件加载到内存,并在需要时将修改的数据写回文件。
常用于访问大文件时提高效率。通过将文件映射到内存,避免频繁的磁盘 I/O 操作,可以快速访问文件内容。
匿名映射(Anonymous Mapping):

匿名映射不与文件关联,通常用于为进程分配一块未初始化的内存。它通常用于共享内存的实现,比如在多个进程之间共享一块内存空间。
常用于进程间通信(IPC)和内存分配。

4. 信号 (Signals)
工作机制:信号是用于通知进程某些事件的机制。内核负责发送和处理信号,当进程接收到信号时,内核会通知用户态的进程处理对应的信号。因此,信号机制中也涉及内核态与用户态的切换,但信号通常用于简单的通知和事件处理,数据量非常小。
优点:信号机制适合用于进程间的简单通信或事件通知。
缺点:信号机制无法传递大量数据,只适合通知类的通信。

5. 套接字 (Socket)
工作机制:套接字是一种非常通用的 IPC 机制,既可以用于本地进程间通信,也可以用于网络通信。套接字的通信通常依赖于操作系统内核进行数据传递,因此涉及到内核态与用户态的切换。尤其是在本地套接字通信中,数据从一个进程传递到内核,再从内核传递给另一个进程。
优点:套接字适合复杂的网络和进程间通信,灵活性强。
缺点:由于数据经过内核,并且通常有更多的协议开销,性能不如共享内存高。

6. 共享内存 (Shared Memory)
工作机制:共享内存是通过多个进程将同一段物理内存映射到各自的用户态地址空间,进程直接通过用户态访问共享的内存区域,因此不涉及内核态与用户态的频繁切换。所有的读写操作都在用户态完成,只在创建和销毁共享内存段时涉及内核态。
优点:共享内存是最快的 IPC 机制,特别适合大量数据的高效传输。
缺点:需要进程自己管理同步问题(例如使用信号量、互斥锁),否则会出现数据竞争。

总结
管道、消息队列、内存映射、信号量相对慢速,主要源于内核态与用户态的切换和数据拷贝,而共享内存由于在通信过程中绕过了这些切换,性能更优。
内存映射更加适合频繁I/O的引用场景,共享内存更适合多线程之间进行大规模数据通信。

2、epoll使用的是mmap进行用户态和内核态的数据拷贝,为什么不用共享内存呢?

  1. epoll 的设计目的
    epoll 的主要目的是为高效的 I/O 事件通知提供支持。epoll 需要在内核和用户空间之间传递事件信息(如文件描述符的状态变化)

  2. mmap 与共享内存的区别
    mmap 是一种将文件或设备的内容映射到进程地址空间的机制。它不仅可以用于文件,也可以用于将内核态的内存区域直接映射到用户态。
    共享内存是两个或多个进程之间共享内存段的一种机制,通常用于大规模数据的快速传输。共享内存段在多个进程的地址空间中可见,但共享内存本质上是用于进程间通信的,而 epoll 的核心任务并不是进程间通信,而是高效地传递内核与用户态之间的 I/O 事件信息。

  3. mmap 更适合 epoll 的需求
    简化数据传输、避免复杂的同步机制(共享内存需要引入复杂的同步机制,以确保多进程在访问共享内存时不会产生数据竞争冲突,而epoll 数据传递通常是单向的)


http://www.ppmy.cn/news/1532166.html

相关文章

C++学习9.24

1、 将昨天的My_string类中的所有能重载的运算符全部进行重载 、[] 、>、、>) 头文件 #ifndef MY_STRING_H #define MY_STRING_H#endif // MY_STRING_H#include <iostream> #include <cstring> //#include <stdexcept>using namespace std;class My…

Windows打开HDF5图像:HDFView软件的下载、安装

本文介绍在Windows电脑中&#xff0c;下载、安装用以查看HDF5图像数据的软件HDFView的方法。 HDF5&#xff08;Hierarchical Data Format 5&#xff09;是一种用于存储和管理大量科学数据的文件格式&#xff0c;其由HDF Group开发和维护&#xff0c;广泛应用于科学计算、工程、…

基于微信的原创音乐小程序的设计与实现+ssm论文源码调试讲解

第二章 开发工具及关键技术介绍 2.1 JAVA技术 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterrise JavaBeans&#xff09;的全面支持&#xff0c;java servlet AI&#xff0c;JS&#xff08;java server ages&…

11.C++程序中的常用函数

我们将程序中反复执行的代码封装到一个代码块中&#xff0c;这个代码块就被称为函数&#xff0c;它类似于数学中的函数&#xff0c;在C程序中&#xff0c;有许多由编译器定义好的函数&#xff0c;供大家使用。下面就简单说一下&#xff0c;C中常用的函数。 1.sizeof sizeof函…

城市生命线安全监管系统:智慧城市的守护者

城市生命线安全监管系统是智慧城市建设中的重要组成部分&#xff0c;它涉及到城市燃气、供水、排水、热力、电力、电梯、通信、轨道交通、综合管廊、输油管线等关键基础设施的监测和管理。这些系统如同城市的“神经”和“血管”&#xff0c;保障着城市的正常运行和居民的生活安…

51单片机的光照强度检测【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块光照传感器按键蜂鸣器LED等模块构成。适用于光照强度检测、光照强度测量报警等相似项目。 可实现功能: 1、LCD1602实时显示光照强度信息 2、光照强度传感器&#xff08;电位器模拟&#xff09;采集光照信息 3、可…

Go基础编程 - 15 - 延迟调用(defer)

延迟调用 defer 1. 特性2. 常用用途3. defer 执行顺序&#xff1a;同函数内先进后出4. defer 闭包5. defer 陷阱 上一篇&#xff1a;泛型 1. 特性 1. 关键字 defer 用于注册延迟调用。 2. defer 调用直到 return 前才被执行。 3. 同函数内多个 defer 语句&#xff0c;按先进后…

GPT-4提示工程大赛冠军的秘籍分享

前言 去年 11 月 8 日&#xff0c;新加坡政府科技局&#xff08;GovTech&#xff09;组织举办了首届 GPT-4 提示工程&#xff08;Prompt Engineering&#xff09;竞赛。数据科学家 Sheila Teo 最终夺冠。之后&#xff0c;Teo 发布了一篇题为《我如何赢得了新加坡 GPT-4 提示工…