我正在寻找在Linux上执行异步文件I / O的最有效方法。
POSIX glibc实现使用用户空间中的线程。
本地aio内核api仅适用于无缓冲操作,存在用于内核以添加对缓冲操作的支持的补丁程序,但是这些补丁程序已有3年的历史了,似乎没有人关心将它们集成到主线中。
我发现了许多其他允许异步I /
O的想法,概念和补丁,尽管其中大多数都在3年以上的文章中。在当今的内核中,这到底是什么呢?我已经阅读了有关servlet,调用,内核线程的内容以及我什至不记得的更多内容。
在当今的内核中执行缓冲异步文件输入/输出的最有效方法是什么?
除非您想编写自己的IO线程池,否则glibc实现是可以接受的解决方案。实际上,对于完全在用户区中运行的某些东西,它实际上出奇地好。
根据我的经验,内核实现根本无法与缓冲IO一起使用(尽管我已经看到其他人说的相反!)。如果您想通过DMA读取大量数据,那很好,但是如果您打算利用缓冲区高速缓存,那当然会浪费很多时间。
另请注意,内核AIO调用实际上可能会阻塞。由于命令缓冲区的大小有限,因此较大的读取将分成几个较小的读取。队列填满后,异步命令将同步运行。惊喜
我在一两年前遇到了这个问题,找不到解释。问周围的问题给了我“是的,这就是它的工作原理”的答案。
据我了解,尽管有几种可行的解决方案似乎已经问世多年,但支持缓冲aio的“官方”兴趣也不是很大。我已经读过的一些论据是“无论如何都不想使用缓冲区”,“没人需要”和“大多数人甚至还没有使用epoll”。所以,嗯。
epoll
直到最近,能够通过完成的异步操作发出信号是另一个问题,但是与此同时,通过确实可以很好地工作eventfd
。
请注意,glibc实现实际上将按需 生成 线程__aio_enqueue_request
。这可能是没什么大不了的,因为产卵线程是不是 说
贵的要命了,而是应该意识到这一点。如果您对启动异步操作的理解是“立即返回”,则该假设可能不正确,因为它可能首先产生了一些线程。
编辑 :
作为附带说明,在Windows下,存在与glibc AIO实现中的情况非常相似的情况,其中排队异步操作的“立即返回”假设不成立。
如果您要读取的所有数据都在缓冲区高速缓存中,则Windows将决定改为 同步 运行请求 __,因为无论如何它都会立即完成。
这是有据可查的,而且听起来也很棒。除非要复制几兆字节,或者另一个线程发生页面错误或同时(同时争夺锁)IO(很可能是很长的时间),我看到的“立即”时间是2
-5毫秒。在大多数情况下这没有问题,但是例如在16.66ms帧时间的约束下,您可能不想冒随机时间阻塞5ms的风险。因此,“可以从我的渲染线程进行异步IO没问题,因为异步不会阻塞”这一天真假设是有缺陷的。
问题内容: 考虑一个受CPU约束但又具有高性能I / O要求的应用程序。 我正在将Linux文件I / O与Windows进行比较,我完全看不出epoll将如何帮助Linux程序。内核会告诉我文件描述符“可以读取”,但是我仍然必须调用阻塞read()来获取数据,并且如果我想读取兆字节,很显然它将阻塞。 在Windows上,我可以创建带有OVERLAPPED设置的文件句柄,然后使用非阻塞I / O,
问题内容: 该文件规定,对于缓冲的默认值是: 。我目前在Red Hat Linux 6上,但是我无法弄清楚为系统设置的默认缓冲。 谁能指导我如何确定系统的缓冲? 问题答案: 由于您链接到2.7文档,因此我假设您使用的是2.7。(在Python 3.x中,这一切都变得更加简单,因为在Python级别上公开了更多的缓冲。) 所有实际上做(在POSIX系统)是调用,然后,如果你已经通过了什么,。由于您没
支持Python异步。包括对Core和ORM使用的支持,使用了异步兼容的方言。 1.4 新版功能. 注解 从SQLAlChemy 1.4.3开始的异步扩展现在可以被认为是 测试级 软件。API细节可能会更改,但是在这一点上,不太可能有重大的向后不兼容更改。 参见 对内核和ORM的异步IO支持 -初始功能发布 异步集成 -示例脚本演示了asyncio扩展中核心和ORM使用的工作示例。 Asyncio
最大的特点就是采用异步式 I/O 与事件驱动的架构设计。对于高并发的解决方案,传统的架构是多线程模型,也就是为每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式 I/O 调用时的时间开销。
我在JFrame中有一个AWT画布(我知道Swing和AWT不应该同时使用,但它在Windows上工作得很好,所以我不认为问题是由这个引起的),并使用画布中的BufferStrategy在屏幕上绘制。它在Windows上运行非常流畅,但当我试图在Ubuntu12.04上运行时,它变得慢得令人难以忍受。不仅是呈现,而且JFrame也是无响应的。当我注释掉双缓冲和渲染部分时,它又变得平滑了。我有一个A
“异步”这个名词其实很早就诞生了,但它的大规模流行确实在 Web 2.0 浪潮中,它伴随着 Ajax 的第一个 A(Asnchronous)席卷了 Web。Node 在出现之前,最习惯异步编程的程序员莫过于前端工程师了。前端编程算 GUI 编程的一种,其中充斥着各种 Ajax 和事件,这些都是典型的异步应用场景。 但事实上,异步早就存在于操作系统的底层。在底层系统中,异步通信信号量、消息等方式有了