文件I/O方式比较

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过程中,都包含两个步骤:等待(数据准备好)、拷贝数据。
在实际应用场景中,等待消耗的时间往往都远远高于拷贝的时间

猜你喜欢

转载自blog.csdn.net/lindaxym/article/details/79803287
今日推荐