Speicherhierarchie In heutigen Computern findet man schnellen/teuren als auch langsamen/billigen Speicher Register Speicherzellen, direkt mit der Recheneinheit verbunden Cache-Speicher Puffer-Speicher zur Ausnutzung von zeitlicher und räumlicher Lokalität der Speicherzugriffe Cache-Hierarchien (L1-, L2-Cache) Hauptspeicher Festplattenspeicher Warum mehrere Speicherarten in einem Rechner? Wie greifen die verschiedenen Speicher ineinander?
Speicherhierarchie Steuerung, typische Datenmenge Technologie Kürzere Zugriffszeit Programm, 1-8 Byte SRAM Cache-Controller, 8-128 Byte DRAM Betriebssystem, 512 Byte 16 KByte Magnetisch Optisch Geringere Kosten, größere Kapazität
Speicherhierarchie http://www.it-infothek.de/fhtw/ra_bs_02.html
Technologie RAM bezeichnet einen Speichertyp dessen Speicherzellen über ihre Speicheradressen direkt, einzeln und "wahlfrei" angesprochen werden können (Random Access Memory) SRAM ist statisch, d.h. dass der Speicherinhalt bei anliegender Spannung erhalten bleibt DRAM ist dynamisch, d.h. dass der Speicherzustand immer wieder neu (periodisch) aktualisiert werden muss (Refresh) Festplatten bestehen aus beweglichen Schreib/Lese-Köpfen, die über die Magnetplatten gleiten (Positionierung) und das Magnetfeld ändern bzw. lesen
Technologische Trends Entwicklung der Performance von CPUs und DRAM relativ zur Performance von DRAM 1980
Technologische Trends Fazit: Speicherzugriff ist und wird zunehmend der limitierende Faktor bzgl. der Performanz eines Programmes Datenintensive Anwendungen benötigen spezielle Datenstrukturen, Datenkompressionsverfahren und Datenzugriffsmechanismen zur Steigerung der Performanz
Beispiel Photorealistische Bildsynthese in Echtzeit Speichervolumen: ca. 860 GByte Bildauflösung: 1K x 1K Pixel 30 M pro Bild Darstellungsrate: 13 Bilder/Sek.
Speicherhierarchie Daten werden in bestimmten Einheiten zwischen den Ebenen der Speicherhierarchie übertragen Daten werden nur zwischen benachbarten Ebenen übertragen Ist eine Dateneinheit auf einer Ebene vorhanden, muss sie auch auf den tieferen Ebenen vorhanden sein. Sind die angeforderten Daten auf einer Ebene verfügbar, dann ist der Zugriff erfolgreich und es kommt zu einem Hit (Treffer) Sind die Daten nicht verfügbar, dann kommt es zu einem Miss (Fehlzugriff) und die Daten müssen aus der nächsten Ebene geholt werden
Zugriffslokalität Beobachtung: Programme greifen in einem kleinen Zeitintervall auf einen relativ kleinen Teil des Adressraums zu. Das gilt sowohl für Instruktionen als auch für Daten Zeitliche Lokalität Wenn ein Zugriff auf eine Adresse erfolgt, wird auf diese Adresse mit großer Wahrscheinlichkeit bald wieder zugegriffen Räumliche Lokalität Wenn ein Zugriff auf eine Adresse erfolgt, werden mit großer Wahrscheinlichkeit auch Zugriffe auf in der Nähe liegende Adressen erfolgen
Zugriffslokalität Aufgrund der Lokalität kann man Speichersysteme aufbauen Wenig schnellen und teuren Speicher Viel langsamen und billigen Speicher Funktionsprinzip Versuche zu erraten, auf welche Speicherzellen des langsameren Speichers der Prozessor als nächstes zugreifen wird und diese Daten schon im Vorfeld im schnellere Speicher abzulegen (Prefetching) Arbeite möglichst lange auf diesen Daten und reduziere dadurch die langsamen Speicherzugriffsoperationen
Caching Der Cache ist ein schneller, aus SRAM-Zellen aufgebauter Zwischenspeicher, der helfen soll, Zugriffe auf den Hauptspeicher durch den Prozessor zu beschleunigen Können möglichst viele, in Zukunft zu verwendende Speicherzellen im Cache abgelegt werden, dann können zum Zeitpunkt der Anforderung die Hauptspeicherzugriffe umgangen bzw. durch sehr viel schnellere Zugriffe auf den Cache ersetzt werden! Der Cache ist software-transparent, d. h. der Benutzer kann den Cache nicht direkt adressieren, muss nicht mal etwas vom Cache wissen
Caching Speicherzugriffe stellen aus Sicht des Programms bzw. des Anwenders zunächst einen Hauptspeicherzugriff dar
Caching/Paging Tritt ein Miss auf, so wird das Datum aus der nächst tieferen Ebene geholt Damit sich das Holen lohnt (Lokalitätsprinzip), wird gleich ein ganzer Block geholt Eine ganze Cache-Line beim Holen aus dem Hauptspeicher Eine ganze Seite (Page) beim Holen von der Festplatte
Caching/Paging Was passiert bei einem Zugriff auf ein Datum? Überprüfe, ob das Datum in der aktuellen Ebene liegt if (Miss) { bestimme Block der nächsten Ebene, in dem das Datum liegt if (alle Blöcke in aktueller Ebene belegt) verdränge den Inhalt eines Blockes } hole Blockinhalt und schreibe in den freien Block
Verdrängungsstrategien Es gibt unter Anderem die folgenden Verfahren, um zu bestimmen, welcher Block verdrängt werden soll: LRU-Strategie (Least Recently Used): Es wird der Block ausgelagert, auf den am längsten nicht zugegriffen wurde FIFO-Strategie (First In First Out): Es wird der Block ausgelagert, der sich am längsten im realen Speicher befindet. Hierzu werden die einem Prozess zugeordneten Blöcke wie eine Queue behandelt LFU-Strategie (Least Frequently Used): Der am seltenste gelesene Eintrag wird verdrängt
Cache-Kohärenz Aussage: Felder haben bessere Cache-Kohärenz als Listen Beispiel: int[] feld; feld = new int[100]; // zusammenhängender Block // zur Aufnahme von 100 Integers List list = new List(0); for (int i = 1; i < 100; ++i) list.insert(i); // 100 im Speicher verteilte Elemente
Cache-Kohärenz Beispiel: String[] feld; feld = new String[100]; // zusammenhängender Block // zur Aufnahme von 100 String-Referenzen for (int i = 0; i < 100; ++i) feld[i] = new String( + i); // 100 im Speicher verteilte Elemente
Cache-Kohärenz Beispiel: int[][] feld; feld = new int[100][]; // zusammenhängender Block // zur Aufnahme von 100 int-feldern for (int i = 0; i < 100; ++i) feld[i] = new int[i+1]; // 100 im Speicher verteilte Felder
Cache-Kohärenz Beispiel: arr * * * * arr = new int[3][]; arr[0] = new int[3]; int[] x = {0, 2}; int[] y = {0, 1, 2, 3, 4}; arr[1] = x; arr[2] = y; 0 0 0 0 2 0 1 2 3 4