问题标签 [aio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
25497 浏览

linux - POSIX 异步 I/O (AIO) 的现状如何?

网络上散布着一些页面,它们以不同的详细程度描述了 POSIX AIO 设施。它们都不是最近的。目前尚不清楚他们到底在描述什么。例如,此处用于 Linux 内核异步 I/O 支持的“官方”(?)网站说套接字不起作用,但我的 Ubuntu 8.04.1 工作站上的“aio.h”手册页似乎都暗示了这一点它适用于任意文件描述符。然后还有另一个项目似乎在库层工作,文档更少。

我想知道:

  • POSIX AIO 的目的是什么?鉴于我能找到的最明显的实现示例说它不支持套接字,整个事情对我来说似乎很奇怪。它只是用于异步磁盘 I/O 吗?如果是这样,为什么要使用超通用 API?如果不是,为什么磁盘 I/O 首先受到攻击?
  • 我可以在哪里查看完整的POSIX AIO 程序示例?
  • 真的有人用过吗?
  • 哪些平台支持 POSIX AIO?他们支持其中的哪些部分?<aio.h>是否有人真正支持似乎承诺的暗示的“任何 FD 的任何 I/O” ?

我可以使用的其他多路复用机制非常好,但是那里漂浮的随机信息片段让我很好奇。

0 投票
6 回答
10712 浏览

linux - 在 Linux 上使用 POSIX AIO lib 编译 C++ 程序

在 Linux 上编译使用 POSIX aio 库(例如 aio_read()、aio_write() 等)的示例程序时,我遇到了链接器的困难。

我正在运行带有 2.6 内核的 Ubuntu,并使用了 apt-get 实用程序来安装 libaio。但即使我正在链接 aio 库,编译器仍然会给我链接器错误。

如果不在库 libaio.a 中,所有这些 aio_x 函数实际定义在哪里?

0 投票
4 回答
4946 浏览

linux - POSIX AIO 库和回调处理程序

根据有关 aio_read/write 的文档,AIO 库可以通过两种方式通知您的应用程序异步文件 I/O 操作已完成。1)您可以使用信号,2)您可以使用回调函数

我认为回调函数比信号更可取,并且可能更容易集成到更高级别的多线程库中。不幸的是,这个功能的文档至少可以说是一团糟。一些来源,例如sigevent struct 的手册页,表明您需要将 sigevent 结构中的 sigev_notify 数据成员设置为 SIGEV_CALLBACK,然后提供函数处理程序。据推测,处理程序是在同一个线程中调用的。其他文档表明您需要将 sigev_notify 设置为 SIGEV_THREAD,这将在新创建的线程中调用回调处理程序。

无论如何,在我的 Linux 系统(带有 2.6.28 内核的 Ubuntu)上似乎没有在任何地方定义 SIGEV_CALLBACK,但 SIGEV_THREAD 像宣传的那样工作。不幸的是,创建一个新线程来调用回调处理程序似乎效率很低,尤其是当您需要调用许多处理程序时。最好使用现有的线程池,类似于大多数网络 I/O 事件多路分解器的工作方式。某些版本的 UNIX,例如 QNX,包含一个 SIGEV_SIGNAL_THREAD 标志,它允许您使用指定的现有线程调用处理程序,但这似乎在 Linux 上不可用,它似乎甚至不是 POSIX 的一部分标准。

那么,是否可以以在预分配的后台线程/线程池中调用用户处理程序的方式使用 POSIX AIO 库,而不是在每次调用处理程序时创建/销毁新线程?

0 投票
4 回答
5605 浏览

linux - 如何在单个事件循环中同时使用 AIO 和 epoll?

如何将 AIO 和 epoll 组合在一个事件循环中?

谷歌在 2002 年和 2003 年发现了很多关于统一它们的讨论,但不清楚是否发生了什么事,或者是否有可能。

有没有人使用 eventfd 作为 aio 信号的 epoll 循环?

0 投票
1 回答
2734 浏览

posix - 重温“如何同时使用 aio 和 epoll”

关注如何在单个事件循环中同时使用 AIO 和 epoll?.

linux 中实际上有 2 个“aio”API。有 POSIX aio(aio_* 系列函数),包含在我相信由 RedHat(?)开发的 glibc 和 libaio 中,即 io_* 系列。

