- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我似乎明白了什么:
POSIX AIO
API 的原型(prototype)位于 <aio.h>
并且你用 librt(-lrt) 链接你的程序,而 libaio
<libaio.h>
中的 API并且您的程序与 libaio (-laio) 链接。
我想不通:
1.内核对这两种方法的处理方式不同吗?
2.是O_DIRECT
使用它们中的任何一个都必须标记?
如 this post 中所述, libaio 在没有 O_DIRECT
的情况下可以正常工作使用 libaio
时.好的,明白了,但是:
根据 R.Love 的 Linux System Programming 一书,Linux 支持 aio(我假设是 POSIX AIO)在常规文件上仅如果打开 O_DIRECT
.但是我编写的一个小程序(使用aio.h,与-lrt链接)调用aio_write
在没有 O_DIRECT
的情况下打开的文件上标志可以正常工作。
最佳答案
在 linux 上,这两种 AIO 实现是根本不同的。
POSIX AIO 是一种用户级实现,它在多个线程中执行正常的阻塞 I/O,因此给人一种 I/O 是异步的错觉。这样做的主要原因是:
主要缺点是您的队列深度(即您在实践中可以拥有的未完成操作的数量)受到您选择拥有的线程数量的限制,这也意味着一个磁盘上的缓慢操作可能会阻塞操作转到另一个磁盘。它还会影响内核和磁盘调度程序看到的 I/O(或数量)。
内核 AIO(即 io_submit() 等)是对异步 I/O 操作的内核支持,其中 io 请求实际上在内核中排队,按您拥有的任何磁盘调度程序排序,大概其中一些被作为异步操作(使用 TCQ 或 NCQ)转发(以人们希望的某种最佳顺序)到实际磁盘。这种方法的主要限制是并非所有文件系统都可以很好地工作或根本无法使用异步 I/O(并且可能会退回到阻塞语义),必须使用 O_DIRECT 打开文件,这对I/O 请求。如果您无法使用 O_DIRECT 打开文件,它可能仍然“工作”,因为您可以取回正确的数据,但它可能不是异步完成的,而是退回到阻塞语义。
另外请记住,io_submit() 在某些情况下实际上会阻塞磁盘。
关于linux - Linux 上 POSIX AIO 和 libaio 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8768083/
有人可以解释一下 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
我是一名优秀的程序员,十分优秀!