Вопрос в названии. В Linux передача O_DIRECT
обходит кеш страницы, выполненный буфером. Например, система базы данных будет использовать ее для управления собственным буфером.
Интересно, буферизовано ли aio_write
/ aio_read
по умолчанию или нет? Они стоят в очереди, конечно, но включает ли это копирование данных? Если они буферизируются по умолчанию, вероятно, мы можем просто open
файл, не пропуская O_DIRECT
, хотя, передавая O_DIRECT
при любых обстоятельствах, будет обходить кеш страницы ядра для обычных файлов.
Стандарты POSIX , по-видимому, предполагают, что aio_read / aio_write не буферизируются ядром:
Эффект буферизации
Если асинхронный ввод-вывод выполняется для файла, который был предварительно буферизован для того, чтобы быть фактически записанным на устройство, возможно, что асинхронный ввод-вывод не даст никакого преимущества в производительности по сравнению с обычным вводом-выводом; украденные циклы для выполнения асинхронного ввода-вывода будут удалены из запущенного процесса, и ввод-вывод произойдет во время прерывания. Это потенциальное отсутствие прироста производительности никоим образом не устраняет необходимость асинхронного ввода-вывода приложениями реального времени, которые очень часто используют специализированную аппаратную поддержку, несколько процессоров и / или небуферизованный синхронизированный ввод-вывод.
Однако при описании aio_read / aio_write о буферизации нет определенных слов.