O que o Linux está fazendo de maneira diferente que me permite remover / substituir arquivos em que o Windows iria reclamar que o arquivo está em uso atualmente?

26

O exemplo que tenho é Minecraft. Ao executar o Bukkit no Linux, posso remover ou atualizar os arquivos .jar na pasta / plugins e simplesmente executar o comando 'reload'.

No Windows, eu tenho que diminuir todo o processo do servidor, porque ele vai reclamar que o arquivo .jar está em uso quando tento removê-lo ou substituí-lo.

Isso é incrível para mim, mas por que isso acontece? O que o Linux está fazendo diferente aqui?

    
por BigOmega 27.09.2012 / 18:39

1 resposta

30

O Linux exclui um arquivo de maneira completamente diferente do que o Windows faz. Primeiro, uma breve explicação sobre como os arquivos são gerenciados nos sistemas de arquivos * unix nativos.

O arquivo é mantido no disco na estrutura multinível chamada i-node . Cada nó i tem um número exclusivo no sistema de arquivos único. A estrutura do i-node mantém informações diferentes sobre um arquivo, como seu tamanho, blocos de dados alocados para o arquivo etc., mas, em nome dessa resposta, o elemento de dados mais importante é um link counter . Os directories são os arquivos que mantêm registros sobre os arquivos. Cada registro tem o número do nó i a que ele se refere, o comprimento do nome do arquivo e o próprio nome do arquivo. Este esquema permite que se tenha 'ponteiros', isto é 'links' para o mesmo arquivo em lugares diferentes com nomes diferentes. O contador de links do i-node na verdade mantém o número de links que se referem a esse nó i.

O que acontece quando algum processo abre o arquivo? Primeiro, a função open() procura o registro do arquivo. Em seguida, ele verifica se a estrutura do nó i na memória para esse nó i já existe. Isso pode acontecer se algum aplicativo já tiver esse arquivo aberto. Caso contrário, o sistema inicializa uma nova estrutura de nó i na memória. Em seguida, o sistema aumenta o contador de abertura da estrutura do nó i na memória e retorna ao aplicativo seu descritor de arquivo.

A chamada da biblioteca do Linux para excluir um arquivo é chamada de unlink . Esta função remove o registro do arquivo de um diretório e decrementa o contador de links do i-node. Se o sistema descobrir que existe uma estrutura de nó i na memória e seu contador aberto não for zero, essa chamada retornará o controle para o aplicativo. Caso contrário, ele verifica se o contador de links se tornou zero e, se isso ocorrer, o sistema libera todos os blocos alocados para o nó i e o próprio nó i e retorna para o aplicativo.

O que acontece quando um aplicativo fecha um arquivo? A função close() decrementa o contador aberto e verifica seu valor. Se o valor for diferente de zero, a função retornará ao aplicativo. Caso contrário, ele verifica se o contador de links do nó i é zero. Se for zero, libera todos os blocos do arquivo e o nó i antes de retornar ao aplicativo.

Esse mecanismo permite "excluir" um arquivo enquanto ele é aberto. Ao mesmo tempo, o aplicativo que abriu um arquivo ainda tem acesso aos dados no arquivo. Portanto, o JRE, em seu exemplo, ainda mantém sua versão do arquivo aberta enquanto há outra versão atualizada no disco.

Mais ainda, esse recurso permite que você atualize o glibc (libc) - a biblioteca principal de todos os aplicativos - em seu sistema sem interromper sua operação normal.

Windows

20 anos atrás, não conhecíamos nenhum outro sistema de arquivos além do FAT no DOS. Esse sistema de arquivos tem uma estrutura e princípios de gerenciamento diferentes. Esses princípios não permitem excluir um arquivo quando ele é aberto, portanto, o DOS e, mais recentemente, o Windows precisam negar qualquer solicitação de exclusão em um arquivo que esteja aberto. Provavelmente o NTFS permitiria o mesmo comportamento que os sistemas de arquivos * nix, mas a Microsoft decidiu manter o comportamento habitual da exclusão do arquivo.

Esta é a resposta. Não é curto, mas agora você tem a ideia.

Editar : Uma boa leitura sobre fontes de Win32 mess: link Créditos para @Jon

    
por 27.09.2012 / 20:02