5种IO模型学习笔记

  |   0 评论   |   832 浏览

背景

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多路复用模型

来源

评论

发表评论

validate