如中所述:
http://code.google.com/p/kernel/wiki/AIOUserGuide
和这里:
http://www.ibm.com/developerworks/library/l-async/
Linux 确实在内核级别提供了异步块 I/O,API 如下:
aio_read Request an asynchronous read operation
aio_error Check the status of an asynchronous request
aio_return Get the return status of a completed asynchronous request
aio_write Request an asynchronous operation
aio_suspend Suspend the calling process until one or more asynchronous requests have completed (or failed)
aio_cancel Cancel an asynchronous I/O request
lio_listio Initiate a list of I/O operations
如果你问谁是这些 API 的用户,那就是内核本身——这里只显示了一小部分:
./drivers/net/tun.c (for network tunnelling):
static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv,
./drivers/usb/gadget/inode.c:
ep_aio_read(struct kiocb *iocb, const struct iovec *iov,
./net/socket.c (general socket programming):
static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
./mm/filemap.c (mmap of files):
generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
./mm/shmem.c:
static ssize_t shmem_file_aio_read(struct kiocb *iocb,
等等
在用户空间级别,还有 io_submit() 等 API(来自 glibc),但以下文章提供了使用 glibc 的替代方法:
http://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt
它直接将 io_setup() 等函数的 API 实现为直接系统调用(绕过 glibc 依赖项),应该存在通过相同“__NR_io_setup”签名的内核映射。在以下位置搜索内核源代码时:
http://lxr.free-electrons.com/source/include/linux/syscalls.h#L474 (URL 适用于最新版本 3.13)您会看到这些 io_*() API 在内核中的直接实现:
474 asmlinkage long sys_io_setup(unsigned nr_reqs, aio_context_t __user *ctx);
475 asmlinkage long sys_io_destroy(aio_context_t ctx);
476 asmlinkage long sys_io_getevents(aio_context_t ctx_id,
481 asmlinkage long sys_io_submit(aio_context_t, long,
483 asmlinkage long sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb,
更高版本的 glibc 应该使这些使用“syscall()”来调用 sys_io_setup() 变得不必要,但是如果没有最新版本的 glibc,如果您使用具有“sys_io_setup”这些功能的更高版本的内核,您始终可以自己进行这些调用()”。
当然,还有其他用于异步 I/O 的用户空间选项(例如,使用信号?):
http://personal.denison.edu/~bressoud/cs375-s13/supplements/linux_altIO.pdf
或者也许:
POSIX 异步 I/O (AIO) 的现状如何?
“io_submit”和朋友在 glibc 中仍然不可用(请参阅 io_submit 手册页),我已经在我的 Ubuntu 14.04 中验证了这一点,但这个 API 是特定于 linux 的。
其他像 libuv、libev 和 libevent 也是异步 API:
http://nikhilm.github.io/uvbook/filesystem.html#reading-writing-files
http://software.schmorp.de/pkg/libev.html
http://libevent.org/
所有这些 API 旨在跨 BSD、Linux、MacOSX 甚至 Windows 移植。
在性能方面我没有看到任何数字,但怀疑 libuv 可能是最快的,因为它的轻量级?
https://ghc.haskell.org/trac/ghc/ticket/8400