Speicherhierarchien

In diesem Beitrag geht es um das Thema Speicherhierarchien. Die Motivation ist das „Lokalitätsprinzip“. Da man oft auf die selben Speicherstellen zugreift, macht es Sinn einen Cache (Schnellen aber dafür kleinen Speicher) vorzuschalten, um die Performance zu verbessern. Da die schnellen Speicher sehr teuer sind, werden die nur im kleineren Ausmaß verbaut (ca 8kb – 2Mb). Der Arbeitsspeicher ist im Gegensatz zu dem Caches im Prozessor relativ billig. Dadurch entsteht eine Speicherhierarchie.

Durch die Kombination von schnellen, teuren Speichern und den langsamen billigen Massenspeichern lässt sich ein guter Kompromiss zwischen Kosten und Geschwindigkeit erreichen. (Prozessor-Cache-RAM-Festplatte […]) Dies ist eine Speicherhierarchie, an der oben kleine schnelle Speicher stehen und weiter unten immer langsamere größere Speicher.

Des weiteren gibt es eine Physikalische Notwendigkeit, damit die Caches (Schnelle Speicher) ihre optimale Performance bringen können. Sehr schnelle Speicher müssen also wegen der Signallaufzeit sehr nah am Prozessor sitzen. Die Geschwindigkeit von elektrischen Signalen ist ca 0,3*10^9 m/s, real durch das Medium sind das aber nur noch 60-80% davon. Daher sind nur wenige Zentimeter Entfernung von Prozessor zu Cache möglich um gute Performance und gute Zugriffszeiten zu erreichen.

Segmentierung von Speicher

Der Speicher wird in Segmente unterteilt. Dies sind frei positionierbare zusammenhängende Speicherbereiche mit einer einstellbaren Länge. Unter Windows sind das entweder 3000-4000 Byte bzw bis zu 32Kb. Diese Segmente können überlappend positioniert werden. Daher sind sehr viele Segmente möglich. Programme greifen nicht immer auf das komplette Segment zu, die Basisadresse des Speichers ist weitergehend transparent, die Verschiebung von Programmdaten und Programmen kann also auch während des Betriebes des Programmes erfolgen.

Zur Segmentierung des Speichers wird eine Segmenttabelle erstellt. Diese Segmenttabelle speichert Informationen über ein Segment, wie z.B. die Basisadresse die Länge oder der Typ des Speichersegmentes. Der Speicherzugriff erfolgt über die Segmentnummer und einem Offset.

Außerdem gibt es spezielle Segmentregister, welche die Nummer des zu verwendenden Segmentes enthalten. (Codesegment, Stacksegment und Datensegment)

x86 Struktur = 16Bit in Selektor & 31 Bit Offset (4GB Segment)
PowerPC = 4Bits Selektor und 256MB Offset
DS Selecotr und EBX die Offset Adresse

Bsp:
DS =0008
EBX= 00000088
Data Segment=0000FF88

Möglichkeiten des Speicherschutzes

Es gibt Möglichkeiten den Speicher zu schützen. Man kann z.B. Zugriffsrechte pro Segment setzten wie z.B. Read Write oder Execute. Der Zugriff auf die Segmenttabelle ist meist vor Programmen geschützt, da dies nur das Betriebssystem ändern, löschen und anlegen kann. Die Segmentadressen sind für Anwendungen & Programme verboten.

Durch die Segmentierung ist auch eine Vergrößerung des adressierbaren Speichers möglich, dies geschieht über die Verschiebung der Basisadresse.

Paging

Der Speicher ist geteilt in gleichgroße Kacheln (z.B. 64kb Kacheln). Man kann sich das Ganze ähnlich vorstellen wie kariertes Papier. Dadurch entsteht ein Virtueller Adressraum, welcher durch eine „Page Table“ in echte Adressen übersetzt werden kann. Der Vorteil daran, es muss nicht jede „Kachel“ belegt sein. Es kann also auch leere Kacheln im Speicher geben. („Demand Paging“)

Beispiel: 1024*1024 – 4kb Kacheln = 4GB

Es kann nun eine beliebige Aufteilung der Kacheln auf eine oder keine physikalische Adresse geschehen.

Arten von Seitentabellen

Einstufige Seitentabellen -> Seitentabelle kann sehr groß werden (z.B. 4MB zusammenhängende Tabelle für 4GB in 4kb Kacheln), Explizite Größenangaben ermöglichen kürzere Seitentabellen, der Nachteil dabei: Erlaubt keine großen Lücken im Adressraum)

Mehrstufige Seitentabellen (Multi Level Page Table) -> Page-Adressteil wählt Eintrag aus einem unvollständigen Baum

Invertierte Seitentabellen (Single-Level) -> Hashmap zur Zuordnung der Physikalischen Adresse (Man nimmt die Adresse errechnet eine Position im Speicher…)(Schlechte Cache Lokalität, Schwierig zu verwalten)

Hierarchische Tabellen haben 2 Ebenen

Page Tables haben 2 Ebenen. Die erste Ebene ist der „Directory“ zu der Page Table, welche z.B. 1024 Einträge hat, welche der Zeiger auf dir „Page Table“ ist.
Die zweite Ebene hat ebenfalls z.B. 1024 Einträge und enthält die Basisadressen des Speichers.

Paging: Es werden immer 3 Speicherzugriffe gemacht anstatt nur einen. Verbesserung durch spezielle Caches wie z.B. TLBs.

Beispiel:

i7 == L1 = 64 Einträge | L2 = 128 Einträge für Befehle | L3 = 256 Einträge für Code und Daten

Ein Beispiel, wie ein Prozessor arbeitet wenn z.B. die TLBs ausfallen:

Ohne TLBs im AMD Phenom 9600

Winrar noch ca 50% Leistung
Crisis noch ca 75% Leistung
Cinebench noch ca 95% Leistung

http://techreport.com/review/13741/phenom-tlb-patch-benchmarked/2

Kombination mit Segmentierung

Paging wird als zweiter Schritt auf die linearen Adressen nach der Segmentierung angewandt.

Einzelner Nachteil: Interner Verschnitt in den Kacheln. Wenn die Kachel nicht ganz voll ist, ist der Rest Verschnitt. Z.B. eine 4kb Datei liegt in einer 16kb Kachel, bleiben 12kb leer und gelten damit als Verschnitt.

Marvin Sengera

Marvin Sengera

Hey! Ich bin Marvin Sengera, Inhaber der Internetagentur "Binärfabrik" aus Paderborn. Ich habe mein Bachelorstudium Informatik mit Schwerpunkt Industriespionage an der Hochschule Hamm Lippstadt abgeschlossen und absolviere derzeit meinen Master in Fachrichtung "Technical Entrepreneurship and Innovation". Ich beschäftige mich rund um die Themen Informatik, Innovation & Unternehmensgründung.

Das könnte Dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.