进程之间的通信方式
前言
每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。
Linux提供了以下进程通信方式:
一、管道
所谓的管道,就是内核里面的一串缓存。从管道的一段写入的数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据。
而利用管道进行进程之间的通信,就是利用fork()函数创造一个子进程,创建的子进程会复制父进程的文件描述符(见下图)
接着,为了明确写读端,我们只允许输出方写、接收方读(见下图)。
- 管道这种通信方式效率低,不适合进程间频繁地交换数据
- 其实无非就是,在内核空间中缓存,然后两个进程从这个内核空间中读和写。
二、消息队列
消息队列通过内核维护的一个队列,允许多个进程以一种松耦合的方式进行通信,消息在进程间以队列的形式存在。
消息发送者可以将消息放入队列后立即返回,不需要等待接收者处理完消息。接收者可以在方便的时候从队列中读取消息。以此来达到异步通信的效果。
消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销,因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时,会发生从内核态拷贝数据到用户态的过程。
缺点:
- 通信不及时
- 附件也有大小限制
三、共享内存
在操作系统中我们学过,每个进程都有自己独立的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中。
共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中,如下图。这样两个进程直接共享了这一块物理内存,都可以读写。
缺点:
- 多个进程容易读写冲突
四、信号量
信号量是一种用于进程间通信的同步机制,主要用于管理进程间的资源访问,避免竞态条件。信号量的核心思想是通过信号(通常是整数)来控制对共享资源的访问。它在多进程或多线程环境中非常常用,尤其是需要协调进程之间的资源使用时。
本质上是一个计数器,这个计数器可以递增(表示释放资源)或递减(表示占用资源)。
有两个操作:
• P操作(等待或减操作,Proberen):尝试将信号量减1,如果信号量为0,则阻塞进程,直到信号量大于0为止。
• V操作(释放或加操作,Verhogen):将信号量加1,如果有进程在等待信号量,则唤醒这些进程。
缺点:
- 容易死锁
五、信号
以上都是常规工作状态下的工作模式,对于异常情况下的工作模式,就需要用「信号」的方式来通知进程。
信号可以在应用进程和内核之间直接交互,内核也可以利用信号来通知用户空间的进程发生了哪些系统事件。
工作原理:
- 1. 发送信号:信号可以由操作系统、用户或其他进程发送给某个进程。比如,当用户按下Ctrl+C,系统会发送一个中断信号给正在运行的进程。进程也可以通过特定的系统调用(比如kill())发送信号给自己或其他进程。
- 2. 接收与处理信号:当进程接收到信号时,操作系统会暂停该进程的当前操作,并立即处理这个信号。如果进程有专门的处理函数,系统会调用这个函数来处理信号。处理完毕后,进程会继续执行之前中断的任务。
- 3. 信号的阻塞与解除阻塞:进程可以暂时阻塞某些信号,这意味着这些信号在被阻塞时不会立即处理。等到关键操作完成后,再解除阻塞并处理这些信号。这样可以避免在关键时刻被打断。
- 4. 信号的忽略与默认处理:如果进程不希望处理某些信号,可以选择忽略它们。但某些重要的信号(如SIGKILL)不能被忽略,操作系统会强制执行这些信号的默认操作(通常是终止进程)。
缺点:
- 传达有限
- 非实时
- 信号丢失
六、Socket
前面提到的管道、消息队列、共享内存、信号量和信号都是在同一台主机上进行进程间通信,那要想跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。
实际上,Socket通信不仅可以跨网络与不同主机的进程间通信,还可以在同主机上进程间通信。
参考:
5.2 进程间有哪些通信方式? | 小林coding
相关文章:

进程之间的通信方式
前言 每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。 Linux提供了以下进程通信方式: 一、管道 所谓的管道,就是内核里面的一串缓存。…...

动手学深度学习(pytorch)学习记录26-卷积神经网路(LeNet)[学习记录]
目录 LeNet模型训练 LeNet 总体来看,LeNet(LeNet-5)由两个部分组成: 卷积编码器:由两个卷积层组成; 全连接层密集块:由三个全连接层组成。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均…...

log4j 和 java.lang.OutOfMemoryError PermGen space
还是OneCoder在项目中沙箱的问题,用classloader隔离做的沙箱,反复运行用户的任务,出现永生区内存溢出: java.lang.OutOfMemoryError: PermGen space 这个问题在tomcat重复热部署的时候其实比较常见。其道理也和我们沙箱的道理基本…...

