下图是Linux处理IO调用的流程图:
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数据到用户进程空间后再发通知,等着内核回调自己,就拿到数据了。
参考资料: