Was ist der Unterschied zwischen einem Cache und einem Puffer?

12

Ist die Aussage, dass ein Cache eine besondere Art von Puffer ist, korrekt? Beide führen ähnliche Funktionen aus, aber gibt es einen Unterschied, den ich vermisse?

Dharini Chandrasekaran
quelle
stackoverflow.com/questions/6345020/…
Ciro Santilli 3 改造 改造 中心 法轮功 六四

Antworten:

11

Aus dem Wikipedia-Artikel über Datenpuffer :

Ein Puffer ist ein Bereich eines physischen Speichers, in dem Daten vorübergehend gespeichert werden, während sie von einem Ort an einen anderen verschoben werden

Ein Puffer durchläuft und speichert jedes einzelne Datenelement, das von einem Speicherort zu einem anderen übertragen wird (wie bei Verwendung eines Ringpuffers bei der Audioverarbeitung). Ein Puffer ermöglicht genau das - einen "Puffer" von Daten vor und nach Ihrer aktuellen Position im Datenstrom.

In der Tat gibt es einige gemeinsame Aspekte eines Puffers und eines Caches. Der Cache im herkömmlichen Sinne speichert jedoch normalerweise nicht alle Daten, wenn er von Ort zu Ort verschoben wird (dh CPU-Cache).

Der Zweck eines Caches besteht darin, Daten auf transparente Weise zu speichern, sodass gerade genug Daten zwischengespeichert werden, damit die verbleibenden Daten ohne Leistungseinbußen übertragen werden können. In diesem Zusammenhang "holt" der Cache nur eine kleine Datenmenge vor (abhängig von den Übertragungsraten, Cache-Größen usw.).

Der Hauptunterschied besteht darin, dass ein Puffer möglicherweise alle Daten enthält. Umgekehrt enthält ein Cache möglicherweise alle, einige oder keine Daten (je nach Design). Auf einen Cache wird jedoch zugegriffen, als ob Sie überhaupt direkt auf die Daten zugreifen würden. Was genau zwischengespeichert wird, ist für den "Benutzer" des Caches transparent.


Der Unterschied liegt in der Schnittstelle . Wenn Sie einen Cache verwenden eine Datenquelle zugreifen zu können , verwenden Sie es , als ob der Cache ist die Datenquelle - Sie jeden Teil der Datenquelle durch den Cache zugreifen können, und der Cache wird bestimmen , wo die Daten aus (das kommt Cache selbst oder die Quelle). Der Cache selbst bestimmt, welche Teile der Daten vorab geladen werden sollen (normalerweise nur der Anfang, manchmal aber auch alle), während der verwendete Cache-Ersetzungsalgorithmus bestimmt, welche / wann Dinge aus dem Cache entfernt werden. Das beste Beispiel hierfür ist ein System, das neben dem CPU-Cache selbst Prefetcher / Readahead ist. Beide laden die Teile der Daten, von denen sie glauben, dass Sie sie am meisten verwenden, in den Speicher und kehren zur Festplatte zurück, wenn etwas nicht zwischengespeichert ist.

Umgekehrt kann ein Puffer nicht verwendet werden, um Ihren Speicherort im Datenstrom sofort zu verschieben, es sei denn, der neue Teil wurde bereits in den Puffer verschoben. Um dies zu tun, müsste der Puffer verschoben werden (vorausgesetzt, der neue Speicherort überschreitet die Pufferlänge), sodass Sie den Puffer effektiv von einem neuen Speicherort aus "neu starten" müssen. Das beste Beispiel hierfür ist das Verschieben des Schiebereglers in einem Youtube-Video.

Ein weiteres gutes Beispiel für einen Puffer ist die Wiedergabe von Audio in Winamp. Da Audiodateien von der CPU dekodiert werden müssen, dauert es einige Zeit zwischen dem Einlesen des Songs, dem Verarbeiten des Audios und dem Senden an Ihre Soundkarte. Winamp puffert einige der Audiodaten, so dass bereits genügend Audiodaten verarbeitet wurden, um "Abstürze" zu vermeiden (dh die CPU bereitet das Audio, das Sie in wenigen hundert Millisekunden hören, immer vor, es ist nie in Echtzeit ; was Sie hören, kommt aus dem Puffer, den die CPU in der Vergangenheit vorbereitet hat).

Durchbruch
quelle
Ich gehe davon aus, dass in Ihrem Beispiel von Youtube, wenn das Video vollständig gepuffert, dh auf Ihr Gerät heruntergeladen wurde, es einfach zwischengespeichert wird und Sie nicht jedes Mal, wenn Sie die Folie verschieben, nach einem neuen Speicherort suchen müssen, es sei denn, Sie aktualisieren die Seite oder laden die Video. Wäre das richtig?
PeanutsMonkey
@PeanutsMonkey richtig, das Youtube-Video wird direkt in den Cache deines Browsers heruntergeladen, während es gepuffert wird. Der Puffer ist in diesem Fall einfach ein übergeordneter Begriff, da Sie immer anzeigen, was sich derzeit im Cache befindet. Wenn das Video gepuffert wird, wird es in den Cache verschoben (sie teilen sich denselben physischen Speicherort). Ich habe die Antwort mit einem anderen Beispiel eines Puffers im Kontext von Audio-Playern aktualisiert.
Durchbruch
2
tl; dr version: Wenn Sie die Daten so schnell wie möglich herausholen möchten, ist dies ein Puffer. Wenn Sie die Daten so lange wie möglich darin behalten möchten, handelt es sich um einen Cache.
David Schwartz
10

