【Linux】进程间通信原理与Reactor模式

news2025/1/15 6:32:21

一、用户进程缓冲区和内核缓冲区

        缓冲区的目的,是为了减少频繁的系统IO调用。大家都知道,系统调用需要保存之前的进程数据和状态等信息,而结束调用之后回来还需要恢复之前的信息,为了减少这种损耗时间、也损耗性能的系统调用,于是出现了缓冲区。

        有了缓冲区,操作系统使用read函数把数据从内核缓冲区复制到进程缓冲区,write把数据从进程缓冲区复制到内核缓冲区中。等待缓冲区达到一定数量的时候,再进行IO的调用,提升性能。至于什么时候读取和存储则由内核来决定,用户程序不需要关心。

        在linux系统中,系统内核也有个缓冲区叫做内核缓冲区。每个进程有自己独立的缓冲区,叫做进程缓冲区。

        因此,用户程序的IO读写程序,大多数情况下,并没有进行实际的IO操作,而是在读写自己的进程缓冲区。

用户进程缓冲区


        前面提到,用户进程通过系统调用访问系统资源的时候,需要切换到内核态,而这对应一些特殊的堆栈和内存环境,必须在系统调用前建立好。而在系统调用结束后,cpu会从核心模式切回到用户模式,而堆栈又必须恢复成用户进程的上下文。而这种切换就会有大量的耗时。

        你看一些程序在读取文件时,会先申请一块内存数组,称为buffer,然后每次调用read,读取设定字节长度的数据,写入buffer。(用较小的次数填满buffer)。之后的程序都是从buffer中获取数据,当buffer使用完后,在进行下一次调用,填充buffer。

        所以说:用户缓冲区的目的是为了减少系统调用次数,从而降低操作系统在用户态与核心态切换所耗费的时间。

内核缓冲区


        除了在进程中设计缓冲区,内核也有自己的缓冲区。

        当一个用户进程要从磁盘读取数据时,内核一般不直接读磁盘,而是将内核缓冲区中的数据复制到进程缓冲区中。

        但若是内核缓冲区中没有数据,内核会把对数据块的请求,加入到请求队列,然后把进程挂起,为其它进程提供服务。

        等到数据已经读取到内核缓冲区时,把内核缓冲区中的数据读取到用户进程中,才会通知进程。当然不同的io模型,在调度和使用内核缓冲区的方式上有所不同,下一小结介绍。

        你可以认为,read是把数据从内核缓冲区复制到进程缓冲区。write是把进程缓冲区复制到内核缓冲区。

        当然,write并不一定导致内核的写动作,比如os可能会把内核缓冲区的数据积累到一定量后,再一次写入。这也就是为什么断电有时会导致数据丢失。

        所以说内核缓冲区,是为了在OS级别,提高磁盘IO效率,优化磁盘写操作。

参考连接:

十分钟带你了解!用户进程缓冲区和内核缓冲区

 二、进程空间

        进程空间分为:代码区、数据区、堆区、栈区

        linux的虚拟空4G,分为内核空间和用户空间,其中最开的(3G)0x00000000-0xBFFFFFFF为各个进程使用,也叫用户空间,最高处的(1G)0xC0000000-0xFFFFFFFF作为内核空间供内核使用,Linux内核空间由系统内的所有进程共享

        于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟地址空间(也叫虚拟内存)。其中每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB内核空间则为所有进程以及内核所共享

  1. 用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。例外情况只有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。
  2. 用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程变化,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。
  3. 每个进程的用户空间都是完全独立、互不相干的。

参考连接:

linux进程、线程及用户空间、内核空间的理解

三、进程间通信的原理

        每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到。所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区。进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信机制。

主要的过程如下图所示:

数据读写阶段,用户进程能访问内核缓冲区吗?

        用户态切换到内核态是通过系统调用实现的,比如 read就是一个系统调用。应用程序通过调用read来读写数据(将内核空间的数据搬到用户空间中,这样我们才能够对数据进行操作)。

四、Reactor模式


        要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作 线程(逻辑单元),将 socket 可读可写事件放入请求队列,交给工作线程处理。除此之外,主线程不做 任何其他实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。

        使用同步 I/O(以 epoll_wait 为例)实现的 Reactor 模式的工作流程是:

1. 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件

2. 主线程调用 epoll_wait 等待 socket 上有数据可读。

3. 当 socket 上有数据可读时, epoll_wait 通知主线程。主线程则将 socket 可读事件放入请求队列。

4. 睡眠在请求队列上的某个工作线程被唤醒,它从 socket 读取数据,并处理客户请求,然后往 epoll 内核事件表中注册该 socket 上的写就绪事件

5. 当主线程调用 epoll_wait 等待 socket 可写。

6. 当 socket 可写时,epoll_wait 通知主线程。主线程将 socket 可写事件放入请求队列。

7. 睡眠在请求队列上的某个工作线程被唤醒,它往 socket 上写入服务器处理客户请求的结果。 Reactor 模式的工作流程:
 

为什么要注册读写事件?

        因为每个进程有各自的私有用户空间(0~3G),共享1GB的内核空间。内核缓冲区的大小是有限的。进程想写时,tcp 发送缓冲区缓冲区不一定有空间,需要先注册写事件,由内核判断TCP内核缓冲区有没有写满。如果没有写满,我就可以往里面写。线程同理,差不多。

tcp 或udp收发缓冲区最小值

tcp 或udp接收缓冲区的最小值为 256 bytes,由内核的宏决定;

tcp 或udp发送缓冲区的最小值为 2048 bytes,由内核的宏决定。

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

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

