信号驱动 IO 可以说是 IO 读取的一个里程碑,其真正实现了异步读取数据。信号驱动 IO 其二个阶段,与上面几个是一样的。但是其在第一个阶段做到了真正的异步。信号驱动 IO 在第一阶段,其去请求内核读取数据,这时候其不会阻塞,也不会去寻轮,而是设置一个信号回调。 当数据完全拷贝到系统内核时,系统发出 SIGIO 信号,通知进程去进行第二阶段,将数据拷贝到程序缓冲区。
异步 IO 模型异步 IO 相比前面几个流程,真正做到了完全非阻塞。无论是在第一阶段,还是在第二阶段都是非阻塞。与信号驱动 IO 类似,异步 IO 模型通过信号回调的方式,在第一个阶段实现了进程的非阻塞。而当数据到达内核缓冲区之后,进程便会收到通知。
而当进程收到通知之后,进程再次将数据从内核缓冲区复制到进程缓冲区,但这时进程并不等待,而是同样设置一个信号回调。当复制完成后,进程收到通知,再进行相应的处理。
异步 IO 与信号驱动 IO 相比,做得更加彻底了!
异步 IO 不仅仅是在第一阶段实现了信号回调,其也在第二阶段实现了信号回调,从而完全实现了异步 IO 操作。
文章首发于公众号「陈树义」及个人博客 shuyi.tech,欢迎关注访问。 总结我们回顾一下这 5 种 IO 模型:
阻塞 IO 模型:硬件到系统内核,阻塞。系统内核到程序空间,阻塞。
非阻塞 IO 模型:硬件到系统内核,轮询阻塞。系统内核到程序空间,阻塞。
复用 IO 模型:硬件到系统内核,多流轮询阻塞。系统内核到程序空间,阻塞。
信号驱动 IO 模型:硬件到系统内核,信号回调不阻塞。系统内核到程序空间,阻塞。
异步 IO 模型:硬件到系统内核,信号回调不阻塞。系统内核到程序空间,信号回调不阻塞。
从上面的 5 种 IO 模型,我们可以看出,真正实现异步非阻塞的只有异步 IO 这种模型,而其他四种都是同步性 IO。因为在第二阶段:从内核缓冲区复制到进程缓冲区的时候,不可能干其他事情。
好了,关于 Linux IO 模型的分享,今天就聊到这儿。