What's the philosophy behind such an approach?
Eficiência (melhor uso das características do disco) e desempenho (permite que o aplicativo continue imediatamente após uma gravação).
Why isn't the data written at once?
A principal vantagem é que o sistema operacional é livre para reordenar e mesclar operações de gravação contíguas para melhorar o uso de largura de banda (menos operações e menos pesquisas). Os discos rígidos funcionam melhor quando um pequeno número de operações grandes é solicitado, enquanto os aplicativos tendem a precisar de um grande número de pequenas operações. Outra otimização clara é que o SO também pode remover todos, exceto a última gravação, quando o mesmo bloco é escrito várias vezes em um curto período de tempo, ou até mesmo remover algumas gravações, se o arquivo afetado tiver sido removido nesse meio tempo.
Essas gravações assíncronas são feitas após a chamada do sistema write
foi retornada. Essa é a segunda e mais visível vantagem do usuário. As gravações assíncronas aceleram os aplicativos, já que estão livres para continuar seu trabalho sem esperar que os dados realmente estejam no disco. O mesmo tipo de buffering / caching também é implementado para operações de leitura nas quais blocos de leitura recentes ou frequentemente são retidos na memória, em vez de serem lidos novamente do disco.
Is there no danger that the write will fail due to an IO error?
Não necessariamente. Isso depende do sistema de arquivos usado e da redundância no local. Um erro de E / S pode ser inofensivo se os dados puderem ser salvos em outro lugar. Sistemas de arquivos modernos, como o ZFS, fazem a auto-cura de blocos de disco defeituosos. Note também que erros de E / S não travam sistemas operacionais modernos. Se ocorrerem durante o acesso a dados, eles serão simplesmente informados ao aplicativo afetado. Se eles acontecerem durante o acesso aos metadados estruturais e colocarem o sistema de arquivos em risco, eles poderão ser remontados como somente leitura ou ficarão inacessíveis.
Existe também um pequeno risco de perda de dados em caso de falha do sistema operacional, falta de energia ou falha de hardware. Esta é a razão pela qual os aplicativos que devem ter 100% de certeza de que os dados estão no disco (por exemplo, bancos de dados / aplicativos financeiros) estão fazendo gravações síncronas menos eficientes, porém mais seguras. Para atenuar o impacto no desempenho, muitos aplicativos ainda usam gravações assíncronas, mas acabam sincronizando-as quando o usuário salva explicitamente um arquivo (por exemplo, vim, processadores de texto).
Por outro lado, uma grande maioria de usuários e aplicativos não precisa nem se importa com a segurança que as gravações síncronas fornecem. Se houver uma queda ou falta de energia, o único risco é perder no pior dos últimos 30 segundos de dados. A menos que haja uma transação financeira envolvida ou algo semelhante que implique um custo muito maior que 30 segundos de seu tempo, o enorme ganho em desempenho (que não é uma ilusão, mas muito real) permite que as assinaturas assíncronas superem amplamente o risco.
Por fim, as gravações síncronas não são suficientes para proteger os dados gravados de qualquer maneira. Se o seu aplicativo realmente precisa ter certeza de que seus dados não podem ser perdidos, aconteça o que acontecer, a replicação de dados em vários discos e em vários locais geográficos deve ser implementada para resistir a desastres como incêndios, inundações, etc.