Использование вызовов 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 о том, что измененные данные сохранены на диске.