Movendo um arquivo enquanto está em uso - Como funciona?


31

Eu notei que no sistema operacional não-windows .... ou seja, linux / mac eu posso fazer coisas como: - Enviar um zip para um amigo acima do objetivo - Excluir o arquivo enquanto ele estiver sendo transferido

E a transferência não falha.

Ou posso executar operações como .. - iniciar um filme - apagar o arquivo - o filme ainda é reproduzido até a conclusão (leitura do disco, não apenas buffer na memória)

Embora os arquivos estejam sendo "excluídos", como mencionei, na verdade eles estão sendo movidos para um local diferente no sistema de arquivos ... ou seja, em um diretório da Lixeira ou algo assim. Portanto, parece-me que o sistema operacional usa um ponteiro @ no arquivo que é atualizado quando se move, em vez de acessar os arquivos diretamente.

Alguém pode lançar alguma luz sobre como esse recurso IMPRESSIONANTE é realmente implementado? Não tenho certeza do que pesquisar no Google para saber mais.

obrigado.


1
Em teoria, suponho que há duas maneiras de isso acontecer. Ambos são realidade. O arquivo está na memória. Ou o sistema de arquivos tem referências aos arquivos e apenas a referência é excluída. Ambos são realidade. O fato das referências é como programas não excluídos podem recuperar coisas. A idéia de que o arquivo seja realmente excluído quando todos os programas que o acessam fecharem parece absurdo. Você pode pesquisar sobre listas vinculadas (uma estrutura de dados de programação, para entender o conceito com mais profundidade). Ou você pode pesquisar sobre sistemas de arquivos específicos.
barlop

Respostas:


29

A entrada do diretório é apenas um ponteiro para um inode. O inode contém as meta-informações sobre o arquivo (exceto o nome) e ponteiros para os dados do arquivo (se houver). Quando você começa a copiar um arquivo, recebe um identificador para o inode.

O sistema operacional mantém uma contagem de referências ao inode. Desde que haja referências ao inode, o inode e os dados do arquivo são mantidos. Depois que todas as referências ao inode são removidas, o inode é e o espaço requerido pelo arquivo é liberado.

Como você tem o arquivo aberto para cópia, ele será mantido até que seu processo feche o arquivo. Isso deve ocorrer quando a transferência do arquivo terminar e ocorrerá se o processo de cópia falhar. Se a transferência do arquivo falhar parcialmente e você tiver excluído todos os links físicos do arquivo, não será possível reiniciar a transferência com êxito.

EDIT: Como já mencionado, as movimentações de arquivos no mesmo dispositivo são feitas sem mover os dados. Em vez disso, uma nova entrada de diretório é criada no diretório de destino e a entrada de diretório original é removida.

É possível ter várias entradas de diretório para o mesmo arquivo. Estes são chamados de links físicos. Eles são criados criando uma nova entrada de diretório para o arquivo sem remover a entrada original. O inode do sistema de arquivos possui uma contagem de referência para registrar o número de entradas do diretório apontando para o arquivo.

EDIT2: Se o processo travar ou for interrompido, o arquivo será removido corretamente, pois a contagem de acessos na memória será reduzida a zero. Essa é a ação que ocorre quando o programa termina normalmente.

No caso de falta de energia ou outro desligamento desordenado do sistema, o disco precisará de uma fsck(verificação do sistema de arquivos) antes de poder ser totalmente montado. Dependendo do estado do inode no disco e das estruturas de diretório, o espaço será recuperado, o arquivo permanecerá no diretório ou uma nova entrada será feita no lost+founddiretório. Os resultados dependerão de quais alterações foram liberadas para o disco ou gravadas no diário dos sistemas de arquivos.


5
Exatamente. Eu não poderia me explicar melhor. Aliás, um truque comum, se você precisar de algum armazenamento de arquivo temporário em um programa, é criar um arquivo /tmpe imediatamente unlink(2)o arquivo . Nesse ponto, não há arquivo em um diretório (portanto, nada para limpar na saída ou falha), mas seu processo ainda tem acesso ao arquivo e nenhum outro processo pode mexer acidental ou deliberadamente com ele. Isso ilustra a propriedade de interesse.
Norman Gray

Isso significa que, se um arquivo aberto for removido enquanto um programa estiver sendo usado e ocorrer uma falha de energia, os dados ociosos permanecerão na unidade ocupando espaço? E se o processo usando o arquivo travar ou for interrompido?
Jason C

1
@JasonC Atualizei a resposta para responder às suas perguntas.
BillThor

6

Conforme explicado por Matt Jenkins, o sistema operacional (o sistema de arquivos) controla os arquivos mantidos abertos pelos aplicativos. Enquanto um processo mantém um arquivo aberto, seus dados permanecem no disco (mesmo que tenham sido excluídos e não sejam mais visíveis ou acessíveis a outros programas).

Observe que uma conseqüência disso é que o espaço ocupado por um arquivo só pode ser recuperado depois que o último processo que o utiliza o fechou. Esta é uma FAQ para operações de sistema de arquivos Linux / Unix: "O comando 'df' diz que a partição está cheia, enquanto 'du' relata espaço livre" (consulte, por exemplo, http://batleth.sapienti-sat.org/projects/FAQs/ext3- faq.html ). Se você precisar liberar espaço, não é suficiente excluir arquivos grandes (por exemplo, arquivos de log), você também deve garantir que nenhum processo os mantenha abertos (geralmente um problema com os arquivos de log).


Não é verdade no caso do OS X / HFS +: Você pode mover arquivos, por exemplo, para o Lixo, mas não entre partições ou excluí-los (por exemplo, esvaziar o Lixo).
Daniel Beck

2

Na verdade, é bastante simples. O arquivo mantém uma lista de referências - processos que estão acessando o arquivo. Quando você exclui o arquivo, ele remove a listagem do diretório, mas não o próprio arquivo. Os programas que ainda têm o arquivo aberto ainda podem acessá-lo. O arquivo só é realmente excluído quando todos os programas que estão acessando o fecham.

Além disso, ao mover o arquivo - se estiver dentro do mesmo sistema de arquivos - o arquivo não se move como tal, apenas altera o ponteiro para o diretório em que o arquivo está.


"O arquivo mantém uma lista de referências"?
Daniel Beck

Deve ser o arquivo "SO ou Explorer" não.
Moab

2
Esse seria realmente o sistema de arquivos.
JRobert

O sistema operacional usa o sistema de arquivos para armazenar as referências no arquivo (nlinks na estrutura do cabeçalho do arquivo) - aí - estamos todos felizes;) #
Majenko 27/02/11

1
"Referências" são processos com um identificador aberto para o arquivo e links físicos (incluindo o primeiro nome de arquivo) para o arquivo. Os blocos de dados não são marcados como livres e disponíveis para reutilização até que a contagem de referência chegue a zero.
mpez0

0

Nos sistemas de arquivos unix, um arquivo pode ter um ou mais links físicos para ele. O arquivo permanece enquanto houver pelo menos um. Quando o último é removido, o espaço do arquivo é liberado. O link acima fornecerá um ponto de partida para mais leituras - consulte especialmente a seção "Contador de links".


1
É verdade, mas não é isso que está acontecendo aqui. O ponto é que, mesmo após a remoção do último hardlink , o arquivo ainda permanece até que todos os arquivos tenham fechado seus identificadores.
sleske
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.