浅谈Linux(Unix)的I/O模型

一、引言

IO指的是输入输出,在Linux操作系统中,共有5种IO模型,分别是:

  • Blocking I/O (同步,阻塞I/O)
  • Nonblocking I/O (同步,非阻塞I/O)
  • I/O multiplexing (select and poll,多路复用,同步)
  • Signal driven I/O (SIGIO,信号驱动,同步)
  • Asynchronous IO (the POSIX aio functions,异步I/O模型)

Linux I/O的数据处理,存在两个阶段:

  1. 等待阶段:DMA控制器从磁盘或网卡等,读取数据,将数据读取到内核空间。
  2. 拷贝阶段:将数据从内核空间拷贝到用户空间。

二、五种模型

2.1 Blocking I/O

阻塞I/O模型,等待数据和拷贝数据的过程,都是阻塞的

2.2 Nonblocking I/O

非阻塞I/O模型,会采用while不断尝试数据读取,没有读到数据立刻返回false,读到了就结束while,将读到的数据从内核缓冲区拷贝到用户空间中,其中while过程非常快,因此不会阻塞

2.3 I/O multiplexing

多路复用I/O模型,类似阻塞I/O,不同的是用了两次系统调用,也是尝试读取数据,等准备好后再拷贝到用户空间,不同于Blocking I/O,I/O multiplexing基于Linux的select调用,多个线程的IO可以注册在一个管道上,统一和内核交互,哪个数据准备好了,就把哪一个的数据复制到用户空间。

2.4 Signal driven I/O

信号驱动的I/O模型,是非阻塞的,发起sigaction系统调用后,立刻返回,等数据读取完成后,Linux系统会主动发送一个sigio的信号给进程,进程监听到信号后,再去调用系统调用获取数据。

2.5 Asynchronous IO

异步I/O模型,和Signal driven I/O很像,不同的是将IO请求发送给内核后,完全由内核完成拷贝,内核完成操作后,会告诉进程拷贝已完成。


"如果文章对您有帮助,可以请作者喝杯咖啡吗?"

微信二维码

微信支付

支付宝二维码

支付宝


浅谈Linux(Unix)的I/O模型
https://blog.liuzijian.com/post/linux/2023/03/30/linux-io-model.html
作者
Liu Zijian
发布于
2023年3月30日
许可协议