2、Linux IO模型

下图是Linux处理IO调用的流程图:

image.png

Linux IO模型分为5种:

  • 阻塞IO
  • 非阻塞IO
  • IO复用
  • 事件驱动IO
  • AIO

时刻记住,linux IO 分为两个过程: 1. 内核IO数据准备;2. 数据拷贝到用户进程空间;
数据准备一般耗时不确定性大,耗时也比较长;数据拷贝时间耗费比较可预测,属于脏活累活;

阻塞IO是最直接,最原始的系统IO调用,调用后进程阻塞直到IO数据拷贝到了进程空间。用户进程虽然不用费力干活,但是只能干等着。

非阻塞IO是菜逼设计,在第一个阶段准备IO数据的时候,一般比较耗时,所以有人想到拆分系统调用,并且不停轮询第一个阶段IO数据是否准备ok了,很耗费CPU。

IO复用也是菜逼设计,只是把一次系统调用拆分为两个,并没有解决大的实际问题。

事件驱动IO是真正的IO模型升级,通过修改底层OS机制,将第一个系统调用修改为内核回调模式,由内核事件驱动发起第二次系统调用来复制IO数据到内存。这是一个很大的模型升级,在nginx等很多系统里,基于事件驱动的IO模型应用广泛。

AIO模型是改造更彻底的升级,直接甩锅内核复制IO数据到用户进程空间后再发通知,等着内核回调自己,就拿到数据了。


参考资料:

浅谈Linux下的五种I/O模型

浅谈select、poll、epoll三个系统调用

IBM事件驱动模型分享

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容