第一个允许通过 aio_sigevent aiocb 成员注册通知请求。这可以很容易地与 ppoll()/pselect() 事件循环集成。如果您想将 POSIX aio 与 epoll() 集成,那么您需要将信号转换为虚拟 fd(可能是管道)上的事件并使用 epoll 监听它,同时以经典方式或使用 ppoll/ 捕获信号选择。首选(普通 sighandlers)有多安全,取决于应用。也许在 epoll 上,但我并不完全了解它的内部结构。我可以安全地假设,如果我有一个基于 epoll 的应用程序并且我想添加 POSIX aio 支持,那么我就完蛋了?这是我的问题。

第二个 AIO 实现 libaio - 确实可以与 eventfd() 一起使用(结构 iocb 具有预期为零的 aio_resfd 成员或将 AIO 结果传递到的 eventfd)。但这不是书本上的。POSIX 指定的,即。

我梦想自己成为一个*BSD 用户,一切都很清楚。您拥有对 AIO 事件的 POSIX AIO 和 kqueue() 支持。晶莹剔透。像许多其他事情一样。

0 投票
4 回答
3873 浏览

c++ - OS X 与 Linux 上的 AIO - 为什么它在 Mac OS X 10.6 上不起作用

我的问题很简单。为什么下面的代码可以在 Linux 上运行,而不能在 Mac OS X 10.6.2 Snow Leopard 上运行。

要编译,将文件保存到 aio.cc,然后g++ aio.cc -o aio -lrt在 Linux 和g++ aio.cc -o aioMac OS X 上编译。我使用 Mac OS X 10.6.2 在 Mac 上进行测试,使用 Linux 内核 2.6 在 Linux 上进行测试。

我在 OS X 上看到的失败是 aio_write 失败并显示 -1 并将 errno 设置为 EAGAIN,这仅表示“资源暂时不可用”。这是为什么?

更新(2010 年 2 月):OSX 根本不支持套接字上的 AIO。无赖!

0 投票
1 回答
1676 浏览

multithreading - I/O 完成端口 (Windows) 或异步 I/O (AIO) 是否会提高多线程服务器处理大量请求的性能?

我想对 Windows 使用 I/O 完成端口,对我的服务器应用程序的 solaris 和 Linux 版本使用异步 I/O (AIO)。应用程序服务器是多线程的,它可以接受大量并发 TCP 连接,并且每个连接可以处理许多请求。这个标准是否足以使用最新的 AIO?是否有任何标准化可以使一个代码用于所有平台。

谢谢,纳迦

0 投票
1 回答
2093 浏览

c - Linux下的AIO网络套接字和零拷贝

我一直在尝试异步 Linux 网络套接字(aio.h/librt 中的 aio_read 等),我一直试图找出的一件事是这些套接字是否是零拷贝。到目前为止,我读到的几乎所有内容都在讨论文件 I/O,而我感兴趣的是它的网络 I/O。

AIO 使用起来有点麻烦,我怀疑它是不可移植的,所以想知道它是否值得坚持使用。零拷贝几乎是唯一的优势(尽管对我来说是一个主要的)它会比(非阻塞)选择/epoll ..

0 投票
5 回答
1081 浏览

c - Posix AIO 坏/坏了?

我正在研究一个 TFTP 实现,它正在从一个复杂的多线程实现过渡到一个单线程/单进程实现,它使用状态机来跟踪连接的会话的状态。TFTP 足够简单,并且并发会话的数量足够小,除了大量的代码大小和复杂性节省之外,对软件实际上没有任何影响。

当然,当其他人连接时,我不能只阻止单个会话。为了解决这个问题,我的第一个想法是 POSIX AIO,尽管经过一些研究我读到它是

  • 记录不充分,不完整
  • 仅适用于磁盘 I/O 并且不支持套接字,或者适用于套接字但仅用于读/写 - 不适用于侦听。

此链接 ( http://davmac.org/davpage/linux/async-io.html )中包含一个示例,尽管我也找到了其他示例。08年之前的 stackoverflow 帖子( POSIX 异步 I/O (AIO) 的状态是什么? )中给出了一些额外的观点。

对于 C 开发人员来说,AIO 是否仍然像人们声称的那样破碎?人们真的不使用 AIO,而是主要坚持轮询/选择或有限大小的线程池吗?

0 投票
1 回答
471 浏览

linux - 我在哪里可以获得有关 Linux 2.6.x 上 aio 的最新信息

最近在学习如何写一个高性能的web服务器。RedHat有个实验说epoll比aio快。有人说是因为 Linux 内核中的 aio 是用 pthread 实现的。我很难找到最新的信息来证明这一点。另外我不知道现在Linux上的epoll是否仍然比aio好?所以我想知道我在哪里可以获得有关Linux 2.6.x上的aio的最新信息。多谢!