Жизнь после смерти

psm-home

Если процесс умирает, имея открытые файлы, в которые производилась запись, будут ли файловые буферы процесса сброшены операционной системой на диск в процессе очистки ресурсов или нет? Интересует поведение Windows и Linux.

maggi14

в виндуз НТ - не будет
в не-НТ - думаю, тем более не будет, но не пробовал

Papazyan

Смотря какие буферы. Если пользовательские, то откуда система узнает, что их надо сбросить? А если в ядре, то сбросит.

amkharchenko

Из man по close в Linux:
A successful close does not guarantee that the data has been successfully saved to disk, as the kernel defers writes. It is not common for a filesystem to flush the buffers when the stream is closed. If you need to be sure that the data is physically stored use fsync(2). (It will depend on the disk hardware at this point.)
Нет, не будут.

ppplva

Но и данные в ядреных буферах не потеряются.

amkharchenko

Кто с этим спорит?

psihodog

мне кажется, вопрос был не про то...

amkharchenko

Все, пошел ботать учебник

psm-home

Так. Вопрос сформулирован хреново, точно. Имелась в виду буферизация записи в файл, осуществляемая ОС. Никакие пользовательские кеши не интересуют, кеширование, осуществляемое C Runtime Library для вызовов записи в поток типа fwrite не интересует. Т. е например в Windows, когда я вызываю WriteFile, как я понимаю, успешный вызов не означает, что данные сброшены на диск. Они могут быть кешированы ядром. Если сразу после этого процесс помирает, будут ли данные этого кеша сброшены на диск или отвергнуты?

sergey_m

Если данные попали в буферы, то есть уже доступны другим процессам, но еще не попали на диск, то они обязательно попадут на диск.

Olyalyau


Если данные попали в буферы, то есть уже доступны другим процессам, но еще не попали на диск, то они обязательно попадут на диск.

Что за лажа? Такого даже orthogonal persistent системы не гарантируют.
Та самая кнопка, которая "Ури, где у него кнопка?" поможет данным не попасть на пластину.
Обычно бывает три уровня кеширования — внутри самой программы (обычно в библиотеке, которую программа использует для ввода/вывода); в операционной системе; в железке. Опять же, обычно, при корректной смерти процесса сбрасывается только первый из этих буферов (при некорректной смерти, например по нарушению доступа к памяти, обычно, и этот буфер не сбрасывается; в этом причина того, что стандартные потоки ошибок не буферизованы). Сброс второго — это всякие O_SYNC, sync umount/remount (не считая переполнений и тайм-аутов). Сброс третьего — посылкой специальных команд контроллеру железки (также не считая переполнений, тайм-аутов и железок с которыми вы по сети общаетесь).

sergey_m

А ты не путай тёплое с мягким. Я не говорю, что по смерти процесса сбросятся буферные кэши и кэши винтов. Я говорю, что рано или поздно, при условии, что никто не нажмёт reset эти данные попадут на диск.
Оставить комментарий
Имя или ник:
Комментарий: