- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
根据 this tutorial在 linux 上使用 AIO 可以很容易地实现异步磁盘文件 io,至少从编程/api 的角度来看是这样。但在本教程之前和之后,我阅读了很多帖子和文章,认为这要么无法完成,要么你应该使用带补丁的 libevent 和许多其他问题。另一件事是我应该等待信号的循环,但基于本教程我可以使用回调机制,这显然使 AIO 更易于使用。
现在,我不是一个 linux 程序员,即使从长远来看我只是想找到一种直接的方法来支持 linux 上的异步磁盘文件 io,学习它并将它添加到我个人需要的异步磁盘 io 库项目。目前我在 windows 上使用重叠 io,在非 windows 平台上使用 io 工作线程。由于多线程解决方案可能很棘手,我想在 Linux 上用 AIO 替换它。
那么,本教程中描述的 AIO 有什么问题?是性能吗?使用 AIO 可以完成的操作是否有限制?
附注我不在乎代码是否不能移植到其他 POSIX 兼容平台,只要它能在主要的 linux 发行版上运行。我只关心常规磁盘文件 io。
谢谢。
最佳答案
本教程总体上概述了异步 I/O,并讨论了内核如何支持它。然后它继续谈论posix AIO(这是用于访问异步I/O的标准化API),暗示在linux上使用posix AIO API,将让您获得内核对AIO的支持。事实并非如此。
在 linux 上,实际上有两个独立的 AIO 实现:
因此,简而言之,如果您已经拥有用于磁盘 I/O 的多线程通用实现,那么使用它可能比使用 glibc 的实现更好(因为您可能对它有更多的控制权)。
如果您致力于实际使用 io_submit() 函数系列,则可能需要做很多工作才能规避对这些函数的限制。
内核 AIO 要求您的文件使用 O_DIRECT 打开。这反过来又要求所有文件偏移量、读写大小与磁盘上的 block 对齐。如果您只使用一个大文件并且您可以使它的工作方式与操作系统中的页面缓存非常相似,这通常很好。对于以任意偏移量和长度读取和写入任意文件,它会变得困惑。
如果您最终尝试使用内核 AIO,我强烈建议您考虑将一个或多个 eventfds 绑定(bind)到您的 iocb,这样您就可以使用 epoll/select 等待完成,而不必阻塞 io_getevents()。
关于Linux 磁盘文件 AIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513663/
有人可以解释一下 posix AIO 和 freebsd AIO 之间的区别吗?看起来功能是一样的,aio_read/aio_write。 我了解到linux native AIO只有在linux下才
最近在研究linux io模型,经常听说linux和windows IOCP一样,有自己的aio模型实现:Glibc aio和kernel aio。 问题: (1) 当人们说“linux native
我正在尝试在 Linux 上使用异步 io。据我所知,有 3 个选项: 内核调用(io_submit 和 friend ) libRT - 在用户空间使用线程 libRTKAIO - 不使用线程的内核
一 需求 使用 AsynchronousServerSocketChannel 搭建服务端,使用 AsynchronousSokectChannel 搭建客户端,完成客户端和服务端的一次通信。 二 实
我希望 aio 在读取操作完成时向我的程序发出信号,并根据 this page ,这样的通知可以通过内核发送的信号接收,也可以通过启动运行用户函数的线程来接收。可以通过设置 sigev_notify
根据 this tutorial在 linux 上使用 AIO 可以很容易地实现异步磁盘文件 io,至少从编程/api 的角度来看是这样。但在本教程之前和之后,我阅读了很多帖子和文章,认为这要么无法完
一丶IO模型&Java IO Unix为程序员提供了以下5种基本的io模型: blocking io: 阻塞io nonblocking io: 非阻塞io
介绍 什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll跟IO模型有什么关系?有几种经典IO模型呢?BIO、NIO、AIO到底有什么区别的? 什么是I
谁能告诉我一些使用内核 AIO(即 io_submit() 系列)的(最好是常用的)应用程序,例如任何 SQL/非 SQL 数据库等?我希望它能够在每个线程上发出队列深度超过 1 的异步读取,以完全饱
根据关于 aio_read/write 的文档,AIO 库基本上可以通过两种方式通知您的应用程序异步文件 I/O 操作已完成。要么 1) 您可以使用信号,2) 您可以使用回调函数 我认为回调函数比信号
我正在尝试在 ubuntu 上编译 nginx,我正在使用以下配置参数: ./configure \ --prefix=/usr/share/nginx \ --conf-path=/etc/
我正在玩 Java NIO2,我正在尝试编写一个基于 AsynchronousServerSocketChannel 的 TCP 聊天服务器。 对一个简单的 ECHO-Server 进行编程没有问题并
我的应用程序有时会因 SIGIO 或 SIGUSR1 信号而终止,即使我已经阻止了这些信号。 我的主线程从阻塞 SIGIO 和 SIGUSR1 开始,然后进行 2 个 AIO 读取操作。这些操作使用线
有谁知道我在哪里可以获得有关最新 Linux 内核对 aio 的内核支持状态的最新信息? Google 搜索显示的网页可能已经过时得无可救药了。 编辑: 更具体地说,我对非文件相关的描述符感兴趣,例如
我正在尝试使用 C++ 异步读取和写入磁盘(使用 Ubuntu 10.04 中的 posix aio 库),遵循此处概述的说明:aio tutorial .我可以异步读写,但恐怕会出现某种小的内存泄漏
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
在 Linux 中,您可以读取 /proc/sys/fs/aio-nr 的值,这将返回总数。在系统中所有事件的 aio 上下文中分配的事件。最大值由 /proc/sys/fs/aio-max-nr 控
作为调试 IO 生成器的一部分,我在 x64 硬件上运行的 RH 6.4 下遇到了一组奇怪的结果(在多个系统上验证): -- 应用程序使用 linux 异步 IO(即非 posix)访问原始磁盘分区(
使用内核 AIO 和 O_DIRECT|O_SYNC,不会复制到内核缓冲区,并且可以在数据实际刷新到磁盘时获得细粒度通知。但是,它需要将数据保存在 io_prep_pwrite() 的用户空间缓冲区中
我正在编写一个C程序,通过直接从原始块设备文件读取来从SSD驱动器读取数据。 我正在尝试Linux AIO(我正在谈论Linux AIO API,即linuxaio.h提供的功能,例如io_submi
我是一名优秀的程序员,十分优秀!