由于写入无论如何都是立即的(复制到内核缓冲区并返回),使用io_submit进行写入有什么好处?
事实上,它(aio / io_submit)看起来更糟,因为你必须在堆上分配写缓冲区而不能使用基于堆栈的缓冲区。
我的问题只是关于写,而不是读。
编辑:我说的是相对较小的写入(最多几KB),而不是MB或GB,因此缓冲区副本不应该是一个大问题。
答案 0 :(得分:4)
将缓冲区复制到内核中并不一定是即时的。
首先内核需要找到一个免费页面。如果没有(这很可能是在重磁盘写压力下),它必须决定驱逐一个。如果它决定驱逐一个脏页面(而不是例如驱逐你的进程),它必须在它可以使用该页面之前实际编写它。
在使用慢速驱动器写入饱和时,linux中存在相关问题,页面缓存会填充由慢速驱动器支持的脏页。每当内核需要页面时,由于任何原因,获取一个页面需要很长时间,因此整个系统会冻结。
每次写入的大小与系统的写入压力相关性较小。如果你已经排队了一百万个小写,那么这可能是必须阻止的。
关于分配是否存在于堆栈上还是堆也不太相关。如果要高效分配要写入的块,可以使用专用的池分配器(来自堆)而不需要为通用堆分配器付费。
aio_write()通过不将缓冲区复制到内核中来解决这个问题,它甚至可以直接从缓冲区中取出DMAd(给定对齐要求),这意味着您也可能保存副本。