Es wäre genauer zu sagen, dass ein Cache ein bestimmtes Verwendungsmuster eines Puffers ist, das mehrere Verwendungen derselben Daten impliziert. Die meisten Verwendungen von "Puffer" implizieren, dass die Daten nach einer einmaligen Verwendung entleert oder verworfen werden (obwohl dies nicht unbedingt der Fall ist), während "Cache" impliziert, dass die Daten mehrmals wiederverwendet werden. Das Zwischenspeichern impliziert häufig auch, dass die Daten gespeichert werden, da sie auch gleichzeitig verwendet werden, obwohl dies nicht unbedingt der Fall ist (wie beim Vorabrufen und dergleichen), während das Puffern impliziert, dass die Daten für die spätere Verwendung gespeichert werden.

Es gibt jedoch sicherlich eine große Überschneidung sowohl bei der Implementierung als auch bei der Verwendung.

flauschige
quelle
3

Ein wichtiger Unterschied zwischen Cache und Puffer ist:

Der Puffer ist ein Teil des Primärspeichers. Sie sind Strukturen, die vom Primärspeicher (RAM) vorhanden sind und auf die zugegriffen wird.

Andererseits ist der Cache ein separater physischer Speicher in der Speicherhierarchie eines Computers.

Puffer wird manchmal auch als - Puffercache bezeichnet. Dieser Name betont die Tatsache, dass die Verwendung von Puffer der von Cache ähnlich ist, dh zum Speichern von Daten. während der Unterschied im Kontext seiner Verwendung liegt.

Puffer werden zum vorübergehenden Speichern von Daten verwendet, während die Daten von einem Objekt zu einem anderen verschoben werden. EX: Wenn ein Video aus dem Internet auf unseren PC verschoben wird, werden die Anzeigepuffer zum Speichern der Bilder des Videos verwendet, die als Nächstes angezeigt werden. (Dies erhöht die QoS, da das Video nach einem erfolgreichen Pufferprozess reibungslos ausgeführt werden würde.) EX: Ein weiteres Beispiel ist das Szenario, in dem wir Daten in unsere Dateien schreiben. Die neu geschriebenen Daten werden nicht sofort in den Sekundärspeicher kopiert. Die vorgenommenen Änderungen werden im Puffer gespeichert, und gemäß der festgelegten Richtlinie werden die Änderungen in die Datei im Sekundärspeicher (Festplatte) zurückgespiegelt.

Caches hingegen werden zwischen dem Primärspeicher und den Prozessoren verwendet, um die Lücke zwischen der Ausführungsgeschwindigkeit des RAM und dem Prozessor zu schließen. Außerdem werden die Daten, auf die am häufigsten zugegriffen wird, im Cache gespeichert, um den Zugriff auf den Arbeitsspeicher zu verringern.

Rubal
quelle
-1 Sie schreiben "Cache ist ein separater physischer Speicher" <--- Nein. Nicht unbedingt. IE speichert den Cache auf der Festplatte und lädt ihn zweifellos in den RAM stackoverflow.com/questions/854412/…. Ich glaube nicht, dass C-Code angeben kann, ob er in den als Cache bezeichneten physischen Speicher geladen werden soll. Was in diesen Cache gestellt wird, ist eher eine Sache auf niedriger Ebene, vielleicht kann nur das Betriebssystem angeben. Aber es heißt immer noch Cache, obwohl es im RAM ist. Und der Webserver-Tintenfisch kann einen Cache einrichten, kein Grund zu der Annahme, dass sich alles im physischen Cache-Speicher befindet oder befinden muss.
Barlop
Caching ist eine Funktion, es muss nicht in einem speziellen Speicher sein
Barlop
1

Gemeinsame Sache: Beide sind zwischengeschaltete Datenspeicherkomponenten (Software oder Hardware) zwischen Berechnung und "Hauptspeicher".

Für mich ist der Unterschied der folgende:

Puffer:

  • Verarbeitet den sequentiellen Zugriff auf Daten (z. B. Lesen / Schreiben von Daten aus einer Datei oder einem Socket)
  • Ermöglicht die Schnittstelle zwischen Berechnung und Hauptspeicher und passt die unterschiedlichen Datenübertragungsmuster eines Datenproduzenten und eines Datenkonsumenten aneinander an. Beispielsweise schreibt die Berechnung kleine Datenblöcke, aber das Festplattenlaufwerk kann nur Datenstücke einer bestimmten Größe akzeptieren. Der Puffer sammelt also kleine Teile als Eingabe und gruppiert sie in größere Teile der Ausgabe um.
  • Es ist also wie ein Adapter- Designmuster. Es verbindet zwei interagierende Komponenten, die nicht direkt zusammenarbeiten können.
  • Beispiele: Festplattenpuffer, BufferedReader in Java-Sprache, Pufferung in Computergrafiken.

Zwischenspeicher:

  • Verarbeitet den wahlfreien Zugriff auf Daten (z. B. CPU-Cache speichert Speicherzeilen zwischen, die sich nicht nacheinander befinden).
  • Optimiert den Zugriff auf den Hauptspeicher und beschleunigt ihn. Beispielsweise vermeidet der CPU-Cache den Zugriff auf den Speicher, wodurch CPU-Befehle schneller werden.
  • Es ist wie ein Dekorationsmuster . Es verbindet (oft transparent) zwei interagierende Komponenten, die im Prinzip direkt zusammenarbeiten könnten, beschleunigt jedoch die Interaktion.
  • Beispiele: CPU-Cache, Seiten-Cache, Web-Proxy, Browser-Cache.
Alexey
quelle