2024.9.9营养小题【2】
营养: 1、什么数是丑数? 2、数学数学,丑数的数学意义,哎,数学思维我是忘干净了。 3、可以把while循环换成for循环。由此又想到了一点,三个循环结构各有使用场景。 for(;n%factors[i]0;n/factors[i]){}...

uniapp的barcode组件去掉自动放大功能
autoZoom“false” <barcode id1 class"barcode" autoZoom"false" autostart"false" ref"barcode" background"rgb(0,0,0)" frameColor"#1C86EE"scanbarColor"#1C86EE" :filters"fil" ma…...

H5接入Steam 获取用户数据案例
官方文档地址 1.注册 Steam API Key: 你需要一个 Steam Web API Key,可以在 Steam API Key 页面 获取。https://steamcommunity.com/dev/apikey 2.使用 OpenID 登录: 实现 Steam OpenID 登录,以便用户通过 Steam 账户登录你的…...

《A Few Useful Things to Know about Machine Learning》论文导读
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl机器学习作为人工智能领域的重要分支,近年来得到了广泛的关注和应用。Pedro Domingos的经典论文《A Few Useful Things to Know about Machine Learning》为我们提供了对机器学习深入且全面的理解…...

隔壁老樊2024全国巡回演唱会重磅来袭,首站广州正式官宣!
汹涌人潮将城市填满,斑驳心绪漂浮在时间之隙,当生活的喜悲逐渐演化成歌,天空将自己负载的缄默倾泻,那些或酸涩、或热烈的点滴滑落心海,那层悬挂在「我」与世界分野的无形壁垒,渐也被曙光渗透消融。 提炼生…...

【C++】list(下)
个人主页~ list(上)~ list 四、模拟实现1、list.h(1)关于整个list的搭建①节点②迭代器③接口 (2)自定义类型实例化 2、test.cpp(1)test1(2)test2 五、额外小…...

千云物流 -低代码平台MySQL备份数据
windows备份 全量备份 创建备份目录 需要在安装数据库的服务器上创建备份目录,所有如果要做备份至少需要两倍的硬盘空间, mkdir D:\mysql_backup\full_backup准备备份脚本 创建一个windows批处理文件(例如 full_backup.bat),用来执行全量…...

MySQL:进阶巩固-视图
目录 一、视图的概述二、视图的基本使用2.1 创建视图2.2 查询视图2.3 修改视图2.4 删除视图 一、视图的概述 视图是一种虚拟存在的表,视图中的数据并不在数据库中实际的存在,行列数据来自于视图中查询的表,并且是在使用视图时动态生成的。 通…...

分布式事务Seata原理及其项目使用
0.Seata官方文档 1.Seata概念及原理 Seata是什么 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 Seata主要由三个重要组…...

JS_分支结构
if结构 这里的if结构几乎和JAVA中的一样,需要注意的是 if()中的非空字符串会被认为是trueif()中的非零数字会被认为是trueif()中的非空对象会被认为是true <script> if(false){// 非空字符串 if判断为true console.log(true) }else{ console.log(false) } if(){// 长度…...

决策树(Decison Tree)—有监督学习方法、概率模型、生成模型、非线性模型、非参数化模型、批量学习
定义 ID3算法 输入:训练数据集(T= { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } \left\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\right\} {(x1,y1),(x2,y2),⋯,(xN,yN)}),特征集A阀值 ε \varepsilon ε 输出:决策树T (1)若D中所有实例属于同一…...

