异步 I/O 子系统

同步输入/输出 (I/O) 在您等待时发生。 在 I/O 操作完成之前,应用程序处理无法继续。 与此相反, 异步 I/O (异步 I/O , AIO) 操作在后台运行,并且不会阻止用户应用程序。 这会提高性能,因为 I/O 操作和应用程序处理可以同时运行。

许多应用程序 (例如,数据库和文件服务器) 都利用了重叠处理和 I/O 的功能。 这些 AIO 操作使用各种类型的设备和文件。 此外,多个 AIO 操作可以在一个或多个设备或文件上同时运行。 使用 AIO 通常会提高这些类型应用程序的 I/O 吞吐量。 但是,实际性能在一定程度上取决于应用程序一次可以发出的并发 I/O 请求数。 在未使用 AIO 快速路径时,性能还取决于处理 I/O 请求的 AIO 服务器进程正在运行的数量。 有关快速路径的更多信息,请参阅 标识当前使用的 AIO 服务器数

每个 AIO 请求都在应用程序的地址空间中具有相应的控制块。 当发出 AIO 请求时,会在控制块中建立句柄。 此句柄用于检索该请求的状态和返回值。

应用程序使用 aio_readaio_write 子例程来执行 I/O 操作。 一旦请求已排队,控制就会从子例程返回到应用程序。 当磁盘操作被执行时,应用程序可以继续处理。

内核进程 (kproc) ,称为 AIO 服务器 (AIOs) ,从它被从队列中取出到完成的每个请求由它负责。 服务器数限制可以同时在系统中进行的磁盘 I/O 操作的数量。

minservers 可调参数的缺省值为 3,而 maxservers 可调参数的缺省值为 30。 在很少运行使用 AIO 的应用程序的系统中,这通常是足够的。 对于具有许多使用 AIO 的磁盘驱动器和关键应用程序的环境,缺省值可能太低。 服务器不足的结果是磁盘 I/O 似乎比应有的速度要慢得多。 请求不仅在队列中花费过多的时间,而且服务器与磁盘驱动器的比率很低,这意味着寻道优化算法对每个驱动器的请求进行处理的次数太少。

如果使用 mmap (映射段) 创建控制块或缓冲区,那么 注: AIO 不工作。

有两个 AIO 子系统。 原始 AIX® AIO (现在称为 LEGACY AIO) 具有与可移植操作系统接口 (POSIX) 兼容的 POSIX AIO 相同的功能名称。 两者之间的主要差别涉及不同的参数传递。 这两个子系统都在 /usr/include/sys/aio.h 文件中定义。 _AIO_AIX_SOURCE 宏用于区分两个版本。

注: 当使用此文件来编译具有 LEGACY AIO 函数定义的 AIO 应用程序时,必须定义 /usr/include/sys/aio.h 文件中使用的 _AIO_AIX_SOURCE 宏。 使用 aio.h 文件的缺省编译适用于具有新的 POSIX AIO 定义的应用程序。 要使用 LEGACY AIO 函数定义,请在源文件中执行以下操作:

#define _AIO_AIX_SOURCE 
#include <sys/aio.h>
或者在命令行上编译时,输入以下内容:

xlc ... -D_AIO_AIX_SOURCE ... classic_aio_program.c

对于每个 AIO 函数,都有一个旧定义和一个 POSIX 定义。 LEGACY AIO 具有额外的 aio_nwait 函数,此函数虽然不是 POSIX 定义的一部分,但已包含在 POSIX AIO 中,以帮助希望从 LEGACY 移植到 POSIX 定义的人员。 POSIX AIO 具有额外的 aio_fsync 函数,此函数未包含在 LEGACY AIO 中。 有关这些函数的列表,请参阅 异步 I/O 子例程