Qual è la differenza tra una cache e un buffer?


Risposte:


11

Dall'articolo di Wikipedia sui buffer di dati :

un buffer è una regione di memoria fisica utilizzata per conservare temporaneamente i dati mentre vengono spostati da una posizione a un'altra

Un buffer finisce per scorrere e conservare ogni singolo dato che viene trasmesso da una posizione di archiviazione a un'altra (come quando si utilizza un buffer circolare nell'elaborazione audio). Un buffer consente proprio questo: un "buffer" di dati prima e dopo la posizione corrente nel flusso di dati.

In effetti, ci sono alcuni aspetti comuni di un buffer e una cache. Tuttavia, la cache in senso convenzionale di solito non memorizza tutti i dati quando vengono spostati da un luogo all'altro (ad esempio cache della CPU).

Lo scopo di una cache è di archiviare i dati in modo trasparente, in modo tale che i dati sufficienti vengano memorizzati nella cache in modo che i dati rimanenti possano essere trasferiti senza alcuna penalità di prestazione. In questo contesto, la cache "preleva" solo una piccola quantità di dati (a seconda della velocità di trasferimento, delle dimensioni della cache, ecc ...).

La differenza principale è che un buffer alla fine avrà conservato tutti i dati. Al contrario, una cache potrebbe contenere tutti, alcuni o nessuno dei dati (a seconda del design). Tuttavia, si accede a una cache come se si stesse accedendo direttamente ai dati in primo luogo: ciò che viene esattamente memorizzato nella cache è trasparente per "l'utente" della cache.


