首页 > 其他分享 >理解IO多路复用

理解IO多路复用

时间:2024-07-19 23:29:00浏览次数:10  
标签:文件 socket 多路复用 理解 fd IO 线程 客户端

I/O 多路复用是什么?

  I/O 多路复用是用户程序通过复用一个线程来服务多个 I/O 事件的机制,我们也可以将他说成是一个线程服务多个文件描述符 fd,而 I/O 多路复用是在操作系统层面实现提供的,举个例子:Linux 平台下常见的 I/O 多路复用有:select、poll、epoll

刚刚提到文件描述符 fd,那 fd 到底是什么?有什么作用?

  • fd 是文件描述符,用来表示一个文件,我们可以通过 fd 找到对应的文件并对他进行读写操作
  • 可以说 fd 是一个索引值,能帮助我们索引到对应的 socket 文件或是已经打开的磁盘文件

那 socket 又是什么?

  • socket 文件代表操作系统内核中的一段 buffer,数据从客户端传输过来后,通过网络协议栈的处理,socket 文件中保存的就是客户端传来的数据,读取 socket 文件就能获取到客户端相关的数据,形象的说,socket 就像是一个能够进行双向数据传输的管道
  • 举个例子,当客户端和服务端建立通信,双方都存在一个 socket 文件,socket 建立内核 buffer 和用户程序的通道完成数据的传输

那数据到达我们的服务器,被用户程序读取到,中间的过程具体是什么样的?

看图:

  • 数据在客户端进行层层包装之后,传输到我们的服务器,网卡通过 DMA 技术将收到的 frame 写到操作系统的内核,接着触发 CPU 中断,让操作系统不断从 buffer 中取出数据交给协议栈处理,数据在经过协议栈处理后进入 socket 文件,所以 socket 文件中就存在了客户端相关的数据,我们就可以对这些数据进行读写操作了

什么是 DMA 技术?

  • DMA(Direct Memory Access)用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输,可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据,这样节省的 CPU 资源可供其它操作使用。

什么是 frame?

  • 一个 http 报文最终会传输到数据链路层,而链路层(以太网)的最基本单位是 frame,也叫做以太帧

问题来了,那为什么需要 I/O 多路复用?

  • 刚刚我们聊到,客户端的数据传输过来,进入了 socket 文件中,当他们发生事件的时候,用户程序需要创建线程进行处理
    •   一般 fd 对应两种事件
      •     是否可以写(缓冲区满了,可能写不下,注册事件,等到可以写了,通知我)
      •   是否可以读(缓冲区有数据的时候,就可以读了)
    •   而网卡能够知道 fd 是否有时间发生,并通知操作系统,但用户程序不知道
  • I/O 多路复用就是解决这一个问题,让线程快速得知 fd 是否有事件发生(是否可以读,是否可以写)
    •   一个线程能并发的服务多个 I/O 事件,这就是 I/O 多路复用的含义

总结:如何理解 I/O 多路复用

 

  • 如果不使用 I/O 多路复用,在并发处理多个客户端的 I/O 事件的的场景下,服务端需要通过创建子进程或者线程的方式,给每一个连接的 I/O 事件分配一个线程来处理,随着客户端越来越多,服务端需要创建更多的线程,系统的开销太大,效率太低
  • 我们需要一种机制,让一个线程能并发的服务多个 I/O 事件,这就是 I/O 多路复用的含义
  • 所以操作系统设立了多种 I/O 多路复用的机制来解决这个问题,线程可以通过 select、poll、epoll 这类 I/O 多路复用系统调用接口从内核中通过网卡获取有事件发生的 socket 集合,然后就可以通过遍历这个集合,对每一个 I/O 事件进行处理,这样就实现了一个线程并发的处理多个 I/O 事件,大大提高了效率

这就是为什么我们需要 I/O 多路复用的技术

标签:文件,socket,多路复用,理解,fd,IO,线程,客户端
From: https://www.cnblogs.com/qimoxuan/p/18312547

