Cache

  1. Startseite
  2. Programmierung
  3. Cache

Cache ([kæʃ], [kaʃ]) bezeichnet in der EDV einen schnellen Puffer-Speicher, der (erneute) Zugriffe auf ein langsames Hintergrundmedium oder aufwändige Neuberechnungen zu vermeiden hilft. Inhalte/Daten, die bereits einmal beschafft/berechnet wurden, verbleiben im Cache, sodass sie bei späterem Bedarf schneller zur Verfügung stehen. Auch können Daten, die vermutlich bald benötigt werden, vorab vom Hintergrundmedium abgerufen und vorerst im Cache bereitgestellt werden. Caches können als Hardware- oder Softwarestruktur ausgebildet sein. In ihnen werden Kopien zwischengespeichert.

Cache ist ein Lehnwort aus dem Englischen. Seinen Ursprung hat es im französischen cache, das eigentlich die Bedeutung ‚Versteck‘ besitzt. Der Name verdeutlicht den Umstand, dass dem Verwender in der Regel der Cache und seine Ersatzfunktion für das angesprochene Hintergrundmedium verborgen bleibt. Wer das Hintergrundmedium verwendet, muss Größe oder Funktionsweise des Caches prinzipiell nicht kennen, denn der Cache wird nicht direkt angesprochen.

Der Verwender „spricht das Hintergrundmedium an“, und es „antwortet“ stattdessen der Cache – genau auf die und Weise, wie auch das Hintergrundmedium geantwortet, also Daten geliefert hätte. Man spricht wegen der Unsichtbarkeit dieser zwischengeschalteten Einheit auch von Transparenz. Praktisch ist er eine gespiegelte Ressource, die stellvertretend für das Original sehr schnell bearbeitet/verwendet wird.

Greifen außer dem Cache-verwendenden Gerät noch weitere auf das Hintergrundmedium zu, so könnte es zu Inkohärenzen kommen. Um auf ein identisches Datenabbild zugreifen zu können, ist es notwendig, zuvor die Änderungen des Caches in das Hintergrundmedium zu übernehmen. Cachestrategien wie Write-Through oder Write-Back sind hier praktikabel. Im Extremfall muss ein kompletter „Cache Flush“ erfolgen. Außerdem muss ggf. der Cache informiert werden, dass sich Daten auf dem Hintergrundmedium geändert haben und sein Inhalt nicht mehr gültig ist.

Stellt die Cachelogik dies nicht sicher, so ergibt sich als Nachteil, dass inzwischen im Hintergrundmedium oder im Rechenprogramm erfolgte Änderungen nicht erkannt werden. Bei Verdacht auf Änderungen, oder um sicherzugehen, dass der aktuelle Stand berücksichtigt wird, muss der Verwender explizit eine Cache-Aktualisierung veranlassen.

Nutzen

Die Ziele beim Einsatz eines Caches sind eine Verringerung der und/oder eine Verringerung der Anzahl der Zugriffe auf das langsame Hintergrundmedium. Das bedeutet insbesondere, dass sich der Einsatz von Caches nur dort lohnt, wo die Zugriffszeit auch signifikanten Einfluss auf die Gesamtleistung hat. Während das z. B. beim Prozessorcache der meisten (skalaren) Mikroprozessoren der Fall ist, trifft das nicht auf Vektorrechner zu, wo die Zugriffszeit keine sehr wichtige Rolle spielt. Deswegen wird dort üblicherweise auch auf Caches verzichtet, weil diese keinen oder nur wenig Nutzen bringen.

Ein weiterer wichtiger Effekt beim Einsatz von Caches ist die verringerte Bandbreitenanforderung an die Anbindung des Hintergrundmediums (siehe z. B. Speicherhierarchie). Weil oftmals der Großteil der Anfragen vom Cache beantwortet werden kann („Cache Hit“, s. u.), sinkt die Anzahl der Zugriffe und damit die Bandbreitenanforderung an das Hintergrundmedium. Zum Beispiel würde ein moderner Mikroprozessor ohne Cache selbst mit beliebig kleiner Zugriffszeit des Hauptspeichers dadurch ausgebremst, dass nicht genügend Speicherbandbreite zur Verfügung steht, weil durch den Wegfall des Caches die Anzahl der Zugriffe auf den Hauptspeicher und damit die Anforderung an die Speicherbandbreite stark zunehmen würde. Ein Cache kann daher also auch genutzt werden, um die Bandbreitenanforderungen an das Hintergrundmedium zu reduzieren, was sich z. B. in geringeren Kosten für dieses niederschlagen kann.

