Do artigo da Wikipedia sobre os buffers de dados :
a buffer is a region of a physical memory storage used to temporarily hold data while it is being moved from one place to another
Um buffer termina passando por todos os dados que são transmitidos de um local de armazenamento para outro (como quando se usa um buffer circular no processamento de áudio). Um buffer permite exatamente isso - um "buffer" de dados antes e depois da sua posição atual no fluxo de dados.
Na verdade, existem alguns aspectos comuns de um buffer e um cache. No entanto, o cache no sentido convencional geralmente não armazena todos os dados quando está sendo movido de um lugar para outro (ou seja, cache da CPU).
O objetivo de um cache é armazenar dados de forma transparente de modo que apenas dados suficientes sejam armazenados em cache para que os dados restantes possam ser transferidos sem qualquer penalidade de desempenho. Nesse contexto, o cache apenas "pré-busca" uma pequena quantidade de dados (dependendo das taxas de transferência, tamanhos de cache, etc ...).
A principal diferença é que um buffer eventualmente armazenará todos os dados. Por outro lado, um cache pode conter todos, alguns ou nenhum dos dados (dependendo do design). No entanto, um cache é acessado como se você estivesse acessando diretamente os dados em primeiro lugar - o que fica exatamente em cache é transparente para o "usuário" do cache.
A diferença está na interface . Quando você usa um cache para acessar uma fonte de dados, você o usa como se o cache fosse a a fonte de dados - você pode acessar cada parte da fonte de dados através do cache, e o cache determinará de onde vêm os dados (o próprio cache ou a origem). O próprio cache determina quais partes dos dados serão pré-carregadas (geralmente apenas o começo, mas às vezes todas), enquanto o algoritmo de substituição de cache em uso determina o que / quando as coisas são removidas do cache. O melhor exemplo disso é um sistema, além do cache da CPU , é prefetcher / readahead . Ambos carregam as partes de dados que eles acham que você usará mais na memória e revertem para o disco rígido se algo não estiver armazenado em cache.
Por outro lado, um buffer não pode ser usado para mover instantaneamente sua localização no fluxo de dados, a menos que a nova peça já tenha sido movida para o buffer. Isso exigiria que o buffer fosse realocado (considerando que o novo local excede o comprimento do buffer), exigindo efetivamente que você "reinicie" o buffer a partir de um novo local. O melhor exemplo disso é mover o controle deslizante em um vídeo do Youtube.
Outro bom exemplo de buffer é a reprodução de áudio no Winamp. Como os arquivos de áudio precisam ser decodificados pela CPU, leva algum tempo entre quando a música é lida, quando o áudio é processado, até quando é enviado para a placa de som. O Winamp armazenará em buffer alguns dos dados de áudio, para que haja dados de áudio suficientes já processados para evitar travamentos (ou seja, a CPU está sempre preparando o áudio que você ouvirá em algumas centenas de milissegundos, nunca em tempo real o que você ouve vem do buffer, que é o que a CPU preparou no passado).