『Linux笔记』进程间通信(IPC)详细介绍!
| 进程间通信(IPC)详细介绍! |
文章目录
- 一. 进程间通信(IPC)详细介绍
- 1. 共享内存(Shared Memory)
- 2. 消息队列(Message Queues)
- 3. 信号量(Semaphores)
- 4. 管道(Pipes)
- 5. 套接字(Sockets)
- Docker 中的 IPC
- 总结
一. 进程间通信(IPC)详细介绍
进程间通信(Inter-Process Communication, IPC) 是操作系统提供的一种机制,旨在解决多个进程之间如何交换数据和进行协作的问题。 它在 并发程序设计 中至关重要,尤其是在多核处理器上,可以有效提升资源利用率,减少处理器等待时间,提供更高效的执行方式。
IPC 的核心目标是允许进程在不同的执行环境中(比如不同的内存空间)共享数据和状态信息。常见的 IPC 机制有以下几种:

1. 共享内存(Shared Memory)
共享内存是最直接的一种进程间通信方式,允许多个进程访问同一块内存区域。共享内存提供了一种非常高效的方式来交换大量数据,因为进程不需要进行复杂的拷贝操作。
-
工作原理:操作系统为多个进程提供一块共同访问的内存区域,进程通过读取和写入这块内存来交换数据。共享内存本身并不提供同步机制,因此使用时需要配合其他同步机制(如信号量)来避免数据冲突。
-
示例:
假设有一个进程 A 负责生成数据,另一个进程 B 负责处理数据。可以使用共享内存让这两个进程交换信息。- 进程 A 将数据写入共享内存。
- 进程 B 从共享内存中读取数据进行处理。
共享内存的一个实际应用是数据库缓存,当多个数据库进程需要频繁访问相同的数据时,使用共享内存可以极大提高数据访问效率。
2. 消息队列(Message Queues)
消息队列是通过一个由操作系统提供的队列机制,让进程能够以消息的形式传递数据。消息队列是一种顺序传递机制,进程发送消息时,消息被加入到队列中,接收进程可以从队列中按顺序读取消息。
-
工作原理:每个消息队列都有一个标识符,进程通过向队列发送消息或从队列中接收消息来实现通信。消息可以是不同类型的数据,队列保证消息的顺序。
-
示例:
- 生产者进程 A 生成数据,并将数据打包为消息发送到消息队列。
- 消费者进程 B 从消息队列中获取并处理这些消息。
消息队列适合于松耦合的进程通信,能够有效处理不同进程间的异步数据交换。
3. 信号量(Semaphores)
信号量用于控制多个进程对共享资源的访问。它通常用于实现进程间的同步,防止多个进程同时访问某一共享资源,从而避免产生竞态条件。
-
工作原理:信号量是一个整数值,表示资源的数量。信号量提供了两个操作:
- P(Wait)操作:将信号量的值减1,若信号量的值为0,则进程阻塞,直到信号量值大于0。
- V(Signal)操作:将信号量的值加1,唤醒等待的进程。
-
示例:
设想有两个进程,进程 A 和进程 B,它们都需要访问共享资源 R。为了防止同时访问,使用信号量来进行同步。- 进程 A 执行 P 操作,等待信号量为正值。
- 进程 B 在操作共享资源 R 时,执行 V 操作,释放资源并增加信号量值。
信号量常用于避免死锁和确保多个进程之间的同步执行。
4. 管道(Pipes)
管道是一种常用的单向通信机制,通常用于父进程和子进程之间的通信。管道将数据从一个进程流向另一个进程,且管道通常是无名的,只能在创建管道的进程之间传输数据。
-
工作原理:管道通过操作系统内核创建一个缓冲区,数据通过该缓冲区从一个进程流向另一个进程。管道通常用于标准输入输出操作,例如 UNIX 系统中的
|符号,允许一个进程的输出成为另一个进程的输入。 -
示例:
在 Linux 中,ps命令输出当前进程信息,而grep命令可以用来筛选进程信息。通过管道,将ps的输出传递给grep:ps aux | grep 'python'
这是一种典型的管道通信,通过管道,ps 的输出直接传递给 grep 进行过滤。
5. 套接字(Sockets)
套接字是一种更为通用的进程间通信机制,它不仅支持同一台机器上的进程间通信,还支持不同机器之间的网络通信。套接字广泛应用于客户端与服务器之间的数据交换。
-
工作原理:进程通过套接字进行连接和数据交换,套接字支持全双工通信,即可以同时进行发送和接收。套接字通常基于 TCP/IP 协议工作。
-
示例:
- 客户端-服务器通信:一个进程作为服务器,监听某个端口,等待客户端请求;另一个进程作为客户端,向服务器发送请求并接收响应。
例如,Web 服务器和浏览器之间的通信就是基于套接字进行的,通过 HTTP 协议发送请求和响应数据。
Docker 中的 IPC
在 Docker 中,每个容器都有独立的 IPC 命名空间,这意味着容器内的进程不能直接与主机或其他容器的进程进行通信。为了让容器与主机或其他容器共享 IPC 资源,可以使用 --ipc 选项进行配置:
-
--ipc=host:容器将共享主机的 IPC 命名空间。进程可以通过共享内存、信号量等机制与主机上的其他进程通信。 -
--ipc=container:<container_id>:容器将共享指定容器的 IPC 命名空间,使得它们可以相互通信。
例如,在使用多个容器进行高性能计算时,可以共享 IPC 命名空间,使得这些容器之间能够通过共享内存进行数据交换,提升性能。
总结
进程间通信(IPC)是多进程系统中不可或缺的一部分,常见的机制包括共享内存、消息队列、信号量、管道和套接字。每种机制适用于不同的场景,进程根据实际需求选择合适的 IPC 方法。在 Docker 等容器化环境中,理解和配置 IPC 选项对于实现高效的进程间协作至关重要。
相关文章:
『Linux笔记』进程间通信(IPC)详细介绍!
进程间通信(IPC)详细介绍! 文章目录 一. 进程间通信(IPC)详细介绍1. 共享内存(Shared Memory)2. 消息队列(Message Queues)3. 信号量(Semaphores)…...
Jmeter进阶篇(34)如何解决jmeter.save.saveservice.timestamp_format=ms报错?
问题描述 今天使用Jmeter完成压测执行,然后使用命令将jtl文件转换成html报告时,遇到了报错! 大致就是说jmeter里定义了一个jmeter.save.saveservice.timestamp_format=ms的时间格式,但是jtl文件中的时间格式不是标准的这个ms格式,导致无法正常解析。对于这个问题,有如下…...
Visual Studio 2022配置网址参考
代码格式化和清理冗余代码选项的配置: 代码样式选项和代码清理 - Visual Studio (Windows) | Microsoft Learn 调试时传递参数: 调试时传递命令行参数(C) - Visual Studio (Windows) | Microsoft Learn...
Redis中集合(Set)常见命令详解
集合(Set)常见命令详解 集合(Set)在Redis中是一种无序且不可重复的数据结构,非常适合用于存储唯一元素的集合。以下是Redis集合操作的一些常用命令及其详细说明: 添加成员 sadd key member [member ...]…...
动态规划
简介 动态规划最核心两步: 状态表示:dp[i]代表什么状态转移方程:如何利用已有的dp求解dp[i] 只要这两步搞对了, 就完成了动态规划的%95 剩下的就是细节问题: dp初始化顺序(有时是倒序)处理边…...
stm32rtc实时时钟详解文章
目录 stm32 后备区域基础知识详解 stm32 bkp基础知识详解 Unix时间戳基础知识详解 stm32 rtc实时时钟基础知识详解 相关代码初始化配置 欢迎指正,希望对你,有所帮助!!! stm32 后备区域基础知识详解 stm32芯片的 …...
DeepSeek 助力 Vue 开发:打造丝滑的 键盘快捷键(Keyboard Shortcuts)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
【第一节】C++设计模式(创建型模式)-工厂模式
目录 前言 一、面向对象的两类对象创建问题 二、解决问题 三、工厂模式代码示例 四、工厂模式的核心功能 五、工厂模式的应用场景 六、工厂模式的实现与结构 七、工厂模式的优缺点 八、工厂模式的扩展与优化 九、总结 前言 在面向对象系统设计中,开发者常…...
深入理解 SQL 注入漏洞及解决方案
一、引言 在当今数字化时代,数据库作为存储和管理数据的核心组件,其安全性至关重要。SQL 注入是一种常见且极具威胁性的数据库安全漏洞,它可能导致数据泄露、篡改甚至系统被完全控制。本文将深入探讨 SQL 注入漏洞的产生原因、表现形式以及如…...
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应我要用 chatgpt,也问过,但是比 deepseek 还是差一个级别,具体如下: package mainimport ("bufio&qu…...
7.【线性代数】——求解Ax=0,主列和自由列
七 求解Ax0,主列和自由列 1. 消元、秩、特解特解零空间 2. 简化行阶梯形式 :主元上下都是0,主元简化为1 1. 消元、秩、特解 矩阵消元 [ 1 2 2 2 2 4 6 8 3 6 8 10 ] ⏟ A ⇒ r o w 2 − 2 r o w 1 , r o w 3 − 3 r o w 1 [ 1 2 2 2 0 0 2 4 0 0 2 4 ]…...
vue3结合后端传递过来的文件进行预览功能
业务的需要,前端需要根据后端传递过来的文件流进行预览的功能,前端点击链接直接触发浏览器的窗口的预览功能。 实现方式一: 使用弹窗和iframe的标签的形式进行预览文件,但是iframe可能会出现网站安全性的问题,限制比较…...
【Python爬虫(39)】掌控全局:分布式爬虫的任务管理与监控之道
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
Jenkins整合Jmeter实现接口自动化测试
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、安装jmeter 下载:http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本,启动前修改j…...
Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解
Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解 前言简介一、安装二、Web Inspector 的使用2.1 获取元素定位器(Locators)2.2 将定位器添加到代码2.3 验证定位器2.4 处理 Frames (框架)总结前言 JetBrains 的 Aqua IDE 提供强大的 Web Inspector 工具,帮…...
大语言模型:从开发到运行的深度解构
一、LLM开发训练的全流程解析 1. 数据工程的炼金术 数据采集:构建涵盖网页文本(Common Crawl)、书籍、论文、代码等领域的超大规模语料库,典型规模可达数十TB。例如GPT-4的训练数据包含超过13万亿token数据清洗:通过…...
【GoLang】【算法模板】2、GoLang 算法模板整理
文章目录 0、前言1、GoLang 算法必会技巧1.1、标准库1.1.1、sort 包1.1.2、slice 包 1.2、数据结构1.2.1、优先队列 2、板子2.1、二分2.1.1、lower_bound、upper_bound 2.2、字符串2.2.1、kmp 0、前言 整理一下 golang 的算法板子,作为备忘录使用。可能有些板子、博…...
合理建模--最短路径
这道题目难就难在如何想到用最短路径来做 主要是这个题目不能用bfs来写,因为距离并不是1 狄克斯特拉算法很久没写了,有些地方生疏了 且这个题目需要记录三个信息,得用tuple 题目地址 int dx[] {0,0,1,-1};int dy[] {1,-1,0,0}; class Solut…...
喜报!博睿数据案例获经观传媒“2024年度数字转型创新案例”!
本文已在“经观”APP中发表,点击下方文章链接查看原文: 2024科技创变纪:创新破局 变量启新 近日,经济观察报“2024年度卓越创新实践案例”榜单评选结果正式公布。博睿数据选送的案例“从零到一:可观测体系建设的探索…...
基于图扑 HT 可视化技术打造智慧地下采矿可视化方案
在前端开发领域,不断涌现的新技术为各行业带来了创新变革的可能。今天,让我们聚焦于图扑软件自研的 HT for Web 产品,看看它如何在前端 2D、3D 渲染方面发力,为智慧地下采矿可视化打造令人惊叹的解决方案,为开发者开启…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
