Digamos que seu programa esteja gravando informações em um arquivo. Como o disco recupera seu arquivo se houver uma falha no sistema?

6

E esse travamento do sistema acontece enquanto seu arquivo está sendo gravado pelo seu programa?

Além disso, é o caso de que quando o programa grava no arquivo, ele não está gravando diretamente no disco, mas sim na memória?

Porque parece que seria mais eficaz para o sistema transferir os dados gravados para a memória, e então quando é completamente escrito para transferir as coisas de volta para o disco.

Em qualquer caso, como o disco recupera dados se o programa grava diretamente no disco ou se o arquivo final está sendo copiado pelo sistema para vários locais no disco?

Kaitlyn Mcmordie
fonte
Qual sistema operacional você está usando? Qual sistema de arquivos você está usando?
FrustratedWithFormsDesigner
Hmmm agora meu computador é um Windows 7 (que eu estou supondo que é NTFS). Mas eu estava pensando em um sentido geral para esta questão (uma resposta especificada para a máquina de alguém está bem).
Confira o Shadow Copy (VSS) para Windows, e acho que os sistemas de arquivos journaling Linux possuem alguns metadados que são escritos antes da escrita para significar que o arquivo está sendo escrito em algum outro lugar, e então outra parte para significar que o arquivo foi escrito.
Malfist
Btw, o que você quer dizer com "sistemas de arquivos journaling linux"? Você quer dizer sistemas de arquivos logging linux ...?
1
Aqui vai, atualizarei minha resposta também: en.wikipedia.org/wiki/Journaling_file_system
Malfist

Respostas:

7

Porque parece que seria mais eficaz para o sistema   para transferir os dados gravados para a memória e, em seguida, quando é completamente   escrito para transferir as coisas de volta para o disco.

Nos sistemas operacionais modernos, o acesso a arquivos é armazenado em buffer. Seu programa grava em uma parte da memória que é mantida pelo sistema operacional e, quando essa área fica cheia, ou quando você fecha o arquivo, o buffer é gravado no disco. Dessa forma, você pode escrever vários gigabytes de dados aleatórios em um arquivo se quiser, mas não consome muita memória enquanto o faz. Ao mesmo tempo, o subsistema de disco é livre para fazer outras coisas enquanto seu programa está escrevendo alguns bytes de cada vez.

Em qualquer caso, como o disco recupera dados se o seu programa   grava diretamente no disco, ou se o arquivo finalizado está no   processo de ser copiado pelo sistema para vários locais no   disco?

Depende do sistema operacional e do sistema de arquivos específico. Frequentemente, os dados são gravados em um novo arquivo no disco. Quando o programa fecha o arquivo, o buffer é liberado e o diretório é atualizado para apontar para o novo arquivo, em vez do antigo, que pode ser excluído posteriormente. Isso evita corrupção de dados se o sistema falhar durante a gravação - a alteração do diretório no último momento cria a ilusão de gravações "atômicas".

Você pode querer ler sobre sistemas de arquivos registrados e sistemas de arquivos transacionais .

Outras estratégias também são possíveis. Livros inteiros estão disponíveis em sistemas de arquivos e tolerância a falhas.

Finalmente, às vezes o sistema de arquivos não pode recuperar seu arquivo. Às vezes não pode se recuperar de jeito nenhum. As estratégias que mencionei acima são respostas aos tipos de problemas que você está perguntando e, até onde eu sei, elas são muito eficazes em manter o disco em um estado consistente. Os sistemas de arquivos mais antigos não eram tão bons, e se você perdesse energia apenas quando o disco estivesse sendo gravado, o arquivo ou o disco inteiro poderia ficar comprometido. Costumava haver um grande mercado para utilitários de reparo de disco, como o Norton Disk Doctor. Esse mercado parece ter diminuído com implementações de sistema operacional mais confiáveis, mas alguns desses produtos ainda estão disponíveis.

