Я тестирую свой новый алгоритм на дисковых процессах. Для сравнения важно измерить точное время, которое заняла каждая [массивная] операция чтения / записи.

Кажется, что на моей виртуальной машине Linux с локальным жестким диском фактические операции записи на диск все еще продолжаются / ожидают даже после выполнения flush() (например, BufferedWriter.flush() в java). Этот вывод сделан на основании доказательств того, что:

  1. Когда я запускаю sync ; sleep 60 ; sync , вторая sync выполняется мгновенно.
  2. Когда я запускаю sync ; ./myProg ; sync , вторая синхронизация занимает 40 секунд.

Почему вторая синхронизация занимает так много времени? Я думал, что ОС должна гарантировать согласованность, когда программа сбрасывает данные в файл, но здесь это не так. Почему Linux делает такую рискованную буферизацию на энергозависимой памяти?

Рационально ли включать время синхронизации как часть фактического времени записи? (в моей исследовательской работе)?

1 ответ1

1

Вы путаете fflush() с различными вариантами fsync() .

fflush() гарантирует, что все, что находится в буфере внутри вашего стека обработки файлов, передается в ОС для записи.

fsync() гарантирует, что ОС записывает данные в стабильное хранилище.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .