Beobachtung für jeden Speicherzugriff
Virtueller Speicher ist aufwendiger als direkter physikalischer Zugriff
• Erst nachschlagen der Page im Speicher.
• Dann Zugriff auf den Speicher.
Wie kann man das soweit wie möglich beschleunigen?
Der Translation‐Lookaside‐Buffer (TLB)
Protection mittels virtuellem Speicher
Virtueller Speicher erlaubt, dass mehrere Prozesse auf denselben physikalischen Speicher zugreifen.
Es ist unter Umständen sinnvoll, den Speicherbereich vor Schreibzugriff zu schützen.
TLB und Page‐Table speichern ein extra RW‐Bit.
(1) Wer setzt dieses RW‐Bit? (2) Wie setzt man dieses Bit?
Zu (1): Ein Betriebssystem‐Prozess.
Zu (2): Einfache Maschineninstruktionen?
Problem: Jeder kann dann das Bit setzen.
Page
Prozess 1 Prozess 2
Betriebsmodi einer CPU
Häufig zwei unterschiedliche Betriebsmodi:
• Normaler Betriebsmodus
• Kernel‐ (oder auch Supervisor)‐Mode
CPU erlaubt die Ausführung bestimmter Maschinen‐Instruktionen nur im Kernel‐Mode.
Page‐Tables werden im physikalischen Speicher abgelegt, auf den kein anderer virtueller Adressraum zeigt.
Wie erreicht man den Kernel‐Mode? Es muss verhindert werden, dass jeder die CPU in diesen Modus versetzen kann.
Üblicher Weg: System‐Call.
Erinnerung: damit kann man eine Betriebssystemfunktion aufrufen.
Mit System‐Call wird eine Exception ausgelöst und an eine
Speicherstelle gesprungen, die nur in Kernel‐Mode zugreifbar ist.
Was passiert bei einem Page‐Fault noch?
Aktueller Prozess kann die Instruktion, die den Page‐Fault ausgelöst hat, nicht weiter ausführen.
Betriebssystem kann einem anderen Prozess die CPU zur Verfügung stellen.
Sobald die Page geladen ist, kann dem ursprünglichen Prozess die CPU wieder zur Verfügung gestellt werden.
Hierzu muss der ursprüngliche Prozesskontext wieder hergestellt
werden; unter anderem natürlich der PC auf die Instruktion gesetzt
werden, die den Page‐Fault verursacht hatte.
Segmentierung – Motivation
Bisher haben wir feste Blockgrößen betrachtet. Ziel: Paging stellt
dem Anwender einen großen (eindimensionalen) Speicher von 0 bis 2
b‐1 (b = Bit‐Tiefe) bereit.
Annahme Programm benötigt mehrere Speicherbereiche deren Längen im Programmablauf variabel sind. Beispiel Compiler:
Für solche Anwendungsfälle ist es besser dem Anwender sichtbar mehrere unabhängige Speicherbereiche zur Verfügung zu stellen.
Symbol‐
tabelle
Source‐
Code
Kon‐
stanten
Parse‐
Tree Call‐Stack
0 … A … B … C … D … E … 2b‐1
Segmentierung ‐ Grundidee
Voriges Beispiel Compiler:
Dieses Konzept mit variablen Blockgrößen nenn man Segmentierung.
Im Gegensatz zu Paging: explizit sichtbare zweidimensionale Adressierung (n,k) mit Segment‐Nummer n und Segment‐Offset k
• Anfang kann auf einen beliebigen Startpunkt im Speicher zeigen.
• Die physikalische Adresse ergibt sich aus Anfang + Offset.
• Segmente können beliebig lang sein; benötigt auch „Bounds‐Check“.
Segmentierung ermöglicht auch einfaches Sharing von Code (und natürlich auch Daten) zwischen Prozessen. Alle können die gleiche Adresse (n,k) verwenden. Protection kann explizit erfolgen. [Paging: virtueller Adressbereich muss verfügbar sein; Protection implizit]
Symbol‐
Tabelle Source‐
Code
Kon‐
stanten
Parse‐
Tree Call‐
Stack
0K 4K 8K 12K 16K 20K 24K
0K 4K 8K 12K 16K
0K 4K
0K 4K 8K 12K 16K 20K
0K 4K 8K 12K
Implementierung über Segment‐Tabelle
Segment‐Nummer
(Selector) Offset
Basis‐Adresse Limit
Andere Felder (z.B.
Priviledge, Protection,…) Adressierung im virtuellen Addressraum
Eintrag in Segmenttabelle Segmenttabelle
+
N‐Bit lineare Adresse
Damit geeigneter Zugriff auf physikalischen Speicher
Segmentierung versus Paging
Paging Segmentierung
Für den Programmierer sichtbar Nein Ja
Anzahl verfügbarer linearer Adressbereiche
1 Viele
Mehr als der physikalische Speicherbereich verfügbar
Ja Ja
Unterstützung mehrerer
Speicherbereiche mit dynamischer Größe
Nein Ja
Unterstützung von Code‐Sharing Nein Ja
Motivation für die
Einführung/Verwendung
Bereitstellung eines großen Adressraumes bei limitiertem
physikalischem Speicher
Trennung von Programm und Daten in logische unabhängige
Adressbereiche.
Pure Segmentierung: Jedes Segment belegt ab einer Basisadresse einen aufeinander‐
folgenden physikalischen Speicherbereich. (z.B. Ausgangspunkt (a)) Mit der Zeit entsteht eine sog. externe Fragmentierung (z.B. (b), (c), (d)) Mögliche Lösung: Compactation (z.B. (e))
Problem mit purer Segmentierung
Segment 0 (4K) Segment 1
(8K) Segment 2
(5K) Segment 3
(8K) Segment 4
(7K)
Segment 0 (4K) Segment 7
(5K) Segment 2
(5K) Segment 3
(8K) Segment 4
(7K)
Segment 0 (4K) Segment 2
(5K) Segment 3
(8K) Segment 5
(4K)
(3K)
(3K)
Segment 7 (5K) (3K)
Segment 0 (4K) Segment 2
(5K) Segment 6
(4K) Segment 5
(4K) (3K)
Segment 7 (5K) (3K) (4K)
Segment 0 (4K) Segment 2
(5K) Segment 6
(4K) Segment 5
(4K) (10K)
Segment 7 (5K)
(a) (b) (c) (d) (e)
Lösung: Segmentierung mit Paging (3)
Beispiel Intel Pentium:
• Mittels Bit in globalem Control‐Register kann man Paging dazuschalten
• Lineare Adresse wird dann nicht direkt als physikalische Adresse verwendet
• Stattdessen wird die Adresse als virtuelle Adresse des Pagings verwendet
• Virtuelle Adresse: es wird zweistufiges Paging verwendet
• Bemerkung: Pentium verwendet selbstverständlich TLB zwecks Performancesteigerung
• Bemerkung: Pentium erlaubt auch nur Paging ohne Segmentierung (setze alle Segmentregister auf denselben Segment‐Selector, dessen Descriptor Base=0 und Limit=max)
Dir Page Offset
Lineare Adresse
Parallelität und Caches
Cache‐Kohärenz‐Problem
CPU 1 (oder Core 1) Cache
CPU 2 (oder Core 2) Cache
Speicher
Zeitschritt Event Cache‐Inhalt für CPU A
Cache‐Inhalt für CPU B
Speicherinhalt für Adresse X
0 0
1 CPU 1 liest X 0 0
2 CPU 2 liest X 0 0 0
3 CPU 1 speichert 1 nach X
1 0 1
Wann gilt ein Cache als kohärent?
1. Lesen von Speicherstelle X nach schreiben in Speicherstelle X sollte den geschriebenen Wert zurück geben, wenn kein
weiterer Prozess auf die Stelle X geschrieben hat.
2. Nachdem ein Prozess in Speicherstelle X geschrieben hat, sollte
„nach einer gewissen Zeit“ jeder Prozess den geschriebenen Wert in X vorfinden.
3. Zwei Schreiboperationen von zwei Prozessen in die
Speicherstelle X sollte von jedem Prozess in der gleichen
Reihenfolge gesehen werden. (Schreiben ist serialisiert)
Wie erreicht man Kohärenz?
Write‐Invalidate‐Protokoll: Wenn ein Prozess in einen Speicherstelle schreibt wird
die Speicherstelle in den Caches aller anderen Prozesse invalidiert.
Wie wird das Invalidieren technisch erreicht? Snooping: Jeder Cache‐Controller überwacht den gemeinsamen Bus, ob auf einen eigenen gecachten Inhalt
geschrieben wird.
Prozessor‐
aktivität
Busaktivität Inhalt des Caches von CPU A
Inhalt des Caches von CPU B
Speicher‐
inhalt für X 0
CPU A liest X Cache‐Miss für X 0 0
CPU B liest X Cache‐Miss für X 0 0 0
CPU A schreibt 1 nach X
Cache‐
Invalidierung für X
1 1
CPU B liest X Cache‐Miss für X 1 1 1
Ergänzung: RAM und ROM
Speichern eines Bits versus viele MB
Wir wissen wie wir einzelne Bits speichern können (Erinnerung:
Latches, Flip‐Flops)
CK
D Q
Mehrere solcher Bausteine können zu Register zusammengebaut werden
Wie baut man daraus aber komplexe
RAM‐Bausteine?
Beispiel: Speicherbaustein mit Adressierung
Dateneingänge (3 Bit): I0, I1, I2 Datenausgänge (3 Bit): O1, O2, O3 Adressleitungen (4 „Wörter“): A0, A1 Kontrollleitungen:
• CS = Chip‐Select
• RD = Read (=1) / Write (=0)
• OE = Output Enable
Lesen und Schreiben am Beispiel…
Wenn man entweder liest oder schreibt
können I0, I1, I2und O1, O2, O3auch dieselben Leitungen sein (das spart Pins und
Busleitungen). Dies erfordert aber, dass beim Schreiben die Ausgabe getrennt wird.
Baustein hierfür: noninverting und inverting Buffer:
(sog. Tri‐State‐Device: Ausgabe 0/1 oder
„none“ (d.h. open circuit))
Erweiterung von Adressraum und Bit‐Tiefe
Erweiterung des vorigen Beispiels ist offensichtlich:
• Vergrößerung des Adressraums (in der Größenordnung 2n): Füge eine
Adressleitung hinzu und verdoppele die Anzahl Zeilen
• Vergrößerung der Bit‐Tiefe (beliebig):
Füge in jede Zeile eine/mehrere Spalte/n hinzu
Zwei‐dimensionales sich wiederholendes Muster:
• lässt sich gut mit dem Konzept von integrierten Schaltung vereinen (z.B. kein Anwachsen von
Leitungsüberkreuzungen)
• Speicherkapazität ist nur direkt an Chip‐
Integrationsdichte gekoppelt
Verschiedene Chip‐Organisationsformen möglich. Beispiel für zwei 4Mbit‐Chip‐
Varianten:
Variante (a): wie eben nur größer Variante (b):
• 2048x2048 Matrix mit 1‐Bit‐Zellen
• Adressierung ist zweistufig (z.B. erst Row Address Strobe (RAS) und dann Column Address Strobe (CAS))
Organisation als Matrix
n x n‐Matrix‐Konzept des vorigen Beispiels allgemein:
• Geeignet für große Speicher‐Chips
• Reduziert die Anzahl Pins
• Adressierung dauert aber doppelt so lang
• Mögliche Optimierung:
• Teile zuerst die Row‐Adresse mit
• Anschließend können innerhalb dieser Row mit einer Sequenz von Column‐
Adressen Speichereinträge erreicht werden
Mehrere n x n ‐ 1‐Bit‐Bausteine lassen sich auch parallel zu größerer Bit‐Tiefe zusammenbringen, z.B. Tiefe 8‐Bit
Matrix‐Organisation eines Einzelbausteins nicht auf Bit‐Einträge begrenzt
Beispielsweise: 4‐, 8‐, oder 16‐Bit‐Breiten möglich; daraus lassen sich mit weniger Einzel‐
Chips größere RAM‐Bausteine zusammenbauen (z.B. Anstatt 32‐Bit‐Tiefe mit vier 8‐Bit‐
Bausteinen anstatt mit 32 1‐Bit‐Bausteinen)
Weitere Aspekte
Matrix muss nicht Quadratisch sein (z.B. 13 Rows und 10 Columns)
Zusätzlich kann Speicher noch in Bänken organisiert sein (z.B. 4 Bänke mit je 128Mbit ergibt 512 Mbit)
Zwei Beispiele eines 512Mbit‐Chips:
• Vier interne Bänke a 128MBit (d.h. zwei Bank‐Select‐Leitungen)
• Variante (a): 32M x 16 Design mit 13‐Bit‐RAS und 10‐Bit‐CAS => 213+10+2 = 225 interne 16‐Bit‐Zellen
• Variante (b): 128M x 4 Design mit13‐Bit‐RAS und 12‐Bit‐CAS => 213+12+2 = 227 interne 4‐Bit‐Zellen
SRAM und DRAM
Zwei RAM‐Varianten: SRAM und DRAM Static RAM (SRAM)
•
Aufgebaut mit Schaltungen wie die diskutierten Flip‐Flops
•
Zustand bleibt erhalten solange Strom anliegt
•
Sehr schneller Speicher (Zugriffszeit wenige nsec) Dynamic RAM (DRAM)
•
Nutzt keine Flip‐Flops sondern Array von Zellen mit je einem Transistor und einem winzigen Kondensator pro Bit
•
Ladezustand des Kondensator (aufgeladen/entladen) stellt 1‐Bit‐Information dar
•
Kondensator entladen sich => damit periodischer „Refresh“ notwendig (alle paar Millisekunden)
•
Vorteil: hohe Dichte bzgl. Bit pro Chip (Transistor+Kondensator anstatt 6 Transistoren für den Flip‐Flop) => große RAM‐Speicher damit realisierbar
•
Nachteil: wesentlich langsamer (mehrere 10 nsec)
•
Guter Kompromiss: DRAM‐Baustein mit SRAM‐Cache
SDRAM und DDR
Nachfolger von älterem asynchronem RAM: Synchronous DRAM (SDRAM)
• Durch den Haupt‐Systemtakt getriggert
• plus Pipelining (akzeptiert neues Speicherkommando während voriges noch ausgeführt wird) und Interleaving (mit RAM‐Bänken)
• Keine Kontrollnachrichten zwischen Prozessor und RAM wie bei asynchronem RAM erforderlich
• Wesentlich schneller
Double Data Rate (DDR) SDRAM
• Bit‐Output bei fallender und steigender Clock‐Flanke => verdoppelt die Datenrate
• Anstatt Ein‐Bit‐ ein „Zwei‐Bit‐Prefetch“ => DDR2
• Analog DDR3, DDR4, DDR5
ROM
Read Only Memory (ROM) – Zum Chipherstellungsprozess wird das Bitmuster festgelegt;
besonders billiger Speicher
Programmable ROM (PROM) – kann einmalig Programmiert werden; Meist ein Feld von Column‐Row‐Adressierbaren Knotenpunkten die über einen Eingangs‐Pin einmalig auf einen Bit‐Wert gesetzt werden können
Erasable PROM (EPROM) – Belichtung des Quartz‐Fenster mit starkem UV‐Licht für 15 Minuten setzt alle Bit‐Werte zurück auf 1. Erneutes Setzen der Bits damit möglich
EEPROM – Löschen mittels elektrischer Impulse; Re‐Programmierung direkt am Chip möglich (anstatt wie bei EPROM in spezieller Apparatur)
Diskussion:
EEPROMS typischerweise wesentlich kleiner als EPROMS und nur halb so schnell EEPROMS wesentlich langsamer kleiner und teurer als DRAM und SRAM
Nur dann sinnvoll, wenn Werte einmalig festgelegt sein sollen Aktueller als EEPROMs sind Flash‐Speicher (auf NAND‐Basis)
Unterschied: Block‐Erasable/Rewritable anstatt Byte‐Erasable/Rewritable
Flash‐Speicher
Flash‐Speicher: nichtvolatiler Halbleiterspeicher.
Vorteile gegenüber Disks:
• Latenz ist 100 bis 1000 fach schneller
• Kleiner
• Größere Leistungseffizienz
• Größere Shock‐Resistenz Nachteile gegenüber Disks:
• Höherer Preis pro GB
• Flash‐Speicher‐Bits sind nach vielem Überschreiben nicht mehr verwendbar (Wear‐Out).
Flash‐Speicher muss ein entsprechendes Wear‐Leveling
durchführen.
Zusammengefasst
Typ Kategorie Löschen Volatil Typische Anwendung
SRAM R/W Elektr. Ja Level1/2 Cache
DRAM R/W Elektr. Ja Hauptspeicher (alt) SDRAM R/W Elektr. Ja Hauptspeicher (neuer)
ROM Read‐
Only
Nicht möglich
Nein Produkte großer Stückzahl PROM Read‐
Only
Nicht möglich
Nein Produkte kleinerer Stückzahl EPROM Read‐
Mostly
UV‐Licht Nein Prototyping EEPROM Read‐
Mostly
Elektr. Nein Prototyping
Flash R/W Elektr. Nein Sekundärer Speicher