为了改善posix aio目前存在的问题,新的异步IO驱动:io_uring如何解决了posix aio的问题。围绕这个问题,本文首先介绍了异步IO的概念,然后介绍了posix aio存在的问题,最后根据io_uring的源码分析io_uring为什么比posix aio优异。
同步IO和异步IO
posix定义如下:
同步IO:导致请求进程阻塞,知道IO操作完成。
异步IO:不导致请求进程阻塞。
下图详细描绘了五种不同的I/O模型。I/O操作被看成两个部分:等待数据和拷贝数据到用户空间。
- 阻塞式I/O:第一阶段和第二阶段均阻塞;
- 非阻塞式I/O:第一阶段不阻塞,但是第二阶段拷贝数据阻塞;
- I/O复用:可以同时等待多个IO事件;
- 信号驱动式I/O:事件到来时通知用户程序,用户程序通过recv类似的系统调用读取数据;
- 异步I/O:两个阶段均不阻塞用户进程;

摘自:unix网络编程-卷1
native aio存在的问题
1.最大的问题就是只对O_DIRECT方式的IO支持异步,用户程序得自己实现I/O缓存;
- O_DIRECT表示内核不会为I/O数据创建buffer,硬盘数据直接通过DMA传送到用户程序指定的地址。所以用户得自己管理内存和内存对齐。也就少了文件系统带的page cache。
2.Even if you satisfy all the constraints for IO to be async, it’s sometimes not. There are a number of way

本文探讨io_uring如何改进POSIX AIO的不足,包括支持buffered IO、避免阻塞及减少系统调用。io_uring通过创建内核线程处理IO,共享SQring、CQring和sqearray内存,显著提升异步IO效率。

2613

被折叠的 条评论
为什么被折叠?



