Когда я открываю файл с помощью 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 может ли эта последовательность запросов попадать в очередь планировщика диска при отсутствии явных барьеров записи?
Если да, есть ли какая-либо гарантия упорядочения, например, «множественные записи»в тот же сектор приведет к тому, что последняя запись будет последней записью "?
или этот порядок недетерминирован [оставлен во власти контроллера диска / его кэшей, который переупорядочивает записи в пределах барьеров для оптимизации времени поиска]