浅谈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的数据处理,存在两个阶段:
- 等待阶段:DMA控制器从磁盘或网卡等,读取数据,将数据读取到内核空间。
- 拷贝阶段:将数据从内核空间拷贝到用户空间。
二、五种模型
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