1、阻塞IO
在内核将数据准备好之前,系统调用会一直等待,所有的套接字默认都是阻塞方式。
阻塞IO是最常见的IO模型
2、非阻塞IO
如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码。
非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符,这个过程称为轮询,这对CPU来说是较大的浪费,一般只有在特定的场景下才使用。
3、信号驱动IO
内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作。
4、IO多路转接
虽然从流程图上看和阻塞IO类似,实际上最核心在于IO多路转接能够等待多个文件描述符的就绪状态。
5、异步IO
由内核在数据拷贝完成时,通知应用程序(而信号驱动时告诉应用程序合适可以开始拷贝数据)
小节
任何IO过程中都包含两个步骤,第一是等待,第二是拷贝,而在实际的应用场景中,等待消耗的时间往往远高于拷贝的时间,最核心的办法是让等待的时间尽量少。