当前位置: 首页 > article >正文

Linux 五种IO模型总篇(阻塞IO、非阻塞IO、信号驱动IO、多路复用IO(select、poll、epoll)、异步IO)

Linux 五种IO模型总篇

1. IO模型介绍

IO(Input Output)简单来说就是拷贝,当底层数据没有就绪时,等待数据就绪,当数据就绪时就拷贝数据到上层。对于怎么等和拷贝的问题,衍生出了五种IO模型,阻塞IO、非阻塞IO、信号驱动IO、多路复用/多路转接IO、异步IO。前四种IO是同步IO,多路复用/多路转接IO是异步IO。

模型类型
阻塞IO同步
非阻塞IO同步
信号驱动IO同步
多路复用IO同步
异步IO异步

信号IO是同步还是异步,具有一定争议。但普遍认为信号IO也参与了IO的过程,所以信号IO也是同步IO。

IO的同步、异步的概念与线程不同,这里的同步指的是参与IO等待的过程异步指的是不参与IO等待的过程

高效IO的本质就是单位时间内,减少等的比重。对于多路复用IO来说,它的高效体现在IO,其他的IO模型高效在

每一种IO,都有其对应的使用场景,没有说哪一种IO模型在任何情况下都完胜另一种IO模型。如日常使用最多的IO是阻塞IO,虽然说阻塞IO简单,但如果代码中大量使用其他的高效IO,也会有 CPU 高负荷运转,导致服务器或程序运行效率反而下降的问题。所以在相应的场景中,应该选择合适的IO模型。

2. 阻塞IO

阻塞IO是最常见的IO,我们使用的 scanf()cin 等都是阻塞IO。

Linux阻塞IO

3. 非阻塞IO

非阻塞 IO 往往需要程序员循环的方式反复尝试读写文件描述符,这个过程称为轮询。这对 CPU 来说是较大的浪费,一般只有特定场景下才使用。

Linux非阻塞IO

4. 信号驱动IO

信号驱动IO的原理是,当底层数据就绪时,向进程发送 SIGIO 信号,通知进程调用 recv() 读取数据。由于信号驱动IO也参与了IO的过程,所以信号驱动IO也属于同步IO。

Linux信号驱动IO

5. 多路转接/多路复用IO

多路转接IO(Multiplexed IO)是一种用来同时处理多个 I/O 操作的技术,在多路转接IO模型下,多个文件描述符可以在同一个进程或线程中被管理,从而提高资源的使用效率

Linux系统规定,一个文件操作只能调用一个文件描述符,多路转接IO没有打破这个规则,为了实现多路转接IO,系统提供了三个系统调用: select()poll()epoll(),实现能够一次传递多个文件描述符,这些系统调用只专门负责IO的等待就绪,当有一个文件描述符准备好后,再就通知事件就绪,使用 recv() 拷贝读取。

5.1 select

select() 是一种较老的多路转接IO接口,它有一定的缺陷导致它不是实现多路转接IO的最优选择,但 poll()epoll() 都是较新版的Linux系统提供的,一些小型嵌入式设备的存储很小,只能使用老版本的 Linux 系统(老内核的代码编译体积小),select()在这些设备上可能是唯一的选择

Linux多路转接select

5.2 poll

poll() 结构包含了要监视的 event 和发生的 event ,接口使用比 select() 更方便。且poll 并没有最大数量限制(但是数量过大后性能也是会下降)。

Linux多路转接poll

5.3 epoll

epoll() 解决了 poll() 的部分缺陷,epoll 消除了线性扫描,使用了红黑树结构来存储监听的事件,同时也能避免注册重复文件描述符。

epoll 被公认为 Linux2.6 下最好的多路转接 IO 就绪通知方法。

Linux多路转接epoll

6. 异步IO

异步IO由于不参与数据IO的就绪,只进行数据处理处理,导致数据到达应用层具有一定滞后性,在当今社会中已经逐步淘汰(部分老系统还在使用),现在有协程作为异步IO的解决方案。


http://www.kler.cn/a/527156.html

相关文章:

  • UE5 GAS RPG Character Classes
  • 【项目初始化】
  • 线段树(Segment Tree)和树状数组
  • AI常见的算法和例子
  • Maven的单元测试
  • 数据分析系列--⑤RapidMiner进行关联分析(中文数据案例)
  • 仿真设计|基于51单片机的温湿度及甲醛检测报警系统
  • OPENPPP2 —— VMUX_NET 多路复用原理剖析
  • DeepSeek R1功能设计涉及的几个关键词
  • 数据分析系列--⑥RapidMiner构建决策树(泰坦尼克号案例含数据)
  • Spring Boot基本项目结构
  • sizeof和strlen的对比与一些杂记
  • 【multi-agent-system】ubuntu24.04 安装uv python包管理器及安装依赖
  • Windows程序设计10:文件指针及目录的创建与删除
  • 【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解
  • CSS 图像、媒体和表单元素的样式化指南
  • 音视频多媒体编解码器基础-codec
  • windows部署deepseek之方法(The Method of Deploying DeepSeek on Windows)
  • mysql中in和exists的区别?
  • 晴,初三,年已过
  • CPU 100% 出现系统中断 怎么解决
  • appmatrix平台(一个汇集原创web APP的平台)服务规划
  • 网络安全实战指南:攻防技术与防御策略
  • 洛谷P1572 计算分数
  • 3.7 audit审计功能说明和源码解读
  • C++中常用的十大排序方法之4——希尔排序