问题标签 [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 投票
1 回答
494 浏览

linux - POSIX AIO:将完成通知关联回原始请求的任何(好)方法?

我是否认为 AIO 完成通知(无论是通过线程还是信号完成)没有提供有关哪个请求已完成的信息?除了为每个请求调用单独的回调函数之外,还有什么方法可以实现这种关联?从表面上看,您可以使用原始请求的 aiocb 结构来调用 aio_error 和 aio_return,但作为通知回调的一部分,您不会得到指向 aiocb 结构的指针。为什么似乎没有机制可以做到这一点?

0 投票
2 回答
8729 浏览

linux - Linux 磁盘文件 AIO

根据本教程,异步磁盘文件 io 可以在 linux 上使用 AIO 轻松实现,至少从编程/api 的角度来看是这样。但是在本教程之前和之后,我阅读了很多帖子和文章,这要么无法完成,要么您应该使用带有补丁的 libevent 和许多其他问题。另一件事是我应该等待信号的循环,但根据本教程,我可以使用回调机制,这显然使 AIO 更易于使用。

现在,我什至不是一个 linux 程序员,我只是想找到一种简单的方法来支持 linux 上的异​​步磁盘文件 io,学习它并将其添加到我个人项目所需的异步磁盘 io 库中。目前,我在 windows 上使用重叠 io,在非 windows 平台上使用 io 工作线程。由于多线程解决方案可能很棘手,我想在 linux 上用 AIO 替换它。

那么,本教程中描述的 AIO 有什么问题?是性能吗?使用 AIO 可以完成的操作是否有限制?

ps 我不在乎代码是否不能移植到其他兼容 POSIX 的平台,只要它适用于主要的 linux 发行版。我只关心常规磁盘文件 io。

谢谢。

0 投票
3 回答
2421 浏览

c++ - c++中的异步处理

将永远运行并处理请求的服务器需要其中的异步代码部分,该代码将执行一些数据库查询并仅在对其进行任何新更改时才更新。服务器必须永远运行,并且这个用于一次又一次执行 db 函数的函数必须异步运行,这样就不会因为每“x”分钟更新一次而妨碍服务器。

在 c++ 中如何最好地异步处理它?如何单独设置该功能以在守护程序上运行,以便它根本不会阻塞服务器?

0 投票
3 回答
4707 浏览

c++ - 带有 libaio 性能问题的 Linux 异步 IO

我正在尝试 Linux libaio 以优化服务器应用程序中的 IO 性能。我相信我已经完成了所有必要的事情(使用 O_DIRECT,将缓冲区与内存页面对齐......)。我期待对 io_submit 的调用立即返回,但一个简单的测试表明它实际上需要大约 80 微秒才能在我的核心 i7 笔记本电脑上返回。是我期望太高还是我的测试程序有问题?(用 g++ --std=c++0x -laio 编译)

0 投票
1 回答
23406 浏览

linux - Linux 上 POSIX AIO 和 libaio 的区别?

似乎明白了什么:

POSIX AIOAPI 是原型的<aio.h>,您将程序与 librt(-lrt) 链接,而其中的libaioAPI<libaio.h>和您的程序与 libaio (-laio) 链接。

我无法弄清楚:

1.内核对这两种方法的处理方式不同吗?

2.O_DIRECT使用它们中的任何一个都必须使用标志吗?

本文所述,libaio 在不O_DIRECT使用. 的情况下也能正常工作libaio。好吧,明白了,但是:

根据 R.Love 的Linux System Programming一书,Linux在使用.没有标志打开的文件没有问题。O_DIRECTaio_writeO_DIRECT

0 投票
2 回答
6304 浏览

c++ - 在 *nix 上了解异步编程的基础知识

一段时间以来,我一直在谷歌上搜索很多方法来了解在 nix 机器上实现异步编程/行为的各种方法,并且(如我之前所知)确认仍然没有真正的异步模式(并发使用单线程)适用于 Linux,适用于 Windows(IOCP)。

以下是 linux 的一些替代方案:

  1. select/poll/epoll :: 不能使用单线程完成,因为 epoll 仍然阻塞调用。此外,受监视的文件描述符必须以非阻塞模式打开。
  2. libaio :: 我所知道的是它的实现很糟糕,它仍然基于通知,而不是像 Windows I/O 完成端口那样基于完成。
  3. Boost ASIO ::它在linux下使用epoll,因此不是真正的异步模式,因为它产生了完全从用户代码中抽象出来的线程以实现前摄器设计模式
  4. libevent :: 如果我更喜欢 ASIO,有什么理由这样做吗?

现在问题来了:)

  1. 使用 epoll 编写快速可扩展网络服务器的最佳设计模式是什么(当然,这里必须使用线程:()
  2. 我在某处读到“只能在非阻塞模式下打开套接字”,因此 epoll 仅支持套接字,因此不能用于磁盘 I/O。上面的陈述有多真实,为什么不能使用 epoll 在磁盘 I/O 上进行异步编程?
  3. Boost ASIO 在 epoll 调用周围使用了一个大锁。我实际上并不了解它的含义以及如何使用 asio 本身来克服它。类似的问题
  4. 如何修改 ASIO 模式以使用磁盘文件?有没有推荐的设计模式?

希望有人也能用很好的解释来回答所有问题。任何指向说明 epoll 和 AIO 设计模式的实现细节的源链接也值得赞赏。

0 投票
1 回答
680 浏览

multithreading - AIO 可以在不创建线程的情况下运行吗?

我希望 aio 在读取操作完成时向我的程序发出信号,并且根据此页面,可以通过内核发送的信号或通过启动运行用户函数的线程来接收此类通知。可以通过设置正确的值来选择任一行为sigev_notify

我试了一下,很快发现即使设置为通过信号接收通知,也会创建另一个线程。

该文档还指出:这些功能的实现可以使用内核中的支持(如果可用)或使用基于用户级线程的实现来完成。我想根本没有线程,这可能吗?

我检查了我的内核,看起来没问题:

是否可以在没有任何(用户态)线程的情况下运行 aio(当然,除了主线程)?

编辑:我深入研究了它。librt 似乎提供了 aio 函数的集合:查看 glibc 源代码暴露了一些可疑的东西:在 /rt/aio_read.c 内部是一个函数存根:

我在子目录 sysdeps/pthread 中找到了第一个相关的实现,它直接调用__aio_enqueue_request(..., LIO_READ)了 ,进而创建了 pthread。但是当我想知道为什么在这种情况下会有一个 stub 时,我想也许 stub 可以由 linux 内核本身实现,并且 pthread 实现将是某种后备代码。

通过我的 / usr aio_read/src/linux 目录搜索会得到很多结果,我现在正试图理解这些结果。

0 投票
1 回答
4889 浏览

c++ - 异步 I/O Linux

需要异步 I/O 处理

计划在 Linux 上通过 aio* 调用使用异步 I/O

情况:

我打开了带有 AF_INET 和 SOCK_STREAM 标志的套接字 (TCP) 发送缓冲区有限制高水位线想要异步写入该套接字,并且当发送缓冲区溢出时,想要断开套接字

所以,我有问题:

  1. 当我在 TCP 套接字上对 aio_write 进行异步调用时,当 I/O 完成将到达时 - 当缓冲区写入套接字缓冲区或确认交付时?我该如何管理这种行为?

  2. 使用 lio_listio 技术如何最好地处理这个问题

问候, 安德鲁

0 投票
1 回答
2374 浏览

linux - 在 libaio 回调中正确处理上下文数据?

我正在使用内核级异步 I/O(即libaio.h)。在提交struct iocb使用之前,io_submit我使用io_set_callback将函数指针插入iocb->data. io_getevents最后,我使用并运行每个回调来获取已完成的事件。

我希望能够在回调中使用一些上下文信息(例如提交时间戳)。我能想到的唯一方法是继续使用io_getevents,但要iocb->data指向一个带有上下文和回调的结构。

有没有其他方法可以做这样的事情,并且iocb->data保证在使用时不会受到影响io_getevents?我的理解是,还有另一种方法可以自动运行回调,如果不指向函数libaio,这将是一个问题。iocb->data

这里的任何澄清都会很好。上的文档libaio似乎真的很缺乏。

0 投票
1 回答
260 浏览

linux - 未定义对“lio_listio”的引用 [posix 异步 I/O]

我试图在我的程序中使用 POSIX API 'lio_listio' 来发出多个异步 I/O 系统调用,并产生 1 个内核上下文切换的开销。

我已经包含了库 aio.h 并且还使用 -laio 标志编译了我的代码。我也安装了 libaio_devel 包。

仍然当我编译我的程序时,它给出了以下编译错误:

/home/me/bon/bon.cpp:2509:未定义对“lio_listio”的引用

有人可以建议我缺少什么。