5 种 IO 模型学习笔记

本贴最后更新于 2390 天前,其中的信息可能已经渤澥桑田

背景

linux 下的 5 种 IO 模型

  • 阻塞式 IO(blocking I/O)
  • 非阻塞式 IO(nonblocking I/O)
  • IO 复用模型(I/O multiplexing (select and poll))
  • 信号驱动式 IO 模型(signal driven I/O, SIGIO)
  • 异步 I/O(asynchronous IO, the POSIX aio_functions)

5 种 IO 模型

阻塞式 IO

阻塞式 IO 是最容易理解的 IO 模型,分为两个阶段:

  1. 等待数据准备好
  2. 将数据从内核复制到用户空间

伪代码如下:

fd = connnect()
write(fd) // 这里是阻塞执行的. 
read(fd)
close(fd)

非阻塞式 IO

非阻塞式 IO 是一个轮询的过程.

每次执行 recvfrom 操作,来询问内核数据是否准备好。从 recvfrom 的返回值可知:

准备好了,则拷贝数据,然后返回成功。

否则没有数据好,则直接返回未准备好,等待下一次的轮询。

IO 多路复用模型

IO 复用模型也是阻塞式的 IO,但是是阻塞在 select, epoll 这样的系统调用上,可以同时对多个 fd 进行监听,效率比阻塞在 recvfrom 操作上的阻塞 IO 模型高。

信号驱动 IO 模型

应用告诉内核,数据准备好时,发送 SIGIO 信号,回调应用对应的信号处理程序。

用的很少。

异步 IO 模型

应用告诉内核,数据拷贝完成后,回调应用的信号处理程序。

小结

  • 前四种均是同步 IO 模型
  • 最后一种是异步 IO 模型
常见实现 对应的模型
select IO 多路复用模型
iocp 异步 IO 模型
java nio IO 多路复用模型
kqueue/epoll IO 多路复用模型

来源

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    946 引用 • 943 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 370 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...