- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
既然写入是立即进行的(复制到内核缓冲区并返回),那么使用 io_submit 进行写入有什么好处?
事实上,它 (aio/io_submit) 看起来更糟,因为您必须在堆上分配写入缓冲区并且不能使用基于堆栈的缓冲区。
我的问题只是关于写入,而不是读取。
编辑:我说的是相对较小的写入(最多几 KB),而不是 MB 或 GB,因此缓冲区复制应该不是大问题。
最佳答案
将缓冲区复制到内核不一定是即时的。
首先内核需要找到一个空闲页面。如果没有(这很可能在沉重的磁盘写入压力下),它必须决定驱逐一个。如果它决定驱逐一个脏页(而不是驱逐你的进程),它必须在它可以使用该页面之前实际写入它。
当饱和写入慢速驱动器时,Linux 中存在一个相关问题,页面缓存会被慢速驱动器支持的脏页填满。每当内核出于任何原因需要一个页面时,都需要很长时间才能获取一个页面,结果整个系统会卡住。
与系统的写入压力相比,每个单独写入的大小更不相关。如果您有一百万个小写入已经排队,这可能是必须阻塞的一个。
关于分配是在栈上还是堆上也不太相关。如果您想要高效地分配要写入的 block ,您可以使用专用池分配器(来自堆),而不是为通用堆分配器付费。
aio_write() 通过根本不将缓冲区复制到内核中来解决这个问题,它甚至可能直接从缓冲区中 DMAd(考虑到对齐要求),这意味着您也可能保存副本。
关于Linux 异步 (io_submit) 写入 v/s 正常(缓冲)写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19419090/
我正在通过libaio使用Linux内核AIO,我必须在上一个完成之前提交下一个读取操作。问题是 io_submit() 会阻塞一段时间,正如我可以从间隔中推断的那样,它会等待上一个操作完成。 我知道
Linux 中的io_submit() 系统调用是否保证同一进程多个顺序io_submit() 提交的每个操作的执行顺序? 考虑以下示例:我在文件描述符上提交了一些 write() 操作,例如: io
我正在读这个tutorial关于异步磁盘文件 I/O,但是它并没有把事情说清楚,反而让我更加困惑。 有两种不同的异步。根据教程的 I/O 模型: 异步阻塞 I/O,使用 O_ASYNC 打开文件,然后
作为背景,自 80 年代以来,我一直在为数据库调整平台。所以,我过去处理过很多异步 I/O 问题。这是新的,而且很奇怪。 首先,我在 RHEL 7.1 64 位 (3.10.0-229) 上使用 Or
我正在使用 nr 高达 128 的 io_submit(..., nr, ...),但我提交的请求通常较少。 根据手册IO_SUBMIT(2) ,这是合法的,但我想知道:为什么?此外,有没有一种方法可
我正在寻找有关如何为我在 Ubuntu Linux 14.04 上运行的应用程序获得高效和高性能异步 IO 的建议。 我的应用程序处理事务并在磁盘/闪存上创建一个文件。随着应用程序通过事务进行,额外的
我正在尝试使用 python ctypes 调用 io_submit。我正在编写的代码应该适用于 32 位和 64 位 Intel/AMD 架构,但在这里我将重点关注 64 位。 我定义了以下内容:
既然写入是立即进行的(复制到内核缓冲区并返回),那么使用 io_submit 进行写入有什么好处? 事实上,它 (aio/io_submit) 看起来更糟,因为您必须在堆上分配写入缓冲区并且不能使用基
我是一名优秀的程序员,十分优秀!