Освобождается ли предыдущее место при перезаписи файла?

Освобождается ли предыдущее место при перезаписи файла?

Предположим, у вас есть файл с именем foo.txtразмером 500байт. Предположим, вы создаете новый файл размером 10байт и сохраняете его как , тем самым перезаписывая файл. Обеспечивает ли ОС (Windows и Linux) автоматическое освобождение foo.txtпространства, которое больше не используется ( байт)?410

Во втором сценарии представьте, что вы использовалиутилита ddсоздать как старый, так и новый foo.txt, как описано выше. Будет ли ОС автоматически обеспечивать освобождение пространства, которое больше не используется?

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

решение1

Похоже, ваш вопрос исходит из того, что вы рассматриваете этот процесс как включающий несколько вещей: все неиспользуемое пространство доступно для другого использования, и запись файла с тем же именем, что и существующий файл, записывается в то же место. Оба эти предположения неточны. Кроме того, вы говорите об освобождении пространства, которое больше не используется. С точки зрения того, как это работает, эти термины являются своего рода синонимами; пространство либо выделяется файлу, либо нет.

Как описал davidgo, диски работают целыми секторами или блоками. Я буду называть единицы распределения пространства «блоками» для простоты. Пространство выделяется целыми блоками. 1-байтовому файлу выделяется весь блок, поэтому, если вы обсуждаете крошечные файлы, всему, что меньше блока по размеру, по-прежнему выделяется целый блок. Маленькие (субблочные) файлы имеют неиспользуемое пространство в блоке, которое недоступно для других целей. Можно говорить о замене большого файла, который использует несколько блоков, на меньший файл, который использует меньше блоков. В этом случае есть целые блоки, которые больше не нужны.

Старый файл на самом деле не перезаписывается. Новый файл сохраняется в другом месте, используя столько блоков, сколько ему нужно. Ссылка в таблице файлов файловой системы на блоки старого файла изменяется. Эти блоки становятся не назначенными ни одному файлу и доступны для повторного использования. Содержимое старого файла не удаляется в рамках этого процесса, оно просто игнорируется, пока не понадобится место. Вот почему вы можете восстановить удаленные файлы.

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

решение2

Как сказал @KamilMaciorowski, ключевым компонентом вопроса является размер блока на диске. Было бы исчезающе редко найти современную файловую систему с размером блока менее 512 байт (и большинство имеют гораздо большие размеры блоков). Это важно, поскольку означает, что если вы имеете дело с файловыми операциями, меньшими размера блока, эти операции используют столько же ресурсов, сколько и размер блока -так что ответ на ваш вопрос НЕТ - файл размером 400 байт, который занимает 1 блок, будет заменен другим файлом, использующим 1 блок. Исходный блок, скорее всего, будет освобожден (но может быть перезаписан), но вы не сэкономили дисковое пространство

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

Связанный контент