1、阻塞式文件I/O
如图所示,一旦进程期望读取数据,就调用read/write函数,进程从调用这些函数开始,一直到返回的这段时间里,都处于阻塞状态。当recv正常返回时,进程继续其它操作
这种模式的优点在于操作简单,但整个进程在等待过程中处于阻塞状态,不能申请到CPU执行其它操作
2、非阻塞式
如果设置某个文件IO操作为非阻塞I/O,即相当于告诉内核:如果当前没有数据可操作,将不阻塞当前进程,而是返回一个错误信息。
使用非阻塞I/O方式,虽然不阻塞当前进程,但需要反复尝试,如上图,为了从文件中获数据,当前进程需要反复调用read/recv函数,直到读取到数据
3、多路复用
多路复用方式仍然是以阻塞方式等待文件IO准备好,但其可以等待多个文件描述符,如果当前有一个或多个socket有状态发生变化,从阻塞状态返回,转而处理该文件描述符IO操作
4、信号驱动
前面三种模式都是以同步方式去获取数据,因此,内核提供了另一种异步数据处理方式,其让内核在文件描述符就绪后产生SIGIO信号,通知用户进程数据或者空间准备好,这种模式就称为信号驱动异步I/O模式
这种处理方式使用户不用重复询问内核该文件描述符是否准备好
5、异步IO
由内核在数据拷贝完成时,通知应用程序(相比于信号驱动IO,不会阻塞应用程序)
在任何IO过程中,都包含两个步骤:等待(数据准备好)、拷贝数据。
在实际应用场景中,等待消耗的时间往往都远远高于拷贝的时间