Linux进程间通信方式对比

news2024/9/23 13:16:26

参考:

Linux进程间通信总结-百度开发者中心

Linux操作系统提供了多种进程间通信(IPC)的方式,每种方式都有其独特的应用场景和优缺点。下面将对Linux下的进程间通信方式进行总结和比较。

管道(Pipe)

管道是最早的进程间通信方式之一,它通过将一个进程的输出连接到另一个进程的输入来实现通信。管道可以分为匿名管道和有名管道两种。匿名管道只能在具有亲缘关系的进程之间使用,有名管道则可以在任意两个进程之间使用。

优点:

  1. 实现简单:管道是Linux操作系统自带的一种通信方式,使用起来比较简单。
  2. 无须第三方支持:管道不需要第三方软件的支撑,因此性能较高。

缺点:

  1. 通信能力有限:管道只能单向传输数据,且数据量较小,不适合传输大量数据。
  2. 通信双方必须事先存在:管道只能在具有亲缘关系的进程之间使用,且通信双方必须事先存在。

消息队列(Message Queue)

消息队列是一种基于消息的通信方式,它允许进程之间发送和接收消息。消息队列可以实现异步通信,即发送和接收消息的进程可以不同时运行。

优点:

  1. 支持异步通信:消息队列可以实现异步通信,提高系统的并发性能。
  2. 数据持久化:消息队列可以将数据持久化存储,保证数据的安全性。

缺点:

  1. 性能开销较大:消息队列需要维护消息的存储和转发,因此性能开销较大。
  2. 可能会引起死锁:在多进程访问同一个消息队列时,可能会引起死锁问题。
  • 缺点:如果a给b发送的数据过大,并且通信频繁,那消息队列就不合适了,因为数据过大,a发送数据的时间长,b去拷贝数据花费时间也长,效率就会变低。
  • 优点:管道一旦相关进程退出,那里面的数据也就没有了,但消息队列不一样,一个进程向里面写入数据后退出,另一个进程仍然可以取数据。

参考:https://www.cnblogs.com/feily/articles/14160817.html

消息队列不适合比较大数据的传输,因为在内核中每个消息体都有一个最大长度的限制,同时所有队列所包含的全部消息体的总长度也是有上限。在 Linux 内核中,会有两个宏定义 MSGMAX 和 MSGMNB,它们以字节为单位,分别定义了一条消息的最大长度和一个队列的最大长度。

消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销,因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时,会发生从内核态拷贝数据到用户态的过程。

 

共享内存(Shared Memory)

共享内存允许多个进程共享一段内存空间,从而实现快速的数据交换。共享内存可以是全共享内存或段共享内存,其中全共享内存允许多个进程同时读写同一段内存空间,而段共享内存则只允许一个进程读写某一段内存空间。

优点:

  1. 速度快:共享内存允许多个进程直接访问同一段内存空间,因此速度非常快。
  2. 数据共享:共享内存可以实现多个进程之间的数据共享。

缺点:

  1. 同步问题:多个进程同时访问共享内存时,需要解决同步问题,以避免出现竞态条件。
  2. 可能导致死锁:在多进程访问共享内存时,可能会引起死锁问题。

针对消息队列的缺点,共享内存允许多个进程共享一个给定的存储区,由于他们是共享一块内存数据,减少了内存拷贝的时间,因此速度非常快。

但这里我们可能会问:每个进程不是独立的吗?怎么可以共享内存呢?

其实,系统加载一个进程时,分配给进程的内存并不是实际的物理内存,而是虚拟内存空间,我们可以让两个进程各自拿出一块虚拟地址空间来,然后映射到相同的物理内存中,这样虽然两个进程有独立的虚拟地址空间,但有一部分是映射的相同的物理内存,这样就完成了内存共享机制,如下图所示:

缺点:多进程竞争内存,类似于我们平常说的线程安全。

信号量(Semaphore)

信号量是一种用于控制多个进程对共享资源的访问的机制。它通过维护一个计数器来记录可用资源的数量,当一个进程需要访问资源时,需要先获取信号量。如果信号量的值为0,则表示资源不可用;如果信号量的值大于0,则表示资源可用,该进程可以获取资源并减少信号量的值。

