Praktische Einführung mit Virtualisierung
Stefan Bosse
Universität Koblenz - FB Informatik
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen ::
Wie funktioniert ein Rechner?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen ::
Wie funktioniert ein Rechner?
Wie werden Programme von einem Rechner verarbeitet?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundmodell eines Rechners
Die meisten heute gebauten Computersysteme beruhen auf der Aufbaustruktur des Von-Neumann-Rechners, die John von Neumann 1946 aufgestellt hat. Seltener kommt die alternative Struktur des Harvard-Rechners zum Zug, benannt nach der Struktur des Mark-I-Rechners an der Harvard University (1939-44).
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundmodell eines Rechners
Der Von-Neumann-Rechner besteht aus vier Funktionseinheiten:
bsdp Funktionsblöcke des Von-Neumann-Rechners
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundmodell eines Rechners
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundmodell eines Rechners
bsdp Betriebssystem und Von-Neumann-Rechner
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Prozessoraufbau
bsdp Schematischer Prozessoraufbau
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Register
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Register
Beispiele von CPU-Registern
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundlagen der Programmausführung
Rechnereinteilung nach Adressanzahl: gezählt wird die Anzahl Operanden eines dyadischen Operators (z.B. einer Addition)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundlagen des Adressraums
Der Zugriff auf die Befehle eines Programms erfolgt ebenso wie auf alle im Speicher abgelegten Operanden mittels Speicheradressen. Die Organisation des Adressraums stellt damit eine wichtige Eigenschaft und allenfalls auch Limitierung einer bestimmten Rechnerplattform sowie des Betriebssystems dar.
Ein Adressraum Σ ist gekennzeichnet durch:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundlagen des Adressraums
Adressen sind numerische (ganzzahlige) Werte und referenzieren Speicherzellen
I.A. wird die erste Adresse mit 0, die letzte als N-1 bezeichnet.
Achtung: Die Adresse kann sich entweder auf die Speicherzelle mit der Wortbreite W oder die Elementarzelle mit der Breite B Bits (i.A. 1 Byte) beziehen!
bsdp Grundprinzip des Adressraums, hier Byteadressierung
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Adressraumtypen
Klassischer und erweiterter Von-Neumann-Rechner
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumtypen
Wie ist das Speichermodell eines Programs und Prozesses organisiert?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumtypen
Wie ist das Speichermodell eines Programs und Prozesses organisiert?
Wie ist das Speichermodell eines Betriebssystems organisiert?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumtypen
Wie ist das Speichermodell eines Programs und Prozesses organisiert?
Wie ist das Speichermodell eines Betriebssystems organisiert?
Wie findet Speicherverwaltung statt?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Bytereihenfolge (byte ordering)
Ein ganz einfacher Prozessor könnte nur mit Datenwerten von 8 Bit Größe arbeiten, d.h., er würde über eine Speicheradresse stets nur ein einzelnes Byte lesen oder schreiben. Heutige Universalprozessoren unterstützen jedoch verschiedene Operandengrößen, die auch mehrere Byte umfassen können.
Varianten der Bytereihenfolge bei Mehrbyte-Datenwerten (Beispiel für 4-Byte-Wert)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Ausrichtungsregeln im Adressraum
Die Ausrichtungsregeln (alignment rules) legen fest, auf welchen Adressen Variablen und Instruktionen liegen müssen. Sie sind maßgebend für die Programmübersetzung (Compiler, Assembler, Binder). Ihr Zweck liegt in der Erreichung optimaler Ausführungsgeschwindigkeiten auf dem benutzten Rechnersystem. Da sie von der Hardware abhängen, können sie entsprechend der benutzten Rechnerplattform variieren. Ausrichtungsregeln können sowohl für Code als auch Daten existieren.
bsdp Fehlausrichtung im Adressraum und ihre Folgen (Beispiel für einen 32-Bit-Datenbus und einen Zugriff auf einen Datenwert von 32 Bit Größe)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Ausrichtungsregeln im Adressraum
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Ausrichtungsregeln im Adressraum
Einfluss der Ausrichtung auf die resultierende Adressraumplatzierung (Beispiel)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumbelegung durch Programme
Die Belegung des Adressraums durch ein Programm wird einerseits durch die Übersetzungswerkzeuge, andererseits durch das Betriebssystem festgelegt.
Im Grundsatz können etwa fünf verschiedene Bereiche unterschieden werden:
Code und Konstanten: Die zugehörigen Speicherinhalte werden aus der ausführbaren Datei in den Hauptspeicher geladen. Dieser Adressbereich ändert seine Größe während der Programmausführung nicht.
Initialisierte Daten: Ein passender Bereich des Adressraums wird reserviert und anschließend werden die Initialwerte der Variablen aus der ausführbaren Datei dorthin geladen. Dieser Adressbereich ändert seine Größe während der Programmausführung nicht.
Nicht initialisierte Daten: Ein passender Speicherbereich wird reserviert und eventuell gelöscht (d.h. mit 0 geladen). Dieser Adressbereich ändert seine Größe während der Programmausführung nicht.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumbelegung durch Programme
Das Wachstum ist aber nur ungefährlich, solange sich die Heap- und Stack-Inhalte nicht überschneiden. Eine derartige Überschneidungssituation würde zu einem Fehler führen. Die Kunst liegt darin, diese Bereiche ausreichend groß zu wählen und eine mögliche Fehlsituation erkennen zu können. Ein Betriebssystem und/oder ein Laufzeitsystem einer Programmiersprache können hier allenfalls Hilfe anbieten, um Fehlsituationen zu erkennen.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumbelegung durch Programme
Alternative Layouts des Adressraums eines Programms (oder Prozesses als Programm in Ausführung)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumnutzung durch C-Programme
Für die Programmierung ist es hilfreich, die Platzierungsregeln für Variablen in der Programmiersprache C zu kennen. Nachfolgend sind sie kurz aufgeführt:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumnutzung durch C-Programme
malloc()
oder calloc()
, Freigabe mittels der Bibliotheksfunktion free()
. In C++ leisten die Operatoren new
und delete
Vergleichbares.Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumnutzung durch C-Programme
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumnutzung durch C-Programme
int x=0;int foo(int x) { int t=x; return t+1;}int main() { int y; int *yp; y=foo(x); yp=(int*)malloc(sizeof(int)); *yp=y;}
Beispiel eines C Programms
Variablenplatzierung im Adressraum (entsprechend Programmbeispiel)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Heap versa Stack Speicher
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Funktionsweise des Stapels und Stapelzeigers (SP)
Wenn Funktionen (Unterprogramme) aufgerufen werden wird:
Die dynamischen Daten eines Unterprogrammaufrufs werden auf dem Stapel als Teil des sogenannten Aufrufrahmens bzw. Aktivierungsrahmens (stack frame) gespeichert. Sie stehen dort nur für die Dauer der Unterprogrammausführung zur Verfügung.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Funktionsweise des Stapels und Stapelzeigers (SP)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Funktionsweise des Stapels und Stapelzeigers (SP)
Prinzip des Stapelspeichers
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Funktionsweise des Stapels und Stapelzeigers (SP)
Bei Beendigung des Unterprogramms wird der Datenbereich wieder freigegeben, was auch als Abräumen bezeichnet wird. Ein Aktivierungsrahmen enthält eines oder mehrere der folgenden Elemente:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Unterprogrammaufruf
Jeder Universalprozessor stellt für den Aufruf von Unterprogrammen und die Rückkehr in das Oberprogramm spezifische Maschinenbefehle zur Verfügung, die diesen Vorgang automatisieren helfen.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Unterprogrammaufruf
Für den Unterprogrammaufruf dient der JSR-Befehl, der die Rücksprungadresse auf dem Stapel ablegt und den Programmzähler mit der Startadresse des Unterprogramms lädt. Die Rückkehr in das Oberprogramm wird durch den RET-Befehl veranlasst, indem er das oberste Element vom Stapel entfernt und als neuen Wert in den Programmzähler, womit der Programmablauf an der Rücksprungstelle fortfährt.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Unterprogrammaufruf
Verwendung von Unterprogrammen (Beispiel)
Aufruf
Maschinenbefehl JSR
Rücksprung
Maschinenbefehl RET
OP: Oberprogramm
UP: Unterprogramm
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Unterprogrammaufruf
Durch die Verwendung des Stack Speichers und der LIFO Semantik wird auch Funktionsrekursion und geschachtelte Azfrufe unterstützt!
bsdp Geschachtelter Unterprogrammaufruf (Beispiel)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Paging und Segmentierung
Bisher gab es nur einen gesamten Speicherbereich mit der Unterteilung in die Bereiche Programm, statische Daten, dynamische Daten und temporäre Daten.
Es bedarf jetzt einer hierarchischen Speicherverwaltung: 1. Segmente / alle Prozesse, 2. Speicherbereiche in Segmenten eines Prozesses.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Paging und Segmentierung
objdump ball.exe -h ball.exe: file format elf32-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .text 00006c68 80000000 80000000 00001000 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .rodata 0000000b 80007000 80007000 00008000 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 2 .eh_frame 00001038 8000700c 8000700c 0000800c 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 3 .data 00000004 8000a000 8000a000 0000a000 2**2 CONTENTS, ALLOC, LOAD, DATA 4 .bss 00001238 8000a020 8000a020 0000a004 2**5 ALLOC
Die Segmente eines Programms bevor es in den Speicher geladen wird. VMA: Virtual Mmeory Address, LMA: Linear Memory Address. Stack und Heap gibt es hier noch nicht! .text: Programmcode, .rodata: Konstante Daten, .data: statische globale und initialisierte Daten, .bss: statische globale nicht initialisierte Daten
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Paging und Segmentierung
bsdp Gruppierung verschiedener Programmteile
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Paging und Segmentierung
Es nützt uns nichts wenn wir (oder das Betriebssystem) die physikalischen Speicheradressen (P Raum) auf virtuelle Adressen (für jeden Prozess, der V Raum) abbilden. Die Hardware muss das tun, und das geschieht durch die Memory Management Unit (MMU).
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Paging und Segmentierung
┌――――――――――┐ 0 ┌――――――┐ │ │ │ SS ├――――――――――――┐ │ │ └――――――┘ │ │ │ └―――▶│ │5000 ┌――――――┐ │ │ ┌――┤ DS ├――――――――――――――――▶│ │10000│ └――――――┘ │ │10100│ ┌――▶│ │10102│ ┌――――――┐ │ │ │ │ │ CS ├―――――――――――――┼――▶│ │20000│ └――――――┘ │ │ │ │ │ │ │ │ │ │ │ └―▶ add $100,$102 ――――――┘ │ │ │ │ └――――――――――┘ N-1
Die Programmadresse ergibt sich aus PC+CS, die Datenadressen aus DS+$addr, und die Stackadressen aus SS+SP
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Verwaltung von Prozessadressräumen
Dynamische Segmentierung kann erfolgen durch:
Egal welche Methode, bei jedem Prozesswechsel müssen die Tabellen oder Register umgeladen werden.
Nachdem ein Programm übersetzt wurde, steht es dem Betriebssystem in Form einer ausführbaren Datei zur Verfügung.
Das Betriebssystem muss über alle diese Belegungen des Adressraums Buch führen. Nur so ist es in der Lage, neue Reservierungen ohne Kollisionen mit bestehenden Belegungen durchzuführen.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Verwaltung von Prozessadressräumen
Prozessadressräume sind also i.A. virtuell, so dass jeder Prozess aus seiner Sicht immer die gleiche "Startadresse" hat.
Segmente sind Speicherregionen die vom Betriebssystem verwaltet werden müssen (Partitionierung des physikalischen Speichers).
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Verwaltung von Prozessadressräumen
Für jeden Prozess benötigt das Betriebssystem eine Buchhaltung der im Adressraum belegten und freien Bereiche. Da bei vielen Prozessen der Adressraum nur schwach belegt ist, wird typischerweise nur die Belegung festgehalten.
Dies ist die Voraussetzung dafür, dass sich während des Prozessablaufs zusätzliche Bereiche kollisionsfrei reservieren lassen.
Steht eine passende Hardwareunterstützung (MMU) zur Verfügung, so können zudem Fehlzugriffe auf unbelegte Bereiche festgestellt werden.
Funktionsweise einer MMU+CPU Architektur
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Verwaltung von Prozessadressräumen
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Verwaltung von Prozessadressräumen
Im Adressraum belegte Bereiche werden Regionen genannt. Sie repräsentieren lückenlos zusammenhängende Adressbereiche mit unterscheidbaren Eigenschaften. Wichtige Attribute einer Region sind:
Für das Suchen von Lücken im Adressraum sind nur die Attribute 1 und 2 von Belang. Wird ein virtuelles Speichersystem realisiert, so erlaubt das Attribut 3 die Erkennung von Fehlzugriffen und das Attribut 4 die Zuordnung zu einer Datei. Eine Region kann einem Hintergrundspeicher zur Auslagerung zugeordnet sein
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Verwaltung von Prozessadressräumen
Für die Verwaltung von Regionen werden i.A. verkettete Listen verwendet. Ausnahme bei hart echtzeitfähigen Systemen wo statische Tabellen verwendet werden (Hashtabellen).
bsdp Regionen pro Prozess
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Verwaltung von Prozessadressräumen
bsdp Prozessadressraumbeschreibung unter Linux (Beispiel)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Swapping
... wenn wir schon virtuelle Speicherräume haben:
Die Idee liegt darin, ganze Prozesse oder Speicherbereiche auszulagern, wenn sie im Moment keine Rechenzeit benötigen. Für diesen Zweck wird auf der Festplatte ein spezieller Bereich (Swapping Area) reserviert.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Swapping
Swapping Prinzip
Dynamische Partitionierung beim Swapping (Beispielsabfolge)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Swapping
Idee gut, aber zeitintensiv, gerade wenn ein Prozess nur kurz rechnet ...
Beispiele für Zeitbedarfe beim Swapping-Verfahren
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Virtueller Speicher
Zusammengefasst sind dies die wesentlichsten Eigenschaften:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Virtueller Speicher
Flexibilität ...
Flexible Platzzuteilung dank Adressumsetzung.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Zusammenfassung
Jedes Programm besteht aus verschiedenen Speicherbereichen: Heap, Stack, Datenbereiche, Code
C bildet das Prozesspeichermodell sehr konkret durch globale, lokale, und temporäre Variablen sowie Funktionen ab, und ermöglicht den Speicherzugriff über Zeiger ("Specihermodell")
Die einzelnen Programmbereiche können auf verschiedene Regionen im Speicher abgebildet werden.
Dynamische Speicherverwaltung benötigt Datenstrukturen die belegte und freie Regionen verwalten, der Prozess kann ebenfalls in seinen Regionen eine solche Speicherverwaltung haben (Verwaltungshierarchie)
Das Problem von Adresskollision kann durch Virtuelle Adressraume gelöst werden, die über eine MMU oder einen VMM auf physikalische Adressen abgebildet werden.
Was noch fehlt: Wie wird Speicher effizient verwaltet? Also die Algorithmik . coming soon.