Cache-Speicher sorgen dafür, dass schnelle Prozessoren nicht lange auf Daten warten müssen Cache-Optimierung in eingebetteten Systemen

Cache-Speicher sind für schnelle Prozessoren nahezu unverzichtbar, denn konventionelle Arbeitsspeicher können die Daten schon lange nicht mehr so schnell anliefern, wie die Prozessoren sie verarbeiten können. Doch es gibt auch Fallstricke bei der Nutzung von Cache – nämlich dann, wenn Peripheriegeräte mit DMA und die CPU gleichzeitig auf Daten zugreifen.

Cache-Speicher sorgen dafür, dass schnelle Prozessoren nicht lange auf Daten warten müssen

Cache-Speicher sind für schnelle Prozessoren nahezu unverzichtbar, denn konventionelle Arbeitsspeicher können die Daten schon lange nicht mehr so schnell anliefern, wie die Prozessoren sie verarbeiten können. Doch es gibt auch Fallstricke bei der Nutzung von Cache – nämlich dann, wenn Peripheriegeräte mit DMA und die CPU gleichzeitig auf Daten zugreifen.

Der Cache ist ein schneller Speicher, der direkt mit der CPU verbunden ist. Die CPU kann auf Informationen im Prozessor-Cache schneller zugreifen als auf Informationen, die im Hauptspeicher abgelegt sind. Daher werden häufig verwendete Daten im Cache abgelegt. Die effektive Übertragung von Daten vom Speicher zur CPU ist allerdings schwierig. Hauptziel ist dabei, die Funktionseinheiten der CPU stets am Laufen zu halten, um höchstmögliche Leistung zu erzielen.

Der mehrfache Zugriff auf ein- und dieselbe Ressource wird durch das „Lokalitätsprinzip“ geregelt. Dabei unterscheidet man zwischen drei Haupttypen: zeitliche, räumliche und sequenzielle Lokalität. Beim Lokalitätsprinzip greift die Programmierung immer nur auf einen relativ kleinen Teil des Gesamt-Adressraums zu. Liest ein Programm beispielsweise Daten von der Adresse N, ist es wahrscheinlich, dass kurze Zeit später auch Daten von der Adresse N+1 gelesen werden (räumliche Lokalität) und dass mehrmals auf die zuletzt gelesenen Daten zurückgegriffen wird (zeitliche Lokalität).

Speicher-Hierarchie

Das Lokalitätsprinzip ermöglicht eine mehrstufige Speicherhierarchie, die – von oben nach unten – Register, unterschiedliche Cache-Ebenen, den Arbeitsspeicher und den Festplattenspeicher umfasst. Der Cache dient zur Kompensation der Verzögerungszeit beim Speicherzugriff. Moderne Chips können einen großen Cachebereich haben. Darüber hinaus lässt sich mit Code, der den Cache effizient nutzt, eine höhere Performance erzielen. Es gibt drei unterschiedliche Cache-Ebenen: Während sich der First-Level-Cache (L1-Cache) und der Second-Level-Cache (L2) auf dem CPU-Chip befinden, ist der größere Third-Level-Cache (L3) extern untergebracht.

Jede Cache-Ebene hat unterschiedliche Performance-Eigenschaften, die mit der Entfernung zwischen dem Cache und dem Prozessor zusammenhängen. Die Tabelle zeigt die Verhältnisse bei den Zugriffszeiten auf die verschiedenen Ebenen.

Da es sich beim Cache sozusagen um ein Abbild bzw. eine Kopie eines kleinen Teils des Hauptspeichers handelt, muss der Cache den Inhalt des Hauptspeichers sinnvoll widerspiegeln. Der Cache wird in größeren Zeitabständen nach Prinzipien wie Random Replacement, First-In-First-Out (FIFO) und Last Recently Used (LRU) aktualisiert. Wenn die angeforderten Daten im Cache vorhanden sind, wird dies als Cache-Hit („Cache-Treffer“) bezeichnet. Dabei entspricht eine höhere Trefferrate einer besseren Performance. Sind bei einer Anforderung die Daten nicht im Cache vorhanden, spricht man von einem Cache-Miss („Cache-Fehltreffer“).