Когда я открываю файл с помощью O_DIRECT|O_ASYNC и выполняю две одновременные записи в один и тот же сектор диска без промежуточной fsync или fdatasync, дает ли дисковая подсистема linux или аппаратные контроллеры диска какие-либо гарантии того, что окончательные данные в этом секторе диска будут сохранены? быть вторым писать?
Хотя верно то, что O_DIRECT обходит буферный кеш ОС, данные в конечном итоге попадают в очередь ввода-вывода низкого уровня (очередь планировщика диска, очередь драйвера диска, кеш/очереди аппаратного контроллера и т. д.). Я проследил весь стек ввода-вывода до алгоритма лифта.
Например, если следующая последовательность запросов попадает в очередь дискового планировщика
write sector 1 from buffer 1
write sector 2 from buffer 2
write sector 1 from buffer 3 [Its not buffer 1!!]
код лифта выполнит «обратное слияние» для объединения секторов 1, 2 из буферов 1, 2 соответственно. А затем выдайте дисковые два дисковых ввода-вывода. Но я не уверен, что окончательные данные в секторе диска 1 взяты из буфера 1 или буфера 3 (поскольку я не знаю о семантике переупорядочения записи драйверов/контроллеров).
Сценарий 2:
write sector 1 from buffer 1
write sector 500 from buffer 2
write sector 1 from buffer 3
Как будет обрабатываться этот сценарий? Более простой вопрос заключается в том, что при записи в режиме O_DIRECT с AIO может ли эта последовательность запросов оказаться в очереди планировщика диска при отсутствии явных барьеров записи? в тот же сектор приведет к тому, что последняя запись будет окончательной записью" ?
или это упорядочение недетерминированное [оставлено на милость контроллера диска/его кешей, которые переупорядочивают записи в пределах барьеров для оптимизации времени поиска]