java 自定义注解校验实体类属性
直接上代码 1.是否启用参数校验注解 Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface EnableArgumentsCheck {/*** 是否启用*/boolean enable() default true;} 2.参数校验自定义注解 /*** 参数校验自定义注解* 属性定义&#…...

光伏并网发电系统中电能质量监测与优化技术探讨
0引言 随着清洁能源技术的持续进步与广泛应用,光伏并网发电系统亦逐步崭露头角。作为一种关键的电力供应方式,其受到了广泛的关注。然而,由于天气等外部条件的影响,光伏发电系统面临若干挑战。电能质量问题,诸如电压波…...

网页解析的那些事
Vue 方面 模板语法理解 熟悉 Vue 的模板语法,包括插值表达式(如{{ message }})、指令(如v-if、v-for、v-bind等)。理解这些语法元素如何将数据与 DOM 元素进行绑定和交互。例如,v-for指令用于循环渲染列表数…...

从文字到世界:2024外语阅读大赛报名开启,赛氪网全程护航
中国外文局CATTI项目管理中心与中国外文界联合宣布,将举办2024年外语阅读大赛,旨在激发外语学习兴趣,选拔并培养优秀的语言应用人才,同时向世界展示和传播具有中国特色的优秀文化。此次大赛旨在激发外语学习兴趣,选拔优…...

微信小程序知识点(二)
1.下拉刷新事件 如果页面需要下拉刷新功能,则在页面对应的json配置文件中,将enablePullDownRefresh配置设置为true,如下 {"usingComponents": {},"enablePullDownRefresh": true } 2.上拉触底事件 在很多时候&#x…...

Springcould -第一个Eureka应用 --- day02
标题 Eureka工作原理Spring Cloud框架下的服务发现Eureka包含两个组件,分别是:Eureka Server与Eureka Client。Eureka Server:Eureka Client: 搭建Eureka Server步骤:步骤1:创建项目,引入依赖步…...

RedissonClient 分布式队列工具类
注意:轻量级队列可以使用工具类,重量级数据量 请使用 MQ 本文章基于redis使用redisson客户端实现轻量级队列,以及代码、执行结果演示 一、常见队列了解 普通队列:先进先出(FIFO),只能在一端添…...

protobuf使用
我下载的是 protobuf-27.4 以下使用vs2022 根据readme,执行如下命令 "C:\Program Files\CMake\bin\cmake.exe" -G "Visual Studio 17 2022" -DCMAKE_INSTALL_PREFIXC:\Users\x\Downloads\install C:\Users\x\Downloads\protobuf-27.4 -D…...

【微处理器系统原理与应用设计第十二讲】通用定时器设计二之PWM波实现呼吸灯的功能
一、基础知识 1、寄存器的配置 (1)GPIOX_AFRL:GPIO复用功能低位寄存器 GPIOX_AFRH:GPIO复用功能高位寄存器 (2)配置PA5 GPIOA->MODER(端口模式寄存器),10为复用功…...

2025秋招NLP算法面试真题(十九)-大模型分布式训练题目
目录: 理论篇 1.1 训练大语言模型存在问题? 1.2 什么是点对点通信? 1.3 什么是集体通信? 1.4 什么是数据并行? 1.5 数据并行如何提升效率? 1.6 什么是流水线并行? 1.7 什么是张量并行 (intra-layer)? 1.8 数据并行 vs 张量并行 vs 流水线并行? 1.9 什么是3D并行? 1.1…...

线程池的应用
1.线程的执行机制 线程分为用户线程 和 内核线程 内核线程就是系统级别的线程,与cpu逻辑处理器数量对应的 用户线程就是使用java代码创建的Thread对象 用户线程必须与内核线程关联(映射),才能执行任务 当用户线程多于内核线程时…...

OPenCV结构分析与形状描述符(5)查找图像中的连通组件的函数connectedComponents()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 connectedComponents 函数计算布尔图像的连通组件标签图像。 该函数接受一个具有4或8连通性的二值图像,并返回 N,即标签…...

HCIA--实验十三:VLAN间通信子接口实验/双单臂路由实验
一、实验内容 1.需求/要求: 将两个单臂路由通过两台交换机连接起来,成为双臂路由,并探讨这么做的原因。实现全网通,让任何一台主机之间都可以通信。 二、实验过程 1.拓扑图: 2.步骤: 1.给PC配置ip地址…...

AIStarter市场指南:项目分享与框架优化【AI绘画、写作、对话、办公、设计】
随着人工智能技术的飞速发展,越来越多的开发者和爱好者希望能够将自己的创意和项目分享给更多人。AIStarter作为一个专注于AI领域的平台,正致力于打造一个开放的应用市场,让创作者能够轻松分享他们的项目,同时也方便其他用户下载和…...

机器学习第8章 集成学习
目录 个体与集成BoostingBagging与随机森林Bagging随机森林 结合策略平均法投票法学习法 个体与集成 定义:集成学习,也叫多分类器系统、基于委员会的学习等,它是一种通过结合多个学习器来构建一个更强大的学习器的技术。如下图所示 在这里&a…...

京东鸿蒙上线前瞻——使用 Taro 打造高性能原生应用
背景 2024 年 1 月,京东正式启动鸿蒙原生应用开发,基于 HarmonyOS NEXT 的全场景、原生智能、原生安全等优势特性,为消费者打造更流畅、更智能、更安全的购物体验。同年 6 月,京东鸿蒙原生应用尝鲜版上架华为应用市场,…...