Это напоминает мне о Allocate On Flush . Когда файловая система использует эту функцию, вместо записи данных непосредственно на диск, она вычитает размер данных, которые должны быть записаны, из счетчика свободного пространства на диске и хранит данные в памяти, пока не будет выполнен системный вызов синхронизации или пока ядро не решит очистить грязные буферы.
В этом случае, если файл изменяется одним процессом и открывается другим процессом, последний «увидит» неизмененную ( или «старую», если хотите ) версию файла.
Конечно, вышесказанное является теоретическим и зависит от различных факторов, и я бы сказал, что это немного непредсказуемо, поскольку вы точно не знаете, когда ядро очистит грязные страницы. Например, в Linux ( как вы также можете прочитать в разделе 15.3 «Понимание ядра Linux» ), грязные страницы записываются на диск при следующих условиях:
Кэш страниц переполняется и требуется больше страниц, или количество грязных страниц становится слишком большим.
Слишком много времени прошло с тех пор, как страница осталась грязной.
Процесс запрашивает все ожидающие изменения блочного устройства или определенного файла для сброса; это делается путем вызова системных вызовов sync (), fsync () или fdatasync ().
Известно, что эта функция реализована в файловых системах HFS +, XFS, Reiser4, ZFS, Btrfs и ext4.