理解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 是否有时间发生,并通知操作系统,但用户程序不知道
- 一般 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多路复用的更多相关文章
- Python:通过一个小案例深入理解IO多路复用
通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import time start = time.time() ...
- 一文彻底理解IO多路复用
在讲解IO多路复用之前,我们需要预习一下文件以及文件描述符. 什么是文件 程序员使用I/O最终都逃不过文件. 因为这篇同属于高性能.高并发系列,讲到高性能.高并发就离不开Linux/Unix,因此这里 ...
- 概念理解-IO多路复用
epoll 是 Linux 内核为处理大批量文件描述符而作了改进的 poll,是 Linux 下多路复用 IO接口 select/poll 的增强版本 在 linux 的网络编程中,很长时间都在使用 ...
- 最快理解 - IO多路复用:select / poll / epoll 的区别.
目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...
- IO多路复用,同步,异步,阻塞和非阻塞 区别
一.什么是socket?什么是I/O操作? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切都是 ...
- 趣谈IO多路复用的本质
在<轻松搞懂5种IO模型>中,我发起了一个投票. 答案是[同步IO多路复用].目前,60%的朋友答对了.原因这里解释一下. 同步和异步的概念区别 同步:线程自己去获取结果.(一个线程) 异 ...
- IO多路复用之select,poll,epoll个人理解
在看这三个东西之前,先从宏观的角度去看一下,他们的上一个范畴(阻塞IO和非阻塞IO和IO多路复用) 阻塞IO:套接口阻塞(connect的过程是阻塞的).套接口都是阻塞的. 应用程序进程-----re ...
- IO多路复用的理解
最近看了<后台开发核心技术与应用实践>有关select.poll和epoll部分以及相关的一些博客,学习了这三个函数的使用方法和区别,写一个易理解的总结. IO多路复用 之前程序中使用的I ...
- 深入理解计算机操作系统——12章:多进程,IO多路复用
三种并行的应用程序: 1. 基于进程的并发编程: 2. 基于IO多路复用的并发: 3. 基于线程的并发编程: 12.1 基于进程的并发编程 进程的优劣: (1)进程间共享文件表,但不共享用户地址空间, ...
- IO多路复用?我所理解的IO模式
1:IO的过程 当我们调用系统函数read时,一般会经历两个阶段: 1:等待数据准备(waiting for the data be ready) 2:将数组从内核拷贝到进程(从内核态到用户态)(co ...
随机推荐
- vscode element-plus/lib/theme-chalk/index.css报错路径找不到
vscode element-plus/lib/theme-chalk/index.css报错路径找不到 import { createApp } from 'vue' import './styl ...
- JavaScript 常用 Web APIs
Web APIs Web APIs DOM 页面文档对象模型 DOM 树 获取元素 事件 监听事件 事件解绑 操作元素 样式属性操作 结点操作 结点关系 创建节点 DOM 事件流 事件对象 常用鼠标事 ...
- JavaScript小面试~宏任务和微任务
首先,我们要知道JavaScript是单线程调用,在程序启动的时候,会把不同的代码段分派到不同的调用栈,同步任务在同步栈中直接执行,宏任务分派到宏任务栈,微任务会分配到微任务栈,分配好之后,调用栈会被 ...
- Python用shp文件裁剪多个遥感影像的方法
本文介绍基于Python中ArcPy模块,基于矢量数据范围,对大量栅格遥感影像加以批量裁剪掩膜的方法. 首先,话不多说,本文所需要的代码如下所示. # -*- coding: utf-8 -* ...
- 基于动态数据源的SAAS系统(SpringBoot+MybaitsPlus+Durid)
一.什么是SAAS系统 SAAS全称 Software as a Service,软件即服务.本人接触SAAS也在近两年:在我的理解,SAAS不是特指某种系统,它是提供某类产品的系统服务平台,让第三方 ...
- 【Java】【常用类】SimpleDateFormat 简单日期格式化类
Date类的API不易于国际化,大部分基本摈弃了 java.text.SimpleDateFormate 不和语言环境有关的方式来格式化和解析日期的具体类 支持 文本转格式,格式转文本 public ...
- 【Uni-App】关于获取手机系统信息的项目实践
原因是这里APP下载方式的问题 安卓 和 IOS都可以写A标签跳转访问附件资源 但是甲方对这种下载方式并8满意[安卓行 苹果8行, 苹果行,安卓又8行] 通过 uni.getSystemInfo来判断 ...
- 【Uni-App】组件笔记
官网文档地址: https://uniapp.dcloud.io/component/README 组件是视图层的基本组成单元. 组件是一个单独且可复用的功能模块的封装. 每个组件,包括如下几个部分: ...
- 【转载】 TensorFlow之name_scope/variable_scope
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u013745804/article/de ...
- Google在放弃Tensorflow后推出Google版本的Pytorch框架 —— Jax
相关: 谷歌放弃TensorFlow了 虽然在某种上来说,Google已经放弃了Tensorflow框架,但是由于Tensorflow的历史地位所造成的遗留应用,因此Tensorflow框架已经处于维 ...