Eu sei que um cache é usado para melhorar a velocidade de leitura de dados do disco rígido porque a velocidade de leitura de dados do disco rígido e a velocidade de leitura de dados da RAM são muito diferentes. Portanto, o índice de falta de cache é muito importante.
Além disso, sei que temos o buffer (por exemplo, existem BufferedWriter
e BufferedReader
em Java) durante a leitura e gravação no disco rígido ou em outros dispositivos, como o teclado. Mas não sei por que precisamos de um buffer. E se não tivermos buffer? O buffer também é para melhorar a velocidade de leitura? Em caso afirmativo, qual é a diferença entre buffer e cache?
Além disso, eu sei que o cache é para melhorar a velocidade de leitura, mas o cache pode melhorar a velocidade de gravação de dados da RAM no disco rígido?
Um buffer, pelo que entendi, é mais útil quando as taxas nas quais um produtor e um consumidor produzem ou consomem dados de maneira ideal são diferentes.
Por exemplo, um programa pode gravar 8 bytes de dados em um arquivo por vez. Para o disco que está sendo gravado, pode ser ideal gravar 4 KiB de dados por vez. Para blocos significativamente menores, a sobrecarga envolvida na gravação no disco pode se tornar maior do que o tempo gasto pelo disco para realmente gravar os dados (de modo que 512*T_8b >> T_4KiB). Portanto, ter um buffer entre reunir blocos de dados de 4 KiB e gravá-los de uma só vez aumentaria muito o desempenho. Veja, por exemplo: Por que dd demora tanto? , onde a solução mais simples é usar um tamanho de buffer maior. (Claro, meus números aqui são apenas para exemplo. Os números reais adequados para discos modernos podem ser muito diferentes.)
Um cache é ortogonal ao buffer. Tanto o cache quanto o buffer são feitos para evitar acessos extras desnecessários de uma fonte lenta (disco, rede, etc.). Mas um cache funciona eliminando leituras e gravações duplicadas, salvando os resultados para reutilização, enquanto um buffer funciona eliminando leituras e gravações repetidas e sequenciais, agrupando-as. Uma visão simplista: