Quando você sobrescreve um arquivo, o espaço anterior é liberado?

Quando você sobrescreve um arquivo, o espaço anterior é liberado?

Suponha que você tenha um arquivo chamado foo.txtcom 500tamanho de bytes. Suponha que você crie um novo arquivo com 10tamanho de bytes e salve-o como foo.txt, substituindo assim o arquivo. O sistema operacional (Windows e Linux) garante automaticamente que o espaço não utilizado ( 410bytes) seja liberado?

Em um segundo cenário, imagine que você usou outilitário ddpara criar o antigo e o novo foo.txt conforme descrito acima. O sistema operacional garantirá automaticamente que o espaço não utilizado seja liberado?

Imagino que nos bastidores, todas as gravações em um arquivo usam as mesmas chamadas de sistema do sistema operacional e, portanto, o tratamento de substituições será consistente entre os programas...

Responder1

Parece que sua pergunta decorre da visão do processo como envolvendo várias coisas: todo o espaço não utilizado está disponível para outro uso e a gravação de um arquivo com o mesmo nome de um arquivo existente está sendo gravada no mesmo local. Ambas as premissas são imprecisas. Além disso, você fala sobre a liberação do espaço que não é mais utilizado. Do jeito que funciona, esses termos são meio que sinônimos; o espaço é alocado para um arquivo ou não.

Conforme descrito por davidgo, os drives funcionam em setores ou blocos inteiros. Vou apenas me referir às unidades de alocação de espaço como “blocos” para simplificar. O espaço é alocado em unidades de bloco inteiro. Um arquivo de 1 byte é alocado para o bloco inteiro; portanto, se você estiver discutindo arquivos minúsculos, qualquer coisa abaixo do tamanho de um bloco ainda receberá um bloco inteiro. Arquivos pequenos (subbloco) possuem espaço não utilizado no bloco que não pode ser acessado para outra finalidade. Você poderia falar sobre um arquivo grande que usa vários blocos sendo substituído por um arquivo menor que usa menos blocos. Nesse caso, existem blocos inteiros que não são mais necessários.

O arquivo antigo não foi realmente sobrescrito. O novo arquivo é salvo em outro local, usando quantos blocos forem necessários. A referência na tabela de arquivos do sistema de arquivos aos blocos do arquivo antigo é modificada. Esses blocos deixam de ser atribuídos a qualquer arquivo e ficam disponíveis para reutilização. O conteúdo do arquivo antigo não é excluído como parte desse processo, ele é apenas ignorado até que o espaço seja necessário. É por isso que você pode recuperar arquivos excluídos.

Você perguntou se isso seria diferente se usasse dd. dd pode ser usado de várias maneiras. Se você limitar a discussão a simplesmente escrever um novo arquivo usando o mesmo nome, isso funcionaria da mesma maneira.

Responder2

Como disse @KamilMaciorowski, um componente chave da questão é o tamanho do bloco no disco. Seria extremamente raro encontrar um sistema de arquivos moderno com um tamanho de bloco inferior a 512 bytes (e a maioria tem tamanhos de bloco muito maiores). Isso é relevante porque significa que se você lidar com operações de arquivo menores que o tamanho do bloco, essas operações usarão tantos recursos quanto o tamanho do bloco -então a resposta à sua pergunta é NÃO - o arquivo de 400 bytes, que ocupa 1 bloco que será substituído por outro arquivo usando 1 bloco. O bloco original provavelmente será liberado (mas poderá ser sobrescrito), mas você não economizou espaço em disco

Suspeito que você saiba disso, mas para outros - também é importante notar que quando um bloco é liberado, ele geralmente não é sobrescrito/apagado e muitas vezes pode ser recuperado. Isso é duplamente verdadeiro em SSDs que abstraem ainda mais o que temos no disco do que o sistema operacional vê (graças ao nivelamento de desgaste).

informação relacionada