Я думаю, что запись DirectIO в файл должна быть довольно безопасной для последующего кэшированного чтения этого файла, но чтение может иметь более низкую производительность (записанные данные не были сохранены в кеше страницы и должны быть прочитаны из реального хранилища). Но точный путь к коду может зависеть от используемой файловой системы.
В этом посте https://lwn.net/Articles/776801/ упоминается, что прямой ввод-вывод имеет семантику аннулирования:
по крайней мере с некоторыми файловыми системами выполнение чтения с прямым вводом-выводом на странице вынудит эту страницу из кэша
book перечислить 3 стратегии записи в разделе «Кэширование записи»: нет -пишите, сквозной записи, обратной записи. Прямой ввод-вывод может быть вариантом «без записи» системного вызова write()
.
Использование нескольких файлов для одного файла безопасно, так как данные управляются кодом FS с использованием inode. Оба fd будут указывать на один и тот же индекс.
В 2013 году в списке рассылки была нить https://lists.kernelnewbies.org/pipermail/kernelnewbies/2013-July/008660.html, а TLDR:
От точка зрения разработчика ядра: драйвер ядра гарантирует согласованность между кешированием страниц и данными, передаваемыми с помощью O_DIRECT. ...
- Не беспокойтесь о связности между кэшем страниц и данными, передаваемыми с помощью O_DIRECT. Ядро сделает недействительным кеш после записи O_DIRECT и flu sh кеш перед чтением O_DIRECT.
- Используйте мьютексы или семафоры (или любую из многочисленных опций [1]), чтобы предотвратить обычные проблемы синхронизации во время IP C с использованием общего файла.
Таким образом, хотя прямая запись удаляет записанную часть файла из кэша страниц, существует некоторая возможность состязания между писателем и читателем. Так что мьютекс или другой синтаксис c необходим, если ваш читатель хочет получить обновленные данные. Только после завершения системного вызова Direct IO write () кэш страницы будет очищен.
Иногда смешивание не рекомендуется: https://medium.com/databasss/on-disk-io-part-1-flavours-of-io-8e1ace1de017 " Не рекомендуется открывать тот же файл с помощью Direct IO и Page Cache одновременно, так как прямые операции будут выполняться с дисковым устройством, даже если данные находятся в Page Cache, что может привести к нежелательным результатам."