Как себя ведет буферный кеш Linux, когда приложение падает? - PullRequest
3 голосов
/ 27 февраля 2011

Допустим, я использую поток файлов c ++ асинхронно. Я имею в виду никогда не использовать ни std :: flush, ни std :: endl. Мое приложение записывает много данных в файл и резко падает. Данные, оставшиеся в системе кэша, сброшены на диск или удалены (и потеряны)?

Ответы [ 2 ]

10 голосов
/ 27 февраля 2011

Сложность этой проблемы заключается в том, что в игре есть несколько «кэшей».

Потоки C ++ имеют собственный механизм внутренней буферизации.Потоки не просят ОС записывать на диск до тех пор, пока (а) вы не отправите в буфер достаточно данных, чтобы библиотека потоков посчитала, что запись не будет потрачена впустую (б) вы специально запросите сброс (в)Поток находится в режиме буферизации строки, и вы отправили по endl.Любые данные в этих буферах теряются при сбое программы.

Операционная система буферизует записи, чтобы наилучшим образом использовать ограниченный объем доступного дискового ввода-вывода.Записи обычно сбрасываются в течение пяти-тридцати секунд;раньше, если программист (или библиотеки) вызывает fdatasync(2) или fsync(2) или sync(2) (который запрашивает сброс всех грязных данных).Любые данные в буферах ОС записываются на диск (в конце концов), когда происходит сбой программы, теряется , если происходит сбой ядра.

Жесткий диск будет буферизовать записи, чтобы попытаться наилучшим образом использоватьего медленный напор, задержка вращения и т. д. Данные поступают в этот буфер, когда ОС сбрасывает свои кэши.Данные в этих буферах записываются на диск в случае сбоя программы; , вероятно, будет записываться на диск в случае сбоя ядра, а может записываться на диск, если питание внезапно отключается отпривод.(У некоторых достаточно мощности, чтобы продолжить запись своих буферов, обычно это в любом случае занимает менее секунды.)

0 голосов
/ 27 февраля 2011

Материал в буфере библиотеки (который вы сбрасываете с помощью std :: flush или чего-то подобного) теряется, данные в буферах ядра ОС (которые вы можете сбрасывать, например, с помощью fsync ()) не теряются, если не происходит сбой самой ОС.

...