优点:

  1. 可以控制并发访问:信号量可以控制多个进程对共享资源的并发访问,避免出现竞态条件。
  2. 实现简单:信号量的实现比较简单,使用起来也比较方便。

缺点:

  1. 可能会导致死锁:在多进程访问共享资源时,如果不合理地使用信号量,可能会导致死锁问题。
  2. 无法传递大量数据:信号量只能用于控制资源的访问,无法传递大量数据。

套接字(Socket)

前面提到的管道、消息队列、共享内存以及信号量都是在同一台主机上进行进程间通信,那要想跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。

实际上,Socket 通信不仅可以跨网络与不同主机的进程间通信,还可以在同主机上进程间通信。

套接字基于网络协议进行数据传输,可以用于不同操作系统之间的通信。套接字可以分为流套接字和数据报套接字两种类型。流套接字提供可靠的、双向的、面向连接的数据传输服务;数据报套接字提供不可靠的、无连接的数据传输服务。

优点:

  1. 支持跨平台通信:套接字适用于不同主机之间的进程间通信,可以实现跨平台通信。
  2. 其实也可以用于同一个主机上不同进程间的数据通信,也就是unix域Socket。

参考:https://www.cnblogs.com/feily/articles/14160817.html

根据创建 socket 类型的不同,通信的方式也就不同:

  • 实现 TCP 字节流通信:socket 类型是 AF_INET 和 SOCK_STREAM;
  • 实现 UDP 数据报通信:socket 类型是 AF_INET 和 SOCK_DGRAM;
  • 实现本地进程间通信:「本地字节流 socket 」类型是 AF_LOCAL 和 SOCK_STREAM,「本地数据报 socket 」类型是 AF_LOCAL 和 SOCK_DGRAM。另外,AF_UNIX 和 AF_LOCAL 是等价的,所以 AF_UNIX 也属于本地 socket;

更多待补充。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白学大模型:GLM 调用教程

最近这一两周看到不少互联网公司都已经开始秋招提前批面试了。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些…

计算机网络:DNS、子网掩码、网关

参考: https://blog.csdn.net/weixin_55255438/article/details/123074896 https://zhuanlan.zhihu.com/p/65226634 在计算机网络中,DNS(Domain Name System,域名系统)、子网掩码(Subnet Mask)…

优化RoBERTa:在AMD上使用混合精度进行微调

