问题标签 [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.
linux - Linux 中的 IO 多路复用
是否有类似于sendfile -syscall 的东西可以与多个目标文件描述符一起使用(即,不是从一个 FD 复制到另一个 FD,而是应该复制到 4 个 FD)?
我知道在谈论异步 IO 时,这被称为收集/分散,但我在 Linux AIO 文档中找不到任何内容。
linux - 使用 aio_write() 但仍然看到数据通过缓存?
我在 Linux 2.6.16.46 上玩这个代码:
这应该使用缓冲区指向的内存进行 IO 操作。尽管如此,我还是看到脏页的数量增加了,就好像我正在写入缓存一样。这是为什么?
在构建机器上,open() 中没有 O_DIRECT 支持。但是由于我没有使用 write(),这仍然是一个问题吗?
我很确定目标上有直接的 IO 支持。
c - linux 2.6中的posix aio是否支持socket文件描述符?
我在谷歌搜索了这样的问题并得到了不同的答案。我无法确定 linux 2.6 中的 posix aio 是否支持套接字文件描述符。
如果它支持 tcp 套接字,aiocb.aio_offset=0是否相对于从 tcp 套接字 fd 读取的第一个字节?
如果没有,linux中的任何异步io库是否支持socket fd?
c++ - aio.h aio_read() 和写内存泄漏
我正在尝试按照此处概述的说明在 C++ 中异步读取和写入磁盘(使用 Ubuntu 10.04 中的 posix aio 库):aio tutorial。我可以异步读写,但恐怕会有某种小的内存泄漏。我的 valgrind 输出显示有 288 个可能丢失的字节和 3,648 个仍然可以访问的字节。这些数字似乎与实际从文件中读取的字节数无关。我找不到消除这种泄漏的位置或方法——它甚至看起来像是 aio 库的问题。有没有人见过这个?完整的 valgrind 输出如下。提前致谢。
c++ - C++ 异步网络编程
我有一些简单的问题,我有一个客户端-服务器应用程序和在线发送的数据。
我希望能够恢复数据并正确处理它。
让我们采用这些结构,它们在网络上发送,前面有一个 int,它将告诉 T1 或 T2 是否跟随。如果客户端向我发送 T1,然后向我发送 T2,我是否可以保证我可以使用 asio::ip::tcp::socket.async_read() 读取完整的结构?我想设置一个处理单个结构的处理程序,但是如果我无法在单个 async_read() 中读取所有内容会发生什么?
异步操作将继续进行,直到满足以下条件之一:
- 提供的缓冲区已满。也就是说,传输的字节数等于缓冲区大小的总和。
- 发生错误。
它会丢弃无法读取的数据吗?它会触发另一个 async_read 吗?而且,如果我的客户按顺序向我发送 ID+structure ,我是否可以保证 async_read 只会获得一个 ID+structure ?或者操作系统可以优化事物并将它们放在同一个 paquet 中?正如您可能已经看到的,我有点困惑,我想在设计服务器/客户端应用程序时做出正确的决定,任何帮助将不胜感激。
谢谢你。
linux-kernel - 在没有写屏障的情况下,磁盘控制器如何处理对同一扇区的并发写入?
当我使用 O_DIRECT|O_ASYNC 打开一个文件并对同一个磁盘扇区进行两次并发写入,中间没有 fsync 或 fdatasync 时,linux 磁盘子系统或硬件磁盘控制器是否提供任何保证,即该磁盘扇区上的最终数据将是第二个写?
虽然 O_DIRECT 确实绕过了 OS 缓冲区缓存,但数据最终会出现在低级 IO 队列中(磁盘调度程序队列、磁盘驱动程序队列、硬件控制器的缓存/队列等)。我一直跟踪 IO 堆栈到电梯算法。
例如,如果以下请求序列最终出现在磁盘调度程序队列中
电梯代码将执行“反向合并”以分别从缓冲区 1,2 合并扇区 1,2。然后发出磁盘两个磁盘 IO。但我不确定磁盘扇区 1 上的最终数据是来自缓冲区 1 还是缓冲区 3(因为我不知道驱动程序/控制器的写入重新排序语义)。
场景二:
这种情况将如何处理?一个更基本的问题是,在使用 AIO 以 O_DIRECT 模式进行写入时,在没有显式写入屏障的情况下,这个请求序列能否最终进入磁盘调度程序的队列?
如果是,是否有任何排序保证,例如“多次写入同一扇区将导致最后一次写入成为最终写入”?
或者是非确定性的排序[任由磁盘控制器/其缓存重新排序障碍内的写入以优化寻道时间]
linux - Linux 中的同时套接字读/写(“全双工”)(特别是 aio)
我正在移植一个建立在 ACE Proactor 框架之上的应用程序。该应用程序在 VxWorks 和 Windows 上都能完美运行,但在内核为 2.6.XX 的 Linux(CentOS 5.5、WindRiver Linux 1.4 和 3.0)上运行失败 - 使用 librt。
我已将问题缩小到一个非常基本的问题:应用程序在套接字上开始异步(通过 aio_read)读取操作,随后在同一个套接字上开始异步(通过 aio_write)写入。由于协议是从应用程序端初始化的,因此无法完成读取操作。- 当套接字处于阻塞模式时,写入永远不会到达并且协议“挂起”。- 使用 O_NONBLOCK 套接字时,写入成功,但读取无限期返回并出现“EWOULDBLOCK/EAGAIN”错误,永远无法恢复(即使重新启动 AIO 操作)。
我浏览了多个论坛,但对于 Linux AIO 是否应该有效(而且我做错了什么)或不可能找到明确的答案。如果我放弃 AIO 并寻求不同的实现(通过 epoll/poll/select 等),是否有可能?
附件是一个示例代码,用于在非阻塞套接字上快速重现问题:
在此先感谢,Yotam。
c - aio_read 从 OS X 上的文件错误
以下代码:
在 Linux(Ubuntu 9.10,使用 -lrt 编译)上运行良好,打印
但在 OS X 上失败(10.6.6 和 10.6.5,我在两台机器上测试过):
这可能是由于 OS X 上的某些库错误,还是我做错了什么?
c++ - 如何在 Mac OS X 中获取 aio 信号处理程序的用户数据
我正在尝试在 Mac OS X 下将 aio_* 函数用于异步文件 IO,但在将某种形式的用户数据输入信号处理程序时遇到问题。
这是设置操作的代码:
然后从其他地方调用它,如下所示:
我的信号处理设置如下所示:
和像这样的实际处理程序:
所以问题是 si_value.sival_ptr 在信号处理程序中始终为 NULL,而不是我在 aiocb 结构中设置的 aio_context 指针。我一定误解了如何做到这一点,所以谁能告诉我我做错了什么?
我在 MacOSX 10.6 上运行,但如果这很重要,我正在(至少尝试)为 10.5 编译。
此外,这个问题的答案似乎表明应该完全忽略 AIO - 真的是这样吗?
更新:
我在http://lists.apple.com/archives/darwin-dev/2008/Oct/msg00054.html发现其他人有同样的问题。
我还在http://www.opensource.apple.com/source/xnu/xnu-1504.9.26/bsd/kern/kern_aio.c上查看了内核代码,如果我理解正确,sigev_value 确实被完全忽略了。我真的不知道 aio_* 函数在 Mac OS X 上的预期用途是什么。无论如何,它们似乎不能以上述方式使用。我是否误解了某些东西,或者 aio_* 函数对我的用例来说是死胡同吗?
aio - aio_write 在发布版本上失败
我正在使用 aio_write 它在调试版本中工作,但不在发布中。我检查了构造函数,所有内容都已初始化,并且没有收到有关未初始化变量的任何警告。该类收集要以 16K 块写入磁盘的数据。如果数据小于 16K,它可以工作,即使在发布版本中也是如此。如果数据大于 16K,则只写入第一个 chunk。WriteBuffer::ContinueWriteToFile 无限期地返回 WriteFileState_Active。
WriteBuffer_posix.h:
WriteBuffer_posix.cpp: