Está dizendo que um cache é um tipo especial de buffer correto? Ambos desempenham funções semelhantes, mas há alguma diferença subjacente que estou perdendo?
um buffer é uma região de um armazenamento de memória física usado para armazenar temporariamente dados enquanto estão sendo movidos de um local para outro
Um buffer acaba alternando e mantendo todos os dados transmitidos de um local de armazenamento para outro (como ao usar 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.
De fato, 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ão sendo movidos de um lugar para outro (por exemplo, cache da CPU).
O objetivo de um cache é armazenar dados de maneira transparente, de modo que apenas dados suficientes sejam armazenados em cache para que os dados restantes possam ser transferidos sem nenhuma penalidade de desempenho. Nesse contexto, o cache apenas "busca previamente" uma pequena quantidade de dados (dependendo das taxas de transferência, tamanhos de cache, etc ...).
A principal diferença é que um buffer eventualmente conterá todos os dados. Por outro lado, um cache pode conter todos, alguns ou nenhum dado (dependendo do design). No entanto, um cache é acessado como se você estivesse acessando diretamente os dados em primeiro lugar - o que exatamente é armazenado em cache é transparente para o "usuário" do cache.
A diferença está na interface . Quando você está usando um cache para acessar uma fonte de dados, usa-o como se o cache fosse a fonte de dados - você pode acessar todas as partes da fonte de dados através do cache, e o cache determinará de onde os dados vêm (o próprio cache ou a fonte). O próprio cache determina quais partes dos dados devem ser pré-carregadas (geralmente apenas o começo, mas às vezes todos), 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 próprio cache da CPU , é prefetcher / readahead. Ambos carregam as partes de dados que eles acham que você mais utilizará na memória e revertem para o disco rígido se algo não estiver 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. Para fazer isso, seria necessário realocar o buffer (dado 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 a leitura da música, o processamento do áudio e o envio para sua 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).
Suponho que, no seu exemplo do Youtube, se o vídeo tiver sido completamente armazenado em buffer, ou seja, baixado para o seu dispositivo, ele é simplesmente armazenado em cache e você não precisa procurar um novo local cada vez que move o slide, a menos que atualize a página ou recarregue o vídeo. Isso seria correto?
PeanutsMonkey
@PeanutsMonkey correto, o vídeo do YouTube é baixado diretamente no cache do seu navegador enquanto está sendo armazenado em buffer. O buffer nesse caso é simplesmente um termo de alto nível, pois você está sempre visualizando o que está atualmente no cache. À medida que o vídeo é armazenado em buffer, ele é movido para o cache (eles compartilham o mesmo local físico). Atualizei a resposta com outro exemplo de buffer, no contexto de players de áudio.
Breakthrough
2
tl; dr version: se você deseja extrair os dados o mais rápido possível, é um buffer. Se você deseja manter os dados nele o maior tempo possível, é um cache.
David Schwartz
10
Seria mais preciso dizer que um cache é um padrão de uso específico de um buffer, que implica vários usos dos mesmos dados. A maioria dos usos de "buffer" implica que os dados serão drenados ou descartados após um único uso (embora esse não seja necessariamente o caso), enquanto "cache" implica que os dados serão reutilizados várias vezes. O armazenamento em cache também implica frequentemente que os dados são armazenados, pois também estão sendo usados simultaneamente, embora esse não seja necessariamente o caso (como na pré-busca e similares), enquanto o armazenamento em buffer implica que os dados estão sendo armazenados para uso posterior.
Certamente, porém, há uma grande sobreposição na implementação e no uso.
O buffer faz parte da memória principal. São estruturas presentes e acessadas a partir da memória primária (RAM).
Por outro lado, o cache é uma memória física separada na hierarquia de memória de um computador.
Às vezes, o buffer também é chamado de - cache do buffer. Esse nome enfatiza o fato de que o uso do buffer é semelhante ao do cache, ou seja, para armazenar dados. enquanto a diferença está no contexto de seu uso.
Os buffers são usados para armazenar dados temporariamente, enquanto os dados são movidos de um objeto para outro. EX: quando um vídeo é movido da Internet para o nosso PC, os buffers de exibição são usados para armazenar os quadros do vídeo que serão exibidos a seguir. (Isso aumenta a QoS, pois o vídeo seria executado após um processo de buffer bem-sucedido.) EX: outro exemplo é o cenário em que escrevemos dados em nossos arquivos. Os dados recém-gravados não são copiados para a memória secundária instantaneamente. As alterações feitas são armazenadas no buffer e, de acordo com a política projetada, as alterações são refletidas de volta ao arquivo na memória secundária (disco rígido).
Os caches, por outro lado, são usados entre a memória primária e os processadores, para preencher a lacuna entre a velocidade de execução da RAM e o processador. Além disso, os dados acessados com mais frequência são armazenados no cache para reduzir o acesso à RAM.
-1 você escreve "o cache é uma memória física separada" <--- Não. Não necessariamente. O IE armazena o cache no disco rígido e, sem dúvida, o carrega na RAM stackoverflow.com/questions/854412/… Não acho que o código C possa especificar para carregá-lo na memória física conhecida como cache. O que é colocado nesse cache é mais uma coisa de baixo nível, talvez apenas o sistema operacional possa especificar. Mas ainda é chamado de cache, embora esteja na RAM. E o squid do servidor da web pode configurar um cache, não há razão para pensar que isso esteja na memória física do cache ou precisa estar.
barlop
cache é uma função, ele não tem que estar na memória especial
barlop
1
Coisa comum: ambos são componentes intermediários de armazenamento de dados (software ou hardware) entre computação e armazenamento "principal".
Para mim, a diferença é a seguinte:
Amortecedor:
Lida com acesso seqüencial aos dados (por exemplo, leitura / gravação de dados de arquivo ou soquete)
Permite interface entre computação e armazenamento principal, adapta- se mutuamente aos diferentes padrões de transferência de dados de um produtor e consumidor de dados. Por exemplo, a computação grava pequenos pedaços de dados, mas a unidade de disco pode aceitar apenas pedaços de dados de um tamanho específico. Portanto, o buffer acumula pequenos pedaços como entrada e os reagrupa em pedaços maiores da saída.
Portanto, é como um padrão de design do adaptador . Ele une dois componentes em interação que não podem interoperar diretamente.
Exemplos: buffer de disco, BufferedReader na linguagem Java, duplicação em computação gráfica.
Cache:
Manipula o acesso aleatório aos dados (por exemplo, o cache da CPU armazena em cache linhas de memória que não são necessárias sequencialmente).
Otimiza o acesso ao armazenamento principal, tornando-o mais rápido. Por exemplo, o cache da CPU evita acessos à memória, tornando os comandos da CPU mais rápidos.
É como um padrão de design do Decorator . Ele une (geralmente de forma transparente) dois componentes em interação que, em princípio, poderiam interoperar diretamente, mas tornam a interação mais rápida.
Exemplos: cache da CPU, cache da página, proxy da Web, cache do navegador.
Respostas:
Do artigo da Wikipedia sobre buffers de dados :
Um buffer acaba alternando e mantendo todos os dados transmitidos de um local de armazenamento para outro (como ao usar 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.
De fato, 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ão sendo movidos de um lugar para outro (por exemplo, cache da CPU).
O objetivo de um cache é armazenar dados de maneira transparente, de modo que apenas dados suficientes sejam armazenados em cache para que os dados restantes possam ser transferidos sem nenhuma penalidade de desempenho. Nesse contexto, o cache apenas "busca previamente" uma pequena quantidade de dados (dependendo das taxas de transferência, tamanhos de cache, etc ...).
A principal diferença é que um buffer eventualmente conterá todos os dados. Por outro lado, um cache pode conter todos, alguns ou nenhum dado (dependendo do design). No entanto, um cache é acessado como se você estivesse acessando diretamente os dados em primeiro lugar - o que exatamente é armazenado em cache é transparente para o "usuário" do cache.
A diferença está na interface . Quando você está usando um cache para acessar uma fonte de dados, usa-o como se o cache fosse a fonte de dados - você pode acessar todas as partes da fonte de dados através do cache, e o cache determinará de onde os dados vêm (o próprio cache ou a fonte). O próprio cache determina quais partes dos dados devem ser pré-carregadas (geralmente apenas o começo, mas às vezes todos), 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 próprio cache da CPU , é prefetcher / readahead. Ambos carregam as partes de dados que eles acham que você mais utilizará na memória e revertem para o disco rígido se algo não estiver 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. Para fazer isso, seria necessário realocar o buffer (dado 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 a leitura da música, o processamento do áudio e o envio para sua 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).
fonte
Seria mais preciso dizer que um cache é um padrão de uso específico de um buffer, que implica vários usos dos mesmos dados. A maioria dos usos de "buffer" implica que os dados serão drenados ou descartados após um único uso (embora esse não seja necessariamente o caso), enquanto "cache" implica que os dados serão reutilizados várias vezes. O armazenamento em cache também implica frequentemente que os dados são armazenados, pois também estão sendo usados simultaneamente, embora esse não seja necessariamente o caso (como na pré-busca e similares), enquanto o armazenamento em buffer implica que os dados estão sendo armazenados para uso posterior.
Certamente, porém, há uma grande sobreposição na implementação e no uso.
fonte
Uma diferença importante entre cache e buffer é:
O buffer faz parte da memória principal. São estruturas presentes e acessadas a partir da memória primária (RAM).
Por outro lado, o cache é uma memória física separada na hierarquia de memória de um computador.
Às vezes, o buffer também é chamado de - cache do buffer. Esse nome enfatiza o fato de que o uso do buffer é semelhante ao do cache, ou seja, para armazenar dados. enquanto a diferença está no contexto de seu uso.
Os buffers são usados para armazenar dados temporariamente, enquanto os dados são movidos de um objeto para outro. EX: quando um vídeo é movido da Internet para o nosso PC, os buffers de exibição são usados para armazenar os quadros do vídeo que serão exibidos a seguir. (Isso aumenta a QoS, pois o vídeo seria executado após um processo de buffer bem-sucedido.) EX: outro exemplo é o cenário em que escrevemos dados em nossos arquivos. Os dados recém-gravados não são copiados para a memória secundária instantaneamente. As alterações feitas são armazenadas no buffer e, de acordo com a política projetada, as alterações são refletidas de volta ao arquivo na memória secundária (disco rígido).
Os caches, por outro lado, são usados entre a memória primária e os processadores, para preencher a lacuna entre a velocidade de execução da RAM e o processador. Além disso, os dados acessados com mais frequência são armazenados no cache para reduzir o acesso à RAM.
fonte
Coisa comum: ambos são componentes intermediários de armazenamento de dados (software ou hardware) entre computação e armazenamento "principal".
Para mim, a diferença é a seguinte:
Amortecedor:
Cache:
fonte