Bei CPUs kann der Einsatz von Caches somit zum Verringern des Von-Neumann-Flaschenhalses der Von-Neumann-Architektur beitragen. Die Ausführungsgeschwindigkeit von Programmen kann dadurch im Mittel enorm gesteigert werden. Ein Nachteil von Caches ist das schlecht vorhersagbare Zeitverhalten, da die Ausführungszeit eines Zugriffs aufgrund von Cache Misses nicht immer konstant ist; sind die Daten nicht im Cache, muss der Zugreifende warten, bis sie aus dem langsamen Hintergrundmedium geladen wurden. Bei Prozessoren geschieht dies oft bei Zugriffen auf bisher noch nicht verwendete Daten oder beim Laden des nächsten Programmbefehls bei (weiten) Sprüngen.
Cachehierarchie

Da es technisch aufwändig und damit wirtschaftlich nicht sinnvoll ist, einen Cache zu bauen, der gleichzeitig sowohl groß als auch schnell ist, kann man mehrere Caches verwenden – z. B. einen kleinen schnellen und einen deutlich größeren, jedoch etwas langsameren Cache (der aber immer noch viel schneller ist als der zu cachende Hintergrundspeicher). Damit kann man die konkurrierenden Ziele von geringer Zugriffszeit und großem Cacheumfang gemeinsam realisieren. Dies ist wichtig für die Hit Rate.

Existieren mehrere Caches, so bilden diese eine Cachehierarchie, die Teil der Speicherhierarchie ist. Die einzelnen Caches werden nach ihrer Hierarchieebene (engl. level) durchnummeriert, also Level‑1 bis Level‑n oder kurz L1, L2 usw. Je niedriger die Nummer, desto näher liegt der Cache am schnellen „Benutzer“; die niedrigste Nummer bezeichnet daher den Cache mit der schnellsten Zugriffszeit, dieser wird also als erstes durchsucht. Enthält der L1-Cache die benötigten Daten nicht, wird der (meist etwas langsamere, aber größere) L2-Cache durchsucht usw. Das geschieht solange, bis die Daten entweder in einer Cacheebene gefunden (ein „Cache Hit“, s. u.) oder alle Caches ohne Erfolg durchsucht wurden (ein „Cache Miss“, s. u.). In letzterem Fall muss auf den langsamen Hintergrundspeicher zugegriffen werden.

Tritt ein Cache Hit z. B. im L3-Cache auf, so werden die angeforderten Daten dem Zugreifer geliefert und zugleich in den L1-Cache übernommen; dafür muss dort eine Cache-Line weichen, die in den L2-Cache „absinkt“.

  • Bei einem inklusiven Cache ist jeder Cache-Level für sich transparent, d. h. eine Cache-Line, die im L1-Cache ist, ist auch im L2- und L3-Cache vorhanden. Wird die Cache-Line aus dem L1-Cache „verdrängt“ (überschrieben mit Daten einer anderen Adresse), so muss sonst nichts unternommen werden – sie ist im L2-Cache ja immer noch vorhanden (sofern kein Write-Back o. ä. notwendig ist).
  • Bei einem exklusiven Cache ist eine Cache-Line einer Adresse nur einmal in allen Cache-Leveln vorhanden. Eine Cache-Line zu Adresse A im L1-Cache ist nicht zusätzlich im L2- oder L3-Cache vorhanden. Wird sie aus dem L1-Cache verdrängt, so kann sie entweder gänzlich verworfen werden, oder muss explizit in den L2-Cache kopiert werden. Dort wird somit ebenfalls eine (andere) Cache-Line verdrängt, um Platz zu machen für die absinkende. Diese andere sinkt nun ihrerseits in den L3-Cache, wo somit eine dritte Cache-Line weichen muss.

Exklusive Cache-Hierarchien erzeugen deutlich mehr zwischen den Caches. Dafür können so viele Cache-Lines bereitgehalten werden wie die Summe von L1-, L2- und L3-Cache-Größe, während beim inklusiven Cache nur die L3-Cache-Größe maßgebend ist.

Im Hardwarebereich weisen vor allem moderne CPUs zwei oder drei Cacheebenen auf; sonstige Geräte besitzen meist nur eine Cacheebene. Im Softwarebereich wird meist nur eine Cacheebene benutzt, eine prominente Ausnahme bilden aber Webbrowser, die zwei Ebenen nutzen (Arbeitsspeicher und Festplattenlaufwerk).

Quelle: Wikipedia (http://de.wikipedia.org/wiki/Cache)

Archive

error: Content is protected !!