Будут ли блоки записаны недавно удаленный впоследствии удаленный файл обратно на диск? - PullRequest
0 голосов
/ 01 апреля 2009

Предположим, у меня есть процесс, который создает файл, записывает в него некоторые данные, а затем после небольшой обработки (сам по себе или другого процесса) удаляет его и закрывает все оставшиеся файловые дескрипторы.

Я предполагаю, что здесь достаточно оперативной памяти, чтобы сохранить страницы в памяти до тех пор, пока файл не будет удален, и что никто не вызывает sync () в промежутке.

Будут ли когда-либо записаны блоки удаленного файла на диск или они будут немедленно удалены из грязного списка?

Или это зависит от файловой системы? Файловые системы, такие как xfs и ext4, имеют «отложенное размещение», которое может поддерживать эту функцию, если она реализована.

Ответы [ 4 ]

2 голосов
/ 01 апреля 2009

В классических файловых системах Unix ответом будет «Нет» (то есть данные для созданного и удаленного файла не обязательно попадут на диск), хотя некоторые из метаданных каталога (время модификации) вероятно, все еще изменится. Поэтому то, что происходит, зависит частично от используемой файловой системы.

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


Стандарт POSIX говорит (о функции sync(), которая используется командой sync):

Функция sync () заставляет всю информацию в памяти, которая обновляет файловые системы, планироваться для записи во все файловые системы.

Запись, хотя и запланирована, не обязательно завершается после возврата из sync ().

Если Linux изменил свое определение, чтобы заверить вас, что «все данные записаны на диск», то это допустимое и полезное расширение. Но это не классическое поведение - будьте осторожны, перенося опыт Linux на другие системы.

Существуют и другие функции, такие как fsync (), которые дают разные, более строгие обещания:

Функция fsync () должна запросить, чтобы все данные для дескриптора открытого файла, названного fildes, были переданы на запоминающее устройство, связанное с файлом, описанным fildes. Характер передачи определяется реализацией. Функция fsync () не должна возвращаться, пока система не выполнит это действие или пока не будет обнаружена ошибка.

И есть варианты файловых дескрипторов, которые снова дают другие обещания: O_SYNC, O_DSYNC, O_RSYNC. Найдите их в стандарте POSIX (open()).

1 голос
/ 13 сентября 2009

Я провел некоторое исследование по этому вопросу и обнаружил, что в Linux он действительно зависит от файловой системы.

ext3, кажется, всегда записывает удаленные файлы независимо от того, насколько они маленькие или как скоро они удаляются. XFS не всегда делает это, что может привести к гораздо большей производительности для приложений, которые используют кратковременные временные файлы, если у вас достаточно оперативной памяти.

Я подозреваю, что "современные" файловые системы Linux (ext4, btrfs) тоже делают это. Это хорошо.

1 голос
/ 13 апреля 2009

Я согласен с Джонатаном Леффлером, но не только для классических файловых систем Unix: было обсуждение с аналогичной темой, касающейся файловой системы ext4.

В комментарии Теодор Цо (один из главных разработчиков файловой системы ext4) заявляет: `` ... например, если вы создаете файл с нулями, а затем удаляете его Через 20 секунд он, вероятно, никогда не попадет на диск. ''

0 голосов
/ 13 сентября 2009

Что вам действительно нужно знать, здесь?

Если вопрос «возможно, он будет записан на диск?» ответ - нет, если ваша обработка короткая, но без обещаний.

Если вопрос «могу ли я быть уверен, что он не будет записан на диск?» ответ тоже нет. Удаленный файл - это файл, подобный любому другому, если он остается открытым; это просто файл без имени (ссылка).

Если ответ «это совершенно бесплатно с точки зрения диска?» Ответ опять нет - например, я вполне уверен, что в системе с квотами количество «блоков» в файле будет начисляться за квоту файловой системы пользователя, как только вы их напишите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...