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. oeasy教您玩转vim - 19 - 使用标记

    使用标记 回忆上节课内容 跳转到行号 200G 设置行号选项 显示行号 :se nu 显示相对行号 :se rnu 如何用命令行跳转 :100 但是我如何有的时候记不住到底跳到多少行 能否做个标记留个 ...

  2. oeasy教您玩转vim - 49 - # 命令进阶

    ​ 命令进阶 回忆上节课内容 我们上次研究vim的历史 为什么会有行编辑器这种东西 竟然是当年 没有显示器只有纸的时代的无奈之举 vim进化到今天 依然还有好多人使用 而且ssh连接的时候直接vim就 ...

  3. QT 开发快速入门

    本人 qt 业余,但有的时候要用到 qt,而又没有系统的学习,用到哪里看哪里. 环境: vs2012+ qt-vsaddins+qt5.5 qt 的按钮点击事件出发的基本要素: 1. 按钮触发函数为 ...

  4. 全网最好看的单细胞umap图绘制教程

    全网最好看的单细胞umap图绘制教程 作者按 大家或许都曾被Nature, Science上的单细胞umap图吸引过,不免心生崇拜.在这里,我们将介绍一种简单方便的顶刊级umap图可视化 全文字数|预 ...

  5. windows上传app到构建版本的方法

    ios打包好ipa文件后,ipa文件需要上架到app store,用户才能安装.而在app store里,无法直接将ipa上传,需要使用工具上传,但是官方提供的工具,比如xcode等只能安装在苹果电脑 ...

  6. 【Maven】概念知识

    怎么在Windows安装Maven https://www.cnblogs.com/mindzone/p/12701416.html 学到一个新的指令:查看相对系统变量 echo %XXX_HOME% ...

  7. 【Spring Data JPA】02 快速上手

    完成一个CRUD - 创建工程导入依赖坐标 - 配置Spring的配置文件 - 配置ORM的实体类,绑定映射关系 - 编写一个符合SpringDataJpa的dao接口 Maven依赖坐标 <p ...

  8. 【Spring-Security】Re09 CSFR处理

    一.CSRF: CSRF 全称 Cross Site Request Forgery 跨站请求伪造 又称为OneClick Attack & SessionRiding 是非法请求访问,通过伪 ...

  9. C#.Net筑基-解密委托与事件

    委托与事件是C#中历史比较悠久的技术,从C#1.0开始就有了,核心作用就是将方法作为参数(变量)来传递和使用.其中委托是基础,需要熟练掌握,编程中常用的Lambda表达式.Action.Func都是委 ...

  10. 前端黑科技:使用 JavaScript 实现网页扫码功能

    在数字化时代,二维码已经渗透到我们生活的方方面面.从移动支付到产品溯源,二维码凭借其便捷性和高效性,成为了信息传递的重要载体.而随着前端技术的不断发展,我们甚至可以使用 JavaScript 在网页端 ...