I/O模型

Linux · 2023-06-27
I/O模型

I/O模型主要关注如何管理和处理输入输出操作,以确保数据能够有效地传输和处理。以下是一些常见的IO模型:

阻塞IO模型(Blocking IO Model):在这种模型中,当应用程序执行IO操作时,程序会一直阻塞(即暂停执行),直到操作完成。这意味着应用程序在等待IO操作完成期间无法执行其他任务。

非阻塞IO模型(Non-blocking IO Model):在这种模型中,应用程序可以继续执行其他任务,而无需等待IO操作完成。应用程序可以轮询或使用回调函数等方式检查IO操作的状态,并在数据准备就绪时进行读取或写入。

多路复用IO模型(Multiplexing IO Model):这种模型使用操作系统提供的多路复用机制(如select、poll或epoll),允许应用程序同时监视多个IO操作的状态。应用程序可以通过单个系统调用等待多个IO事件的完成,从而提高效率。

异步IO模型(Asynchronous IO Model):在这种模型中,应用程序发起IO操作后,不需要等待操作完成。相反,它可以继续执行其他任务,并在IO操作完成后得到通知。这种模型通常使用回调函数或事件驱动的方式来处理IO操作的结果。

每种IO模型都有其优缺点,并根据特定的应用需求和场景选择合适的模型。选择适当的IO模型可以提高系统的性能和响应能力。

无论是非阻塞IO,IO复用,还是信号驱动式IO,都不是真正意义上的IO,真正的异步IO是数据从内核空间拷贝到用户空间也是异步处理的,拷贝完成,再通知应用进程,应用进程直接读取用户空间的数据进行操作。

打个形象的比方,来对这几种IO做下区分。

我们去网上买东西,下完单之后,你可以有如下几种处理方式:

下完单之后,在门口一直等待快递小哥把快递送上门,这就是同步阻塞IO;
下完单之后就不管了,直到快递小哥打电话给你通知你去取快递,这就是同步非阻塞IO里面的信号驱动式IO;
下完单之后,你定时的去物流app上面查看你所有快递的状态,只要有快递送到了寄存点,你就去取,这就是同步非阻塞IO里面的IO复用;
下完单之后,你就不管了,直到快递小哥给你送上门,你直接拿到了快递,你不用出门就可以拿到快递了,这就是异步IO。
异步IO最关键的一点就是在读取数据的时候,将IO的buffer提交给内核,让内核往这个buffer写数据。

Theme Jasmine by Kent Liao