Cuando sobrescribes un archivo, ¿se libera el espacio anterior?

Cuando sobrescribes un archivo, ¿se libera el espacio anterior?

Supongamos que tiene un archivo llamado foo.txtque tiene 500un tamaño de bytes. Supongamos que crea un nuevo archivo con 10un tamaño de bytes y lo guarda como foo.txt, sobrescribiendo así el archivo. ¿El sistema operativo (Windows y Linux) garantiza automáticamente que 410se libere el espacio que ya no se utiliza ( bytes)?

En un segundo escenario, imagina que utilizas elutilidad ddpara crear el foo.txt antiguo y el nuevo como se describe anteriormente. ¿El sistema operativo garantizará automáticamente que se libere el espacio que ya no se utiliza?

Me imagino que detrás de escena, todas las escrituras en un archivo utilizan las mismas llamadas al sistema operativo y, por lo tanto, el manejo de las sobrescrituras será consistente en todos los programas...

Respuesta1

Parece que su pregunta surge de considerar que el proceso involucra varias cosas: todo el espacio no utilizado está disponible para otro uso y escribir un archivo con el mismo nombre que un archivo existente se escribe en la misma ubicación. Ambas premisas son inexactas. Además, hablas de que se libera el espacio que ya no se utiliza. Tal como funciona, esos términos son una especie de sinónimos; El espacio se asigna a un archivo o no.

Como describió Davidgo, las unidades funcionan en sectores o bloques completos. Simplemente me referiré a las unidades de asignación de espacio como "bloques" para simplificar. El espacio se asigna en unidades de bloques completos. A un archivo de 1 byte se le asigna el bloque completo, por lo que si se trata de archivos pequeños, a cualquier cosa que tenga un tamaño inferior a un bloque se le asigna un bloque completo. Los archivos pequeños (subbloques) tienen espacio no utilizado en el bloque al que no se puede acceder para otros fines. Se podría hablar de un archivo grande que utiliza varios bloques y que se reemplaza por un archivo más pequeño que utiliza menos bloques. En ese caso, hay bloques enteros que ya no son necesarios.

El archivo antiguo realmente no se sobrescribe. El nuevo archivo se guarda en otra ubicación, utilizando tantos bloques como sea necesario. Se modifica la referencia en la tabla de archivos del sistema de archivos a los bloques del archivo antiguo. Esos bloques quedan desasignados a cualquier archivo y quedan disponibles para su reutilización. El contenido del archivo antiguo no se elimina como parte de este proceso, simplemente se ignora hasta que se necesite espacio. Es por eso que puedes recuperar archivos eliminados.

Preguntaste si esto sería diferente si usaras dd. dd se puede utilizar de muchas maneras. Si limita la discusión a simplemente escribir un archivo nuevo con el mismo nombre, funcionaría de la misma manera.

Respuesta2

Como dijo @KamilMaciorowski, un componente clave de la pregunta es el tamaño del bloque en el disco. Sería extremadamente raro encontrar un sistema de archivos moderno con un tamaño de bloque de menos de 512 bytes (y la mayoría tiene tamaños de bloque mucho más grandes). Esto es relevante porque significa que si realiza operaciones de archivos más pequeños que el tamaño del bloque, esas operaciones utilizan tantos recursos como el tamaño del bloque.entonces la respuesta a su pregunta es NO: el archivo de 400 bytes, que ocupa 1 bloque que será reemplazado por otro archivo usando 1 bloque. Es probable que el bloque original se libere (pero es posible que se sobrescriba), pero no ha guardado espacio en el disco.

Sospecho que lo sabes, pero para otros: también vale la pena señalar que cuando se libera un bloque, generalmente no se sobrescribe ni se borra y, a menudo, se puede recuperar. Esto es doblemente cierto en los SSD, que abstraen aún más lo que tenemos en el disco de lo que ve el sistema operativo (gracias a la nivelación de desgaste).

información relacionada