如下所述:
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()变得不必要,但如果你正在使用这些"sys_io_setup()"能力的较新内核而没有最新版本的glibc,则始终可以自己进行这些调用。当然,还有其他用户空间选项可用于异步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
select
/poll
/epoll
/kqueue
,那么当您收到文件描述符准备好的通知时,跟进阻塞的read
/write
将非常不寻常。在这种情况下,您几乎肯定希望进行非阻塞的read
或write
。 - Celada