1
24
网络I/O不是AIO的优先级,因为编写POSIX网络服务器的每个人都使用基于事件的非阻塞方法。旧的Java“数十亿阻塞线程”进退维谷。 磁盘写入I/O已经被缓冲,磁盘读取I/O可以使用posix_fadvise之类的函数预取到缓冲区中。这使得直接的、无缓冲的磁盘I/O成为AIO唯一有用的用途。 直接的、无缓冲的I/O只对事务性数据库非常有用,而这些数据库往往编写自己的线程或进程来管理其磁盘I/O。 所以,在最后,让posix aio处于不服务的位置 任何 有用的目的。不要使用它。 |
2
68
利用Kqueue、EPoll、IO完成端口等技术,有效地实现了套接字I/O。异步文件I/O有点晚了(除了Windows对POSIX AIO的重叠I/O和Solaris早期支持之外)。 如果您想做套接字I/O,最好使用上面的机制之一。 因此,AIO的主要目的是解决异步磁盘I/O的问题。这很可能就是为什么Mac OS X只支持常规文件的AIO,而不支持套接字的原因(因为Kqueue可以更好地实现这一点)。 写操作通常由内核缓存,并在稍后刷新。例如,当驱动器的读取头恰好经过要写入块的位置时。 但是,对于读操作,如果您希望内核对读操作进行优先级排序和排序,那么AIO实际上是唯一的选择。这就是为什么内核(理论上)比任何用户级应用程序都能做到这一点:
也就是说,posix aio有一个非常笨拙的接口,例如:
至于使用posix aio的真实应用程序,您可以查看lighttpd(lighty),它还发布了 performance measurement 在引入支持时。 到目前为止,大多数POSIX平台都支持POSIX AIO(Linux、BSD、Solaris、AIX、Tru64)。Windows通过其重叠的文件I/O来支持它。我的理解是,只有Solaris、Windows和Linux才真正支持异步。文件I/O一直到驱动程序,而其他OSE模拟异步。带内核线程的I/O。作为例外,Linux在glibc中的posix aio实现使用用户级线程模拟异步操作,而其本机异步I/O接口(i o_submit()等)则完全是异步的,直到驱动程序为止,假设驱动程序支持它。 我认为在OSE中,不支持任何FD的POSIXAIO,而是将其限制在常规文件中是很常见的。 |
3
10
LibTorrent开发人员提供了一份关于以下内容的报告: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/ |
4
2
在glibc中实现了aio-write;aio-read或aio-write函数的第一个调用产生了许多用户模式线程、aio-write或aio-read-post请求,线程执行pread/pwrite,当它完成后,答案将被发送回被阻塞的调用线程。 内核级别也支持“真正的”aio(需要libaio,请参见io_submit调用) http://linux.die.net/man/2/io_submit );也需要O_Direct(可能不是所有文件系统都支持,但主要文件系统确实支持) 请参见这里: http://lse.sourceforge.net/io/aio.html |
Al-geBra · 在C中向POSIX共享内存对象添加一维数组 6 年前 |
yaobin Anycorn · 如何导致Linux管道失败? 6 年前 |
Omnifarious · 如何在Linux中删除补充组? 6 年前 |