提交请求不等于操作完成

读取文件或处理网络数据,可能需要等待外部设备或通信过程。异步接口允许先提交所需操作,再通过其他机制取得完成状态,使程序能够把这段等待与其他工作重叠。

POSIX AIO用aio_read等接口排队请求,另用aio_error检查状态、aio_return取得完成结果。成功安排请求与真正取得所需数据是不同阶段,错误也可能在操作进行或完成时才被报告。

参考:[1]

等待期间仍要维护操作状态

请求尚未完成时,程序需要保存关联信息,才能把结果送回正确的使用者。POSIX AIO的控制块记录文件、偏移、缓冲区和通知方式,通知可以采用信号、线程或不主动通知等约定。

异步并没有让缓冲区立刻不再重要。Linux的POSIX AIO说明要求操作期间保持控制块与数据缓冲区有效,不能任意修改它们。取消也只是尝试取消待办,使用者仍须核对最终状态,而不是提交后马上回收所有相关资源。

参考:[1]

异步接口可以采用不同实现

对调用者呈现异步结果,并不能单独说明底层完全由内核执行。Linux手册介绍的glibc POSIX AIO使用用户态线程安排I/O;事件循环也可以把原本阻塞的函数交给执行器处理。

因此比较性能时,需要区分接口行为、等待机制和后台实际消耗的线程或其他资源。异步能改善等待的组织,却不会减少必须传输的数据量,也不能自动保证无限增大并发数仍然更快。

参考:[1] [2]