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