Сложность этой проблемы заключается в том, что в игре есть несколько «кэшей».
Потоки C ++ имеют собственный механизм внутренней буферизации.Потоки не просят ОС записывать на диск до тех пор, пока (а) вы не отправите в буфер достаточно данных, чтобы библиотека потоков посчитала, что запись не будет потрачена впустую (б) вы специально запросите сброс (в)Поток находится в режиме буферизации строки, и вы отправили по endl
.Любые данные в этих буферах теряются при сбое программы.
Операционная система буферизует записи, чтобы наилучшим образом использовать ограниченный объем доступного дискового ввода-вывода.Записи обычно сбрасываются в течение пяти-тридцати секунд;раньше, если программист (или библиотеки) вызывает fdatasync(2)
или fsync(2)
или sync(2)
(который запрашивает сброс всех грязных данных).Любые данные в буферах ОС записываются на диск (в конце концов), когда происходит сбой программы, теряется , если происходит сбой ядра.
Жесткий диск будет буферизовать записи, чтобы попытаться наилучшим образом использоватьего медленный напор, задержка вращения и т. д. Данные поступают в этот буфер, когда ОС сбрасывает свои кэши.Данные в этих буферах записываются на диск в случае сбоя программы; , вероятно, будет записываться на диск в случае сбоя ядра, а может записываться на диск, если питание внезапно отключается отпривод.(У некоторых достаточно мощности, чтобы продолжить запись своих буферов, обычно это в любом случае занимает менее секунды.)