背景
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 模型,分为两个阶段:
- 等待数据准备好
- 将数据从内核复制到用户空间
伪代码如下:
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 多路复用模型 |
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于