Использование вызовов sync и fsync

Если файл открыт с опцией O_SYNC или O_DSYNC, то перед выходом из каждой функции записи данные будут принудительно записываться на диск. Если при выполнении записи потребуется выделить дополнительное дисковое пространство (например, при расширении файла), то будет создана соответствующая запись в протоколе JFS.

Принудительная синхронизация содержимого оперативной памяти и данных, хранящихся на диске, выполняется в следующих случаях:

  • Приложение вызывает функцию fsync() для некоторого файла. При этом все страницы памяти файла, содержащие обновленные данные, будут записаны на диск. Управление возвращается программе только после завершения работы fsync().
  • Приложение вызывает функцию sync(). При этом будет запланирована запись на диск всех страниц памяти файла, содержащих обновленные данные. Возврат управления программе не означает, что запрос sync() уже обработан.
  • Пользователь может ввести команду sync, которая, в свою очередь, вызовет функцию sync(). В этом случае появление приглашения (или переход к следующей команде сценария оболочки) не означает, что запись уже выполнена.
  • Демон /usr/sbin/syncd запускает функцию sync() через равные интервалы времени - обычно через 60 секунд. Благодаря этому система не накапливает больших объемов данных в энергозависимой памяти.

Операция sync расходует незначительный объем ресурсов CPU. Помимо этого, у нее есть следующие преимущества:

  • Компактная запись данных.
  • Запись по крайней мере 28 КБ системных данных, даже если с момента предыдущего вызова sync не было выполнено ни одной операции ввода-вывода.
  • Ускорение записи данных на диск за счет отключения алгоритма отложенной записи. Это свойство особенно важно для тех программ, в которых после каждой операции записи выполняется операция fsync().
  • Создание при вызове sync() или fsync() записей в протоколе JFS о том, что измененные данные сохранены на диске.