La differenza sta nell'interfaccia . Quando si utilizza una cache per accedere a un'origine dati, la si utilizza come se la cache fosse l'origine dati: è possibile accedere a ogni parte dell'origine dati attraverso la cache e la cache determinerà da dove provengono i dati (il cache stessa o sorgente). La stessa cache determina quali parti dei dati precaricare (di solito solo l'inizio, ma a volte tutte), mentre l' algoritmo di sostituzione della cache in uso determina cosa / quando le cose vengono rimosse dalla cache. Il miglior esempio di questo è un sistema, a parte la cache della CPU stessa, è prefetcher / readahead. Entrambi caricano le parti di dati che pensano che userete di più in memoria e ripristinano il disco rigido se qualcosa non viene memorizzato nella cache.

Al contrario, un buffer non può essere utilizzato per spostare istantaneamente la posizione nel flusso di dati, a meno che la nuova parte non sia già stata spostata nel buffer. Per fare ciò richiederebbe il riposizionamento del buffer (dato che la nuova posizione supera la lunghezza del buffer), richiedendo effettivamente di "riavviare" il buffer da una nuova posizione. Il miglior esempio di ciò è spostare il cursore in un video di Youtube.

Un altro buon esempio di buffer è la riproduzione dell'audio in Winamp. Poiché i file audio devono essere decodificati dalla CPU, ci vuole del tempo tra il momento in cui il brano viene letto, a quando viene elaborato l'audio, a quando viene inviato alla scheda audio. Winamp eseguirà il buffering di alcuni dei dati audio, in modo che vi siano già sufficienti dati audio elaborati per evitare qualsiasi "blocco" (ovvero la CPU prepara sempre l'audio che ascolterai in poche centinaia di millisecondi, non è mai in tempo reale ; ciò che senti proviene dal buffer, che è ciò che la CPU ha preparato in passato).


Presumo che nel tuo esempio di Youtube se il video è completamente bufferizzato, cioè scaricato sul tuo dispositivo, è semplicemente memorizzato nella cache e non devi cercare una nuova posizione ogni volta che sposti la diapositiva a meno che non aggiorni la pagina o ricarichi il video. Sarebbe corretto?
PeanutsMonkey

@PeanutsMonkey corretto, il video di Youtube viene scaricato direttamente nella cache del browser mentre viene bufferizzato. Il buffer in questo caso è semplicemente un termine di alto livello, in quanto si visualizza sempre ciò che si trova attualmente nella cache. Poiché il video viene bufferizzato, viene spostato nella cache (condividono la stessa posizione fisica). Ho aggiornato la risposta con un altro esempio di buffer, nel contesto dei lettori audio.
Breakthrough

2
tl; versione dr: se vuoi estrarre i dati il ​​più rapidamente possibile, è un buffer. Se vuoi conservare i dati il ​​più a lungo possibile, è una cache.
David Schwartz,

10

Sarebbe più preciso affermare che una cache è un particolare modello di utilizzo di un buffer, il che implica molteplici usi degli stessi dati. La maggior parte degli usi di "buffer" implica che i dati verranno svuotati o eliminati dopo un singolo utilizzo (anche se questo non è necessariamente il caso), mentre "cache" implica che i dati verranno riutilizzati più volte. La memorizzazione nella cache spesso implica anche che i dati vengano archiviati così come vengono utilizzati contemporaneamente, sebbene ciò non sia necessariamente il caso (come nel pre-recupero e simili), mentre il buffering implica che i dati vengano archiviati per un uso successivo.

Vi è certamente una grande sovrapposizione sia nell'implementazione che nell'utilizzo.


3

Una differenza importante tra cache e buffer è:

Il buffer è una parte della memoria principale. Sono strutture presenti e accessibili dalla memoria primaria (RAM).

D'altra parte, la cache è una memoria fisica separata nella gerarchia di memoria di un computer.

Il buffer viene talvolta chiamato anche - Cache buffer. Questo nome sottolinea il fatto che l'uso del buffer è simile a quello della cache, ovvero alla memorizzazione dei dati. mentre la differenza sta nel contesto del suo utilizzo.

I buffer vengono utilizzati per l'archiviazione temporanea dei dati, mentre i dati vengono spostati da un oggetto a un altro. ES: quando un video viene spostato da Internet sul nostro PC per i buffer di visualizzazione vengono utilizzati per memorizzare i frame del video che verrebbero visualizzati successivamente. (QUESTO AUMENTA IL QoS, COME AVREBBE FUNZIONATO LENTAMENTE IL VIDEO DOPO UN PROCESSO DI BUFFERING DI SUCCESSO.) ES: un altro esempio è lo scenario in cui scriviamo dati sui nostri file. I dati appena scritti non vengono copiati istantaneamente nella memoria secondaria. Le modifiche apportate vengono archiviate nel buffer e quindi in base alla politica progettata, le modifiche vengono riportate nel file nella memoria secondaria (disco rigido).

Le cache, d'altra parte, vengono utilizzate tra la memoria principale e i processori, per colmare il divario tra la velocità di esecuzione della RAM e il processore. Inoltre, i dati a cui si accede più frequentemente vengono archiviati nella cache per ridurre l'accesso alla RAM.


-1 si scrive "cache è una memoria fisica separata" <--- No. Non necessariamente. Internet Explorer memorizza la cache sull'HDD e senza dubbio la carica nella RAM stackoverflow.com/questions/854412/… Non credo che il codice C possa specificare di caricarla nella memoria fisica nota come cache. Ciò che viene inserito in quella cache è più una cosa di basso livello, forse solo il sistema operativo può specificare. Ma si chiama ancora cache anche se è nella RAM. E i calamari del web server possono impostare una cache, nessun motivo per pensare che sia tutto nella memoria cache fisica o debba esserlo.
barlop

la memorizzazione nella cache è una funzione, non deve essere in memoria speciale
barlop

1

Cosa comune: entrambi sono componenti intermedi di archiviazione dei dati (software o hardware) tra il calcolo e lo storage "principale".

Per me la differenza è la seguente:

Buffer:

  • Gestisce l' accesso sequenziale ai dati (ad es. Lettura / scrittura dei dati da file o socket)
  • Consente l' interfaccia tra il calcolo e l'archiviazione principale, adatta gli uni agli altri i diversi modelli di trasferimento dei dati di un produttore di dati e di un consumatore di dati. Ad esempio, il calcolo scrive piccoli blocchi di dati, ma l'unità disco può accettare solo pezzi di dati di dimensioni specifiche. Quindi il buffer accumula piccoli pezzi come input e li raggruppa in pezzi più grandi dell'output.
  • Quindi è come un modello di progettazione dell'adattatore . Unisce due componenti interagenti che non possono interagire direttamente.
  • Esempi: buffer del disco, BufferedReader in linguaggio Java, duffering in computer grafica.

cache:

  • Gestisce l' accesso casuale ai dati (ad esempio la cache della CPU memorizza nella cache linee di memoria che non sono state localizzate in modo sequenziale).
  • Ottimizza l' accesso all'archivio principale, lo rende più veloce. Ad esempio, la cache della CPU evita gli accessi alla memoria rendendo i comandi della CPU più veloci.
  • È come un modello di design di Decorator . Unisce (spesso in modo trasparente) due componenti interagenti che in linea di principio potrebbero interagire direttamente, ma rende l'interazione più rapida.
  • Esempi: cache della CPU, cache della pagina, proxy Web, cache del browser.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.