Para maior clareza - a mecânica real é mais complicada para dar uma segurança ainda melhor - você pode imaginar a operação de gravação em disco assim:
- o aplicativo grava bytes (1)
- o kernel (e / ou o sistema de arquivos IOSS) os armazena em buffer
- quando o buffer estiver cheio, ele será liberado para o sistema de arquivos:
- o bloco está alocado (2)
- o bloco está escrito (3)
- as informações de arquivo e bloco são atualizadas (4)
Se o processo for interrompido em (1), você não recebe nada no disco, o arquivo está intacto e truncado no bloco anterior. Você enviou 5000 bytes, apenas 4096 estão no disco, você reinicia a transferência no deslocamento 4096.
Se em (2), nada acontece, exceto na memória. O mesmo que (1). Se em (3), os dados são escritos mas ninguém se lembra disso . Você enviou 9000 bytes, 4096 foram escritos, 4096 foram escritos e perdidos , o resto acabou de se perder. Transferir currículos no deslocamento 4096.
Se em (4), os dados devem agora ter sido confirmados no disco. Os próximos bytes no fluxo podem ser perdidos. Você enviou 9000 bytes, 8192 foi escrito, o restante foi perdido, a transferência foi retomada no deslocamento 8192.
Esta é uma tomada simplificada . Por exemplo, cada gravação "lógica" nos estágios 3-4 não é "atômica", mas dá origem a outra sequência (vamos numerá-la # 5) através da qual o bloco é subdividido em sub-blocos adequados para o dispositivo de destino (por exemplo, disco rígido). ) é enviado para o controlador host do dispositivo, que também possui um mecanismo de armazenamento em cache e, finalmente, armazenado no prato magnético. Esta sub-sequência nem sempre está completamente sob o controle do sistema, portanto, ter enviado dados para o disco rígido não é uma garantia de que foi realmente gravado e será legível de volta.
Vários sistemas de arquivos implementam o journaling , para garantir que o ponto mais vulnerável, (4), não seja realmente vulnerável, escrevendo metadados em, você adivinhou isso, transações que funcionarão consistentemente, seja qual for o estágio (5).
Se o sistema for reinicializado no meio de uma transação, ele poderá retomar o caminho até o ponto de verificação intacto mais próximo. Os dados gravados ainda são perdidos, como no caso (1), mas a retomada cuidará disso. Nenhuma informação é perdida.