Caleb
fonte
1
Obrigado! Apenas duas perguntas bem rápidas aqui: 1) Então, vamos dizer que o arquivo não é escrito atomicamente, e tudo deve ser "revertido". Isso significa que na próxima vez que o sistema for reinicializado, o sistema verificará o log e fará essa alteração novamente? 2) Além disso, eu não tenho certeza do que você quer dizer com tolerância a falhas, pois isso é algo que eu tenho visto quando me refiro a sistemas distribuídos, mas não tanto com discos ...
Kaitlyn Mcmordie
@KaitlynMcmordie 1) Novamente, o que acontece depende do sistema de arquivos e do sistema operacional, mas geralmente, se uma gravação não puder ser concluída por algum motivo (como falha de energia), o sistema de arquivos não mostrará a alteração. Então, se o arquivo acabou de ser criado, ele não existirá no disco. Se estava sendo modificado, o arquivo no disco será a versão anterior à gravação. 2) Robustez pode ser um termo melhor que tolerância ao erro Aqui; Eu apenas quis dizer a capacidade do sistema para permanecer consistente, apesar de vários tipos de erros.
Caleb
2
1) Quando o sistema operacional é concluído com um sistema de arquivos, ele é marcado como limpo. Depois de um acidente, ele vê que está sujo e o diário é realmente processado. No entanto, isso não significa que você obtenha os dados originais ou novos no arquivo gravado durante a falha. Você só obtém um sistema de arquivos em um estado sadio (nenhum bloco usado marcado como não utilizado, sem referências pendentes, contagens corretas de links, ...).
maaartinus
2) Perguntando ao Google sobre disco e tolerância a falhas dá três milhões de resultados. O mesmo para sistema de arquivos e tolerância a falhas. De facto, a tolercia a falhas um termo muito amplamente aplicel, ver, e. RAID.
maaartinus
2
@KaitlynMcmordie: Uma "referência pendente" seria um nome de arquivo que ainda está em um diretório, mas não possui mais um arquivo físico associado a ele. Isso aconteceria se o computador travasse no meio do caminho durante a exclusão de um arquivo - o sistema operacional precisa remover o arquivo e o nome do arquivo, e eles geralmente são armazenados em locais diferentes.
MSalters
5

A maioria dos sistemas de arquivos modernos registrado . Isso significa que há um diário de alterações no arquivo / sistema de arquivos. Em falhas, a última entrada pode ser revertida se não estiver marcada como concluída; ou se houver informação suficiente, pode ser promulgada.

A Wikipédia tem isso:

Para evitar isso [perda de dados na falha], um sistema de arquivos registrados aloca uma área especial - o   revista - em que registra as alterações que fará, antes do tempo.   Depois de um acidente, a recuperação envolve simplesmente a leitura do diário do   sistema de arquivos e reproduzir alterações deste diário até o arquivo   sistema é consistente novamente. As mudanças são, portanto, consideradas atômicas (ou   indivisíveis) em que: ou suceder (tiveram sucesso originalmente ou são   repetidas completamente durante a recuperação), ou não são reproduzidas (são   ignorado porque eles ainda não tinham sido completamente escritos para o   diário antes da ocorrência da falha).

No Windows (vista e além), há uma tecnologia chamada Volume Shadow Copy (VSS), que faz o sistema de arquivos agir de uma maneira "copy-on write", ou seja, quando você escreve em um arquivo, esse arquivo antigo não está sendo destruído, e é de fato mantido intacto. Isso permite a restauração após falhas, mas, mais importante, também permite acesso à última versão estável do arquivo no caso de um bloqueio de arquivo e um processo (como um serviço de backup) precisa ler esse arquivo.

Malfist
fonte
Entendo! Então, ao registrar no diário o sistema de arquivos, eu estou supondo que é o mesmo que um sistema de arquivos logging, apenas usando termos diferentes para descrever a mesma coisa?
Kaitlyn Mcmordie
1
@KaitlynMcmordie: Sim.
surfasb
Normalmente eu ouço 'journaling' muito mais do que ouço 'logging', fwiw. (Suponho que 'logging' possa ser ambíguo em mais contextos.)
Shinrai
... como evidenciado talvez por en.wikipedia.org/wiki/Logging_file_system
Shinrai