相关文章

  • 理解进程,线程,协程
    为什么需要进程,线程,协程?举个例子,比如:我们gorunmain.go,启动一个go程序,从磁盘读取可执行文件,将CPU要执行的命令加载到内存中,然后CPU就一直:1.读取内存指令,2.执行指令,循环往复。那我们从磁盘读取的可执行文件,读到内存,他放在什么地方呢?我们需要找一个结构体来记录这些东西......
  • 阅读翻译Prompting Engineering Guides之Introduction(提示工程简介)
    阅读翻译PromptingEngineeringGuides之Introduction(提示工程简介)关于首次发表日期:2024-07-19PromptingEngineeringGuides官网:https://www.promptingguide.ai/zh使用ChatGPT和KIMI机翻,人工润色官网上已有翻译,但是不是最新的(有些段落没有),其中很小的一部分翻译有明显错误......
  • Linux内存从0到1学习笔记(8.19 ION (一))
    一,ION简介ION(InterprocessCommunicationOverNon-ContiguousMemory)即“跨进程非连续内存通信”。是Android系统中负责内存管理的关键子系统,由Google在Android4.0ICS中引入,旨在解决当时Android设备中存在的多样化内存管理机制所带来的问题,也就是用归一化的思想来解......
  • Carousel of Combinations
    由圆排列的公式,不难有\(C(n,k)=(_k^n)\times\frac{k!}{k}\)于是答案为\(\sum_{i=1}^{n}\sum_{j=1}^{i}((_j^i)\cdot(j-1)!)mod\spacej\)显然交换求和次序,有\(\sum_{i=1}^{n}\sum_{j=i}^{n}((_i^j)\cdot(i-1)!)mod\spacei\)由威尔逊定理可将\(i\)限定在质数和\(4\)之中,再由......
  • 攻防世界Web_python_template_injection(新手模式)
    二、Web_python_template_injection1.基本知识点模版引擎模版引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这大大提升了开发效率,良好的设计也使得代码重用变得更加容易,但是模板引擎也拓宽了我们的攻击面,注入到模板中的代码可能会引发RCE或者XSS。在Jinja2......
  • CF466E Information Graph 题解
    题目链接LuoguCodeforces题意简述某公司中有\(n\)名员工。为方便起见,将这些员工从1至\(n\)编号。起初,员工之间相互独立。接下来,会有以下\(m\)次操作:员工\(y\)成为员工\(x\)的上司。保证此前\(x\)没有上司。员工\(x\)拿到一份文件并签字,随后交给他的上司......
  • 插片式远程IO模块:单通道PNP和NPN编码器模块功能和安装方法
     XD系列插片式远程I/O模块是兴达易控技术研发的分布式扩展模块。XD系列成套系统主要由耦合器、各种功能I/O模块、电源辅助模块以及终端模块组成。有多种通讯协议总线的耦合器,例如PROFINET、EtherCAT、Ethernet/IP、CclinkIE以及modbus/TCP等。I/O模块可分为多通道数字量输入模块......
  • (ECCV2024论文解读)GPSFormer: A Global Perception and Local Structure Fitting-based
    目录摘要1、引言2、方法2.1 背景3.2 全局感知模块2.3 局部结构拟合卷积泰勒级数局部结构拟合卷积显式结构引入2.4 GPSFormer点云分类部件分割任务3、实验3.13D形状分类ScanObjectNN数据集上的形状分类ModelNet40数据集上的形状分类3.2部件分割3.3小样本分类3.4消融研究全局感......
  • Visual Studio 必备插件集合:AI 助力开发
     一、前言2024年AI浪潮席卷全球,编程界迎来全新的挑战与机遇。智能编程、自动化测试、代码审查,这一切都得益于AI技术的迅猛发展,它正在重塑开发者的日常,让编写代码变得更加高效、智能。精选出最受好评、最具实用价值的VisualStudio插件,涵盖代码编辑、调试、测试、版本控制等多......
  • P1182 数列分段 Section II
    传送锚点:数列分段SectionII-洛谷题目描述对于给定的一个长度为\(N\)的正整数数列\(A_{1\simN}\),现要将其分成\(M\)(\(M\leqN\))段,并要求每段连续,且每段和的最大值最小。关于最大值最小:例如一数列\(4\2\4\5\1\)要分成\(3\)段。将其如下分段:\([4\2][4\5][1......