if I turn off the computer immediately after I edit and save a file, my changes will be most likely lost?
Eles podem ser. Eu não diria "muito provavelmente", mas a probabilidade depende de muitas coisas.
Uma maneira fácil de aumentar o desempenho das gravações de arquivos é que o sistema operacional armazena apenas os dados em cache, informa a aplicação pela qual a gravação passou e depois faz a gravação mais tarde. Isso é especialmente útil se houver outra atividade de disco acontecendo ao mesmo tempo: o SO pode priorizar leituras e fazer as gravações posteriormente. Ele também pode remover completamente a necessidade de uma gravação real, por exemplo, no caso em que um arquivo temporário é removido rapidamente depois.
O problema de armazenamento em cache é mais pronunciado se o armazenamento for lento. Copiar arquivos de um SSD rápido para um stick USB lento provavelmente envolverá muito cache de gravação, já que o pendrive USB não consegue acompanhar. Mas o comando cp
retorna mais rápido, então você pode continuar trabalhando, possivelmente até editando os arquivos que acabaram de ser copiados.
Claro que o cache tem a desvantagem que você nota, alguns dados podem ser perdidos antes de serem salvos. O usuário será ofendido se o editor disser que a gravação foi bem-sucedida, mas o arquivo não estava no disco. É por isso que há a fsync()
chamada de sistema , que deve retornar somente depois o arquivo atingiu o disco. Seu editor pode usar isso para garantir que os dados estejam bem antes de relatar ao usuário que a gravação foi bem-sucedida.
Eu disse, "supostamente deveria", já que a própria unidade poderia dizer as mesmas mentiras para o sistema operacional e dizer que a gravação está completa, enquanto o arquivo realmente existe apenas em um cache de gravação volátil dentro da unidade. Dependendo da unidade, pode não haver maneira de contornar isso.
Além de fsync()
, há também as chamadas de sistema sync()
e syncfs()
que solicitam ao sistema que todas as gravações em todo o sistema ou todas as gravações em um determinado sistema de arquivos atinjam o disco. O utilitário sync
pode ser usado para chamá-los.
Depois, há também o O_DIRECT
sinalizador para open()
, que é deveria "tentar minimizar os efeitos de cache do I / O para e deste arquivo." A remoção do cache reduz o desempenho, portanto, é usado principalmente por aplicativos (bancos de dados) que fazem seu próprio armazenamento em cache e desejam controlá-lo.
( O_DIRECT
não está isento de problemas, os comentários sobre isso na página man são um pouco divertidos.)
O que acontece em uma falta de energia também depende do sistema de arquivos. Não são apenas os dados do arquivo com os quais você deve se preocupar, mas os metadados do sistema de arquivos. Ter os dados do arquivo no disco não é muito útil se você não conseguir encontrá-los. Apenas estender um arquivo para um tamanho maior exigirá alocação de novos blocos de dados e eles precisam ser marcados em algum lugar.
Como um sistema de arquivos lida com mudanças de metadados e a ordenação entre metadados e gravações de dados varia muito. Por exemplo, com ext4
, se você definir o sinalizador de montagem data=journal
, todas as gravações - até mesmo as gravações de dados - passarão pelo diário e deverão ser bastante seguras. Isso também significa que eles são escritos duas vezes, então o desempenho cai. As opções padrão tentam ordenar as gravações para que os dados estejam no disco antes que os metadados sejam atualizados. Outras opções ou outros sistemas de arquivos podem ser melhores ou piores; Eu nem vou tentar um estudo abrangente.
Na prática, em um sistema com carga leve, o arquivo deve atingir o disco dentro de alguns segundos. Se você estiver lidando com armazenamento removível, desmonte o sistema de arquivos antes de puxar a mídia para certificar-se de que os dados foram realmente enviados para a unidade, e não há mais nenhuma atividade. (Ou faça com que o seu ambiente de GUI faça isso por você.)