-
Sua afirmação na primeira questão é ficção. Chamadas de API do Windows, como, por exemplo,
FlushFileBuffers()
will FileStream.Flush() no .NET, etc., eventualmente, chamam essa API. -
Programas que fazem muita E / S de disco sem chamar
FlushFileBuffers()
diretamente, ou qualquer API auxiliar que eventualmente a chama, veriam o aumento de desempenho mais notável. Por exemplo, se você estava executando uma E / S não essencial, em que os dados se perdem, como o BOINC (se for perdido, basta baixar novamente o arquivo ou tentar recalcular os cálculos), evite fazer chamadasFlushFileBuffers()
, e apenas chame uma API comoWriteFile()
- os dados serão bufferizados para serem gravados, mas não serão gravados por um longo período, como quando o arquivo o descritor é fechado ou quando o programa sai. Infelizmente também é possível que, se o sistema travar (como um BSOD), todos os dados sejam perdidos, então é realmente importante que se você estiver lidando com qualquer tipo de dados valiosos / não substituíveis. que você faz fazer chamarFlushFileBuffers()
, se a limpeza do buffer está ativada ou não! Caso contrário, um simples bug de driver (por exemplo, no seu driver gráfico) pode causar a perda de muitos dados. -
Não é possível encontrar nenhuma referência, mas você notará mais com programas que se encaixam na descrição do segundo item acima.
-
A sincronização de dados para o disco não é tão rápida assim, especialmente se for feita com frequência em um loop estreito. Por padrão, se bem me lembro de ler livros do Windows Internals, o NTFS por padrão sincroniza todos os buffers de sistema de arquivos sujos com o disco a cada 5 segundos . Esta é aparentemente uma compensação decente entre estabilidade e desempenho. O problema com a sincronização freqüente de dados é que faz com que o disco rígido faça muitas buscas e escritas.
Considere o seguinte pseudocódigo:
1: seek to a certain block (1)
2: write a couple megabytes of data into blocks starting at (1)
3: wait 2 seconds
4: seek to another block (2)
5: write some more megabytes of data into blocks starting at (2)
6: seek back to block (1)
7: write some more megabytes of data into blocks starting at (1)
8: wait 10 minutes
9: seek to block (1)
10: write some megabytes of data into blocks starting at (1)
11: wait 5 seconds
12: seek to block (2)
13: write some megabytes of data into blocks starting at (2)
14: explicit call to FlushFileBuffers()
Com o buffer automático de 5 segundos em :
- As gravações ocorridas nas linhas 2, 5 e 7 ocorrem na RAM e o disco não se move, até que 5 segundos se passaram desde a primeira gravação e, em seguida, os dados mais recentes (da linha 7 ) é gravado no bloco (1) e os únicos dados gravados no bloco (2) são gravados.
- As gravações ocorridas nas linhas 10 e 13, que sobrescrevem dados nos blocos (1) e (2), precisam ser gravadas no disco novamente
- Assim, o número total de vezes que o bloco (1) foi gravado na RAM é 3 e no disco , 2. O número total de vezes que o bloco (2) ) foi escrito para RAM é 2 e para disco , 2.
Com o buffer automático de 5 segundos desativado (o efeito da caixa de seleção na sua pergunta):
- As gravações ocorridas nas linhas 2, 5, 7, 10 e 13 ocorrem na RAM e o disco não se move, até que a linha 14 seja executada e, em seguida, os dados mais recentes (das linhas 10 e 13) é escrito em blocos (1) e (2). Os dados antigos das linhas 2, 5 e 7 nunca atingem o disco rígido!
Considerando que um sistema ocupado pode experimentar entre centenas a dezenas de milhares de gravações em arquivos por segundo, isso é ótimo para desempenho, especialmente em discos rígidos tradicionais (é menos impressionante em SSDs). A RAM é 20 vezes mais rápida do que os discos rígidos como medida geral, embora essa lacuna seja menor com os SSDs.
A razão pela qual eles dizem que você deve usar um backup de bateria é que você não quer ter 35 minutos de dados escritos armazenados em buffer na memória RAM que não são gravados no disco apenas porque o programador era preguiçoso e não ligou para%.FlushFileBuffers()
e, em seguida, ter uma falha de energia. Claro, um backup de bateria não protege você contra erros de driver que causam um BSOD ....