相关文章

有趣的无限缓存OOM现象

作者:邹阿涛涛涛涛涛涛 想必大家都知道OOM是啥吧,我就不扯花里胡哨的了,直接进入正题。先说一个背景故事,我司app扫码框架用的zxing,在很长一段时间以前,做过一系列的扫码优化,稍微列一下跟今天…

学习ts(九)混入

对象混入 使用Object.assign()进行对象混入,最后的people会被识别为三种类型的联合类型 类混入 使用implement并非extnds实现混入。 属性在混入类里面定义,分别在类中占位,方法分别在类中定义,在混合类中占位。这告诉编译器这…

自动化的驱动力,工控机助您实现智能生产!

“智能工厂建设如火如荼,部分成果已经落地,在大规模资金投入的市场催化下,海尔、海信等制造企业通过智能工厂手段推进生产效率成倍增长的新闻层出不穷。在工业4.0时代,“中国制造2025”战略中,智能工厂构建都是其中不可…

激活函数总结(十九):激活函数补充(ISRU、ISRLU)

激活函数总结(十九):激活函数补充 1 引言2 激活函数2.1 Inverse Square Root Unit (ISRU)激活函数2.2 Inverse Square Root Linear Unit (ISRLU)激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函…

用docker-compose搭建LNMP

docker-compose搭建LNMP 一、compose 的部署1.Docker Compose 环境安装 二、编写Docker Compose1.准备依赖文件,配置nginx2.配置mysql3.配置php4.编写docker-compose.yml5.执行6.查看 一、compose 的部署 (1)公司在实际的生产环境中,需要使用…

磁盘阵列/视频集中存储/安防监控视频智能分析平台新功能:人员聚集

人工智能技术已经越来越多地融入到视频监控领域中,近期我们也发布了基于AI智能视频云存储/安防监控视频AI智能分析平台的众多新功能,该平台内置多种AI算法,可对实时视频中的人脸、人体、车辆、物体等进行检测、跟踪与抓拍,支持口罩…

Linux上实现分片压缩及解压分片zip压缩包 - 及zip、unzip命令详解

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

LiveNVR监控流媒体Onvif/RTSP功能-支持语音对讲支持非国标摄像头SDK语音对讲GB28181级联国标平台非国标转国标语音对讲

LiveNVR支持语音对讲支持非国标摄像头SDK语音对讲GB28181级联国标平台非国标转国标语音对讲 1、确认摄像头是否支持对讲2、摄像头视频类型复合流3、通道配置SDK接入4、视频广场点击播放5、相关问题5.1、如何配置通道获取直播流?5.2、如何GB28181级联国标平台&#x…

AD(第四部分---网表导入及模块化布局设计)

第四部分:网表导入及模块化布局设计 21.导入常见报错解决方法(unknow pin及绿色报错等) 将原理图导入到PCB: 在原理图界面点击右上角设计 导出后,若出现如下错误,则说明没有0805C的电容: 没有电容应该怎么办呢?需要进…

10 倍性价比,万物新生基于 StarRocks 无缝直替 Trino

小编导读: 万物新生成立于2011年,定位为“互联网环保”类型的循环经济企业,是中国最大的二手电子产品交易与服务平台。万物新生集团旗下4大业务线包含:爱回收、拍机堂、拍拍、海外业务 AHS Device。万物新生集团秉承“让闲置不用…

raft算法学习备忘

一致性共识算法 参考:分布式一致性算法应用场景,写了为什么需要共识算法,以及相比于mysql这些主从同步方式的区别。 raft算法简介 一种分布式一致性共识算法的实现方式,机制相比于其它例如paxos来说无论从可读性还是实现机制上要简单很多&…

MQTT协议抓包

MQTT通讯协议的特点 1. 概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做…

html-dom核心内容--四要素

1、结构 HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。 2、核心关注的内容:“元素”,“属性”,“修改样式”,“事件反应”。>四要素…

详解numpy.random.shuffle函数

文章目录 函数原型参数解析该函数的注意事项例子示例代码示例结果 参考 numpy的random模块中的shuffle函数用于np.ndarray数组中的元素打乱顺序,进打乱多维数组的第一维顺序。本博客详细节将该函数的API,并给出示例代码和结果。 函数原型 random.shuff…

【计算机网络】HTTPs 传输流程

HTTPS和HTTP的区别 1、HTTP协议传输的数据都是未加密的,是明文的,使用HTTP协议传输隐私信息非常不安 HTTPS协议是由SSLHTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。 2、HTTPS协议需要到CA申请证书,一般…

【C++】开源:Box2D动力学库配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Box2D动力学库配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#xff0c…

LiveNVR通过海康SDK实现Web无插件播放并实现双向语音对讲的注意事项和配置方法

1、确认摄像头是否支持对讲 可以访问摄像头自己的页面,看是否能够对讲。可以看摄像头的音频编码页面,看看音频输入有没有mic的音频输入。如下: 2、摄像头视频类型复合流 确认摄像头的视频类型,是否是复合流。 3、通道配置SD…

第三批广东省智能制造生态合作伙伴名单公布,科东软件再获殊荣!

8月22日,广东省工业和信息化厅公布了第三批广东省智能制造生态合作伙伴名单。科东软件凭借多年在工业操作系统领域的技术积累和创新实力,成功入选广东省智能制造生态合作伙伴名单(关键软件领域)。 智能制造生态合作伙伴是指为广东…

实现高效消息传递:使用RabbitMQ构建可复用的企业级消息系统

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

计算机竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…