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 多路复用的技术

理解IO多路复用的更多相关文章

  1. Python:通过一个小案例深入理解IO多路复用

    通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import time start = time.time() ...

  2. 一文彻底理解IO多路复用

    在讲解IO多路复用之前,我们需要预习一下文件以及文件描述符. 什么是文件 程序员使用I/O最终都逃不过文件. 因为这篇同属于高性能.高并发系列,讲到高性能.高并发就离不开Linux/Unix,因此这里 ...

  3. 概念理解-IO多路复用

    epoll 是 Linux 内核为处理大批量文件描述符而作了改进的 poll,是 Linux 下多路复用 IO接口 select/poll 的增强版本 在 linux 的网络编程中,很长时间都在使用 ...

  4. 最快理解 - IO多路复用:select / poll / epoll 的区别.

    目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...

  5. IO多路复用,同步,异步,阻塞和非阻塞 区别

    一.什么是socket?什么是I/O操作? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切都是 ...

  6. 趣谈IO多路复用的本质

    在<轻松搞懂5种IO模型>中,我发起了一个投票. 答案是[同步IO多路复用].目前,60%的朋友答对了.原因这里解释一下. 同步和异步的概念区别 同步:线程自己去获取结果.(一个线程) 异 ...

  7. IO多路复用之select,poll,epoll个人理解

    在看这三个东西之前,先从宏观的角度去看一下,他们的上一个范畴(阻塞IO和非阻塞IO和IO多路复用) 阻塞IO:套接口阻塞(connect的过程是阻塞的).套接口都是阻塞的. 应用程序进程-----re ...

  8. IO多路复用的理解

    最近看了<后台开发核心技术与应用实践>有关select.poll和epoll部分以及相关的一些博客,学习了这三个函数的使用方法和区别,写一个易理解的总结. IO多路复用 之前程序中使用的I ...

  9. 深入理解计算机操作系统——12章:多进程,IO多路复用

    三种并行的应用程序: 1. 基于进程的并发编程: 2. 基于IO多路复用的并发: 3. 基于线程的并发编程: 12.1 基于进程的并发编程 进程的优劣: (1)进程间共享文件表,但不共享用户地址空间, ...

  10. IO多路复用?我所理解的IO模式

    1:IO的过程 当我们调用系统函数read时,一般会经历两个阶段: 1:等待数据准备(waiting for the data be ready) 2:将数组从内核拷贝到进程(从内核态到用户态)(co ...

随机推荐

  1. System.NotSupportedException:“无法显式设置 SplitterPanel 的高度。改在 SplitContainer 上设置 SplitterDistance。”

    System.NotSupportedException:"无法显式设置 SplitterPanel 的高度.改在 SplitContainer 上设置 SplitterDistance.& ...

  2. 解决“网页源代码编码形式为utf-8,但爬虫代码设置为decode('utf-8')仍出现汉字乱码”的问题

    为了用爬虫获取百度首页的源代码,检查了百度的源代码,显示编码格式为utf-8 但这样写代码,却失败了-.. (这里提示:不要直接复制百度的URL,应该是http,不是https!!!) # 获取百度首 ...

  3. memset函数&&bzro函数_C

    // Code file created by C Code Develop #include "ccd.h" #include "stdio.h" #incl ...

  4. RestSharp编写api接口测试,并实现异步调用(不卡顿)

    首先,确保你已经安装了RestSharp NuGet包.如果没有安装,可以通过以下命令安装: bash Install-Package RestSharp 然后,在你的C#代码中,你可以按照以下步骤操 ...

  5. LinuxUDP通讯

    目录 前言 一.UDP通讯 1.UDP通讯概述 2.UDP的特点 3.UDP的应用 二.UDP基本通讯 1.socket函数 2.bind函数 2.1 主机字节序和网络字节序 2.2 点分制十进制转换 ...

  6. DrawIO安装及基本使用教程

    1.DrawIO简介 DrawIO 是一款开源免费且功能强大的绘图工具,可以用于绘制流程图.组织结构图.网络图.UML图等各种类型的图表: DrawIO 支持多种文件格式,包括XML.PNG.SVG等 ...

  7. 【Java】部门集合树状顺序展示

    一.需求效果: 表单的部门下拉选择时,可以展示部门的层级: 按照这个效果展示,但是不是树,还是原来的集合 二.实现方案: 用Java代码实现两个部分 1.展示Label效果处理 2.处理集合的树状排序 ...

  8. 【Shiro】01 概述 & 快速上手

    什么是Shiro? Apache Shiro 是Java的一个权限安全框架 一些功能:认证.授权.加密.会话管理.与Web 集成.缓存等   Shiro官网地址:[ 点击访问 ] http://shi ...

  9. 如何理解计算机类论文、机器学习论文、人工智能AI论文中的“soft”和“hard”呢?

    如何理解计算机类论文.机器学习论文.人工智能AI论文中的"soft"和"hard"呢? 最近在看论文中总看到带有"soft"和"h ...

  10. 国内的开源AI模型共享网站(AI模型的GitHub)—— modeldscope —— 对标外网的“huggingface”,modelscope好用吗?

    搞AI的应该都是知道huggingface是啥的,这里不过多介绍,简单的来说就是AI模型的Github,之所以这么说是因为计算机的项目往往都是代码文件,所有计算机项目的Github只需要上传项目的代码 ...