一、IO基本概念

在平常开发过程中接触最多的就是 磁盘 IO(读写文件) 和 网络 IO(网络请求和响应)

用户进程想要执行 IO 操作的话,必须通过 系统调用 来间接访问内核空间。

当应用程序发起IO调用后,会经历两个步骤:

1、内核等待IO设备准备好数据

2、内核将数据从内核空间拷贝到用户空间

 

二、常见的IO模型

1、BIO:同步阻塞IO模型

用户进程发起 系统调用后,会一直阻塞,直到内核把数据拷贝到用户空间。

2、NIO:同步非阻塞IO模型

通过轮询的方式询问内核是否把数据准备完毕,数据就绪后再把数据拷贝到用户空间。拷贝的这个过程还是阻塞的。

但是轮询非常消耗CPU资源,因此出现了IO多路复用模型

IO多路复用模型中,用户进程首先发起select/poll/epoll调用,本质上就是使用选择器监听多个通道,等内核把数据准备好了,用户进程再发起 read系统调用,把内核数据拷贝到用户进程空间。

select调用和epoll调用本质上就是通过选择器监听多个通道,非阻塞,处理完成之后就返回

 

3、AIO:异步IO模型

应用程序发起系统调用后直接返回,当内核处理完成后,操作系统通知相应的线程进行后续的操作