Обычно используется два уровня буферизации:
- Внутренние буферы
- Буферы операционной системы
Внутренние буферы - это буферы, созданные во время выполнения /библиотека / язык, на котором вы программируете, и предназначена для ускорения процесса, избегая системных вызовов для каждой записи.Вместо этого, когда вы записываете в объект файла, вы записываете в его буфер, и всякий раз, когда буфер заполняется, данные записываются в фактический файл с использованием системных вызовов.
Однако из-за буферов операционной системыэто может не означать, что данные записываются на диск .Это может просто означать, что данные копируются из буферов, поддерживаемых вашей средой выполнения, в буферы, поддерживаемые операционной системой.
Если вы что-то пишете, и это заканчивается в буфере (только), и питаниеОбрезается на вашем компьютере, что данные не находятся на диске, когда машина выключается.
Итак, чтобы помочь вам, у вас есть методы flush
и fsync
для их соответствующих объектов.
Первый, flush
, просто записывает любые данные, которые хранятся в программном буфере, в текущий файл.Как правило, это означает, что данные будут скопированы из буфера программы в буфер операционной системы.
В частности, это означает, что если другой процесс имеет тот же файл, открытый для чтения, он сможет получить доступ к даннымты просто залил файл.Однако это не обязательно означает, что оно «постоянно» хранится на диске.
Для этого вам необходимо вызвать метод os.fsync
, который обеспечивает синхронизацию всех буферов операционной системы с запоминающими устройствами, с которыми они работают.другими словами, этот метод будет копировать данные из буферов операционной системы на диск.
Как правило, вам не нужно беспокоиться ни об одном из этих методов, но если вы находитесь в сценарии, когда паранойя ото, что в действительности оказывается на диске, - это хорошо, вы должны сделать оба вызова в соответствии с инструкциями.
Добавление в 2018.
Обратите внимание, что диски с механизмами кэширования теперь встречаются гораздо чаще, чемеще в 2013 году, так что теперь еще больше уровней кеширования и буферов.Я предполагаю , что эти буферы также будут обрабатываться вызовами sync / flush, но я действительно не знаю.