Optimizing RoBERTa: Fine-Tuning with Mixed Precision on AMD — ROCm Blogs 简介 在这篇博客中,我们将探讨如何微调鲁棒优化的BERT预训练方法([RoBERTa](https://arxiv.org/abs/1907.11692))大型语言模型,重点在于PyTorch的混…

遥感之大豆提取

主要记录大豆提取常用的光学以及sar等特征&#xff0c;以便在实验中实现考虑以下特征得到初步结果&#xff0c;在其基础上进行不同维度的优化。 参考文献**<Mapping annual 10-m soybean cropland with spatiotemporal sample migration>** 文档总体描述&#xff1a; …

Java类的加载器分类

启动类加载器 使用-XX:TraceClassLoading参数得到 扩展类加载器 应用程序类加载器 用户自定义类加载器 测试不同类的加载器

高性能web服务器--nginx

下载nginx [rootnginx ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz [rootnginx ~]# tar zxf nginx-1.24.0.tar.gz创建nginx用户 [rootnginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx先安装依赖 dnf install gcc pcre-devel zlib-devel openssl-d…

来了...腾讯内推的软件测试面试PDF 文档(共107页)

不多说&#xff0c;直接上干货&#xff08;展示部分以腾讯面试纲要为例&#xff09;完整版文末领取 通过大数据总结发现&#xff0c;其实软件测试岗的面试都是差不多的。常问的有下面这几块知识点&#xff1a; 全网首发-涵盖16个技术栈 第一部分&#xff0c;测试理论&#x…

C++:平衡二叉搜索树之红黑树

一、红黑树的概念 红黑树&#xff0c; 和AVL都是二叉搜索树&#xff0c; 红黑树通过在每个节点上增加一个储存位表示节点的颜色&#xff0c; 可以是RED或者BLACK&#xff0c; 通过任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树能够确保没有一条路径会比…

黑马头条vue2.0项目实战(九)——编辑用户资料

目录 1. 创建组件并配置路由 2. 页面布局 3. 展示用户信息 4. 修改昵称 5. 修改性别 6. 修改生日 7. 修改头像 7.1 图片上传预览 7.2 使用纯客户端的方式处理用户头像上传预览 7.3 头像裁切 7.4 纯客户端的图片裁切上传流程 7.5 Cropper.js 图片裁剪器的基本使用 …

盘点.软件测试工程师常见的面试题。面试官说我要定你了!

今天我们来聊聊软件测试工程师的面试题有哪些&#xff0c;2024年的8月份马上就过完了&#xff0c;金九银十就业季&#xff0c;跳槽季马上又要来了&#xff0c;毕竟在面试的战场上&#xff0c;知己知彼方能百战不殆。嗯嗯&#xff0c;不错说的真好&#xff01; 1、您所熟悉的测试…

24/8/15算法笔记 项目练习冰湖

import gym from matplotlib import pyplot as plt %matplotlib inline import os os.environ[SDL_VIDEODRIVER]dummy #设置环境变量 SDL_VIDEODRIVERdummy 是在使用基于 SDL (Simple DirectMedia Layer) 的应用程序时&#xff0c;告诉应用程序不使用任何视频驱动程序。这通常…

云计算实训29——mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、mycat读写分离实现

一、mysql主从复制及同步 1、mysql主从自动开机同步 2、配置mysql5.7版本 mysql-5.7.44-linux-glibc2.12-x86_64.tar 启动服务、登录 对数据库进行基本操作 3、使用python操纵mysql数据库 4、编辑python脚本自动化操纵mysql数据库 二、mycat读写分离实现 1.上传jdk和mycat安装…

【C语言】双链表

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:黄灿灿/数据结构 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、什么是双链表&#xff1f; 二、双链表温习 1. 双链表的结构…

Windows 11 Build 27686 上手体验:2TB FAT32、更好的沙盒等功能

Windows 11 Build 27686 现已在 Insider Program 的 Canary 频道发布&#xff0c;其中包含一些有趣的内容。该版本确认了微软更改 FAT32 大小限制的计划&#xff0c;并将其大小限制从 32GB 提高到 2TB。与此同时&#xff0c;沙盒也得到了改进。让我们来详细了解一下此次更新。 …

Unity 麦扣 x 勇士传说 全解析 之 怪物基类(2)(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

1.怪物的动画逻辑一览 2.怪物的受伤死亡逻辑一览 using System.Collections; using System.Collections.Generic; using System.Xml; using UnityEngine;public class Monster : MonoBehaviour {[Header("速度")]public float normalSpeed;public float chaseSpeed;…

Xinstall神器来袭:落地页与App无缝衔接,用户转化不再是难题

在移动互联网时代&#xff0c;App的推广与运营成为了各行各业的关键一环。然而&#xff0c;许多推广者在落地页跳转App这一环节上遇到了不小的挑战。用户点击落地页后&#xff0c;往往需要经过繁琐的步骤才能跳转到App&#xff0c;这不仅降低了用户体验&#xff0c;还严重影响了…

红明谷CTF 2022

MissingFile 前置知识 DPAPI&#xff1a; 全称&#xff1a;Data Protection Application Programming Interface DPAPI blob 一段密文&#xff0c;可以使用Master Key对其解密 Master Key 64字节&#xff0c;用于解密DPAPI blob&#xff0c;使用用户登录密码、SID和16字…

周易测算系统前景分析

周易测算系统作为一种结合传统文化与现代技术的服务平台。其市场前景分析如下&#xff1a; 市场需求增长&#xff1a;随着人们对传统文化的重视和对个性化服务的追求&#xff0c;周易测算系统市场需求正逐渐增长。特别是在互联网的背景下&#xff0c;周易预测服务与互联网的结…

java: 错误: 不支持发行版本

报这样的错误大概率是 idea 中的版本配置不统一导致的 通过确保四个位置的版本一致&#xff0c;解决版本不同的问题 第一个位置&#xff1a;Project ,确保 SDK 和 Project language level 的版本适配 第二个位置&#xff1a;Modules,确保需要运行的模块的 Language level 正确…

本地下载安装WampServer结合内网穿透配置公网地址远程访问详细教程

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…