Wirtschaftsinformatik (Bachelor-Studiengang): Rechnerarchitketur & Betriebssysteme (1. Semester)
Sie sind hier: Startseite › Wirtschaftsinformatik › Rechnerarchitektur/Betriebssysteme: Virtueller Speicher
BM / CM, Kurs vom 01.04.2002 - 30.09.2002
Einführung in Betriebssysteme
Begriff des Betriebssystems
Definition Betriebssystem: [DIN 44300]
Die Programme eines digitalen Rechensystems, die zusammen mit den Eigenschaften der Rechenanlage die Basis der möglichen Betriebsarten [..] bilden und insbesondere die Abwicklung von Programmen steuern und überwachen.
An operating system is a set of programs and routines which guide a computer in the performance of its tasks and assist the programs (and programmers) with certain supporting functions. A.P. Sayers (1971)
Aber auch: Ein Betriebssystem ist eine Sammlung von Dingen, die nicht in eine Programmiersprache passen. Deswegen sollte es keines geben. Daniel Ingalls (1981)
Aufgaben des Betriebssystems:
- Steuerung und Überwachung der
Programmausführung
Starten und Stoppen von Programmen - Betriebsmittel verwalten und optimiert zuordnen:
Speicher, CPU, Platten, Drucker, periphere Geräte - Kosten der Benutzung erfassen (Accounting)
- Zugang und Berechtigungen prüfen:
Passwortschutz, Zugriffe auf Betriebsmittel - Ausfallschutz realisieren:
z.B. RAID - Verbindungen mit anderen Rechnern bereitstellen
Geschichte der Betriebssysteme
Die Geschichte der Betriebssysteme ist eng gekoppelt mit der Hardware-Technologie, so dass die Geschichte beider Bereiche sich überlappt.
Experimentelle Betriebssysteme in Labors und Universitäten waren immer ca. 10-20 Jahre von der Leistungsfähigkeit her den kommerziellen Betriebssystemen voraus.
Hiervon gibt es nur zwei bekannte Ausnahmen: Multics und das Star-System. Beide entsprachen der jeweiligen (und teilweise heutigen) Forschung, waren kommerziell verfügbar und wurden vom Markt ignoriert.
Geschichte der Betriebssysteme (Auszug):
- 1886: Hermann Hollerith, Lochkarten bei Volkszählung in den USA
- 1924: Gründung der International Business Machine Corporation (IBM)
- 1937: Z1 von Konrad Zuse
- 1941: Z3 von Konrad Zuse, 64 Worte a 22 Bit = 176 Byte
- 1944: H. Aiken, Mark I, Addition: 0,33 s, Multiplikation: 6 s
Grace Murray Hopper (Erfinderin von Cobol) findet einen Bug - 1946: ENIAC,
18.000 Röhren, 1.500 Relais, 30t Gewicht
Addition: 0,2 s, Multiplikation: 2,8 ms - 1969: Multics, Projekt am MIT, Honeywell Bull
- 1969: Beginn Unix
- 1971: Intel 4004
- 1972: Intel 8008, Programmiersprache C
- 1973: Unix Version 6
- 1974: Xerox Palo Alto Palo Alto Research Center (PARC)
Beginn Star-System, Ethernet, Laserdrucker, Windowsystem, Maus (1965) - 1974: Intel 8080, Motorola MC 6800
- 1974: CP/M
- 1977: CP/M mit BIOS
- 1979: Unix Version 7
- 1980: MC 68000
- 1983: PC-XT, MS-DOS
- 1983: Unix System V
- 1984: PC-AT (MS-DOS), Lisa (Apple, AppleOS)
- 1985: Windows 1.0
- 1986: Unix System V R3
- 1986: Atari TOS
- 1988: Unix System V R4
- 1991: Beginn Linux
- 1992: Microsoft Windows 3.1
- 1995: Microsoft Windows 95
- 1996: Microsoft Windows NT 4.0
Phasen in der Betriebssystemgeschichte:
- Manuelle Bestückung des Rechners
Lochkarten durch Programmierer/Operator
50er/60er Jahre - Automatisierte Bestückung des Rechners
Batch-Betrieb mit Warteschlangen, jedoch nur 1 Job
60er Jahre - Batchbetrieb im Mehrprogrammbetrieb
60er/70er Jahre - Interaktive Benutzung
70er/80er Jahre - Vernetzte interaktive Benutzung
80er/90er Jahre - Mobil und multimedial integriert
Ab 90er Jahre
Betriebsarten
Ein-Benutzer- versus Mehrbenutzer-Betrieb:
Beim Mehrbenutzerbetrieb können mehrere Personen getrennt dieselben Betriebsmittel benutzen. Nur bei widersprechender Benutzung derselben Mittel treten Störungen auf (Single/Multi User Mode).
Beispiele für Betriebssysteme:
- Multi User: Unix, Linux
- Single User: Windows NT (vor 4.0), Windows 95/98/ME
Einprogramm- versus Mehrprogramm-Betrieb:
Beim Mehrprogrammbetrieb sind mehrere gleichzeitig parallel laufende Programme (Prozesse) möglich (englisch: Single/Multi Tasking).
Beispiele für Betriebssysteme:
- Single Tasking: MS-DOS
- Multi Tasking: Unix/Linux, Windows NT/95/98/ME
Weitere kommerzielle Betriebssysteme:
- IBM (MVS, TSO; OS/360..OS/390; VM/360, VM/370; AS/400)
- Siemens (BS2000)
- Sun (SunOS, Solaris)
- Apple (AppleOS/MacOS; MacOS X mit Mach-Kernel)
Grundlagen
Ein Betriebssystem besteht aus:
- einem residenten Teil im Arbeitsspeicher, dem Kern,
- einigen ständig laufenden Programmen und
- vielen vorhandenen Programmen.
Kernel = Kern = residenter Teil des Betriebssystems.
Prozess = eigenständiges laufendes Programm parallel zu anderen Programmen [nicht alle Betriebssysteme unterstützen Parallelität].
Mit diesen Definitionen kann gesagt werden:
- Alle Aktivitäten außerhalb des Kerns laufen in Prozessen parallel ab.
- Der Kern realisiert Prozesse, indem er "Routinen" ausführt; die Art dieser "Routinen" wird später klar.
Kommunikation mit I/O-Geräten:
Bildbeschreibung "Kommunikation mit I/O-Geräten": Zugang zum Bus haben CPU, RAM und alle I/O-Geräte.
I/O-Geräte
verhalten sich wie der RAM.
CPU
kommuniziert mit I/O-Geräten wie mit dem RAM.
Physikalischer Adressraum:
Für die weiteren Betrachtungen wird Memory-Mapped-I/O zugrunde gelegt: Alle Geräteregister der I/O-Geräte erhalten eine über den Adressbus benutzbare Adresse und sind somit mit allen Instruktionen erreichbar.
Bildbeschreibung "Physikalischer Adressraum": Die niedrigen Adressen des physikalischen Adressraumes werden vom Betriebssystem und Prozessen belegt, die hohen von den I/O-Geräten.
Der Bereich der Adressen, der über den Adressbus benutzbar ist, wird Physikalischer Adressraum genannt.
In der Regel ist dieser Adressraum in folgende Teile von den niedrigen zu den hohen Adressen aufgeteilt:
- Kernel des Betriebssystems
- Bereich für Prozesse bzw. Programme
- Lücke, da der gesamte mögliche Adressraum kleiner als die benutzten Adressen ist
- Bereich der Geräteregister
- Weiterhin gibt es noch den Bereich für den EPROM.
Bei Windows NT ist z.B. die Reihenfolge der Teile anders.
Virtueller Speicher: Segmente
Memory Management Unit (MMU)
Bildbeschreibung "Memory Management Unit (MMU)": Filter und Umrechnungseinheit zwischen virtuellen Adressen der CPU und realen Adressen des Busses.
Funktionsweise der Memory Management Unit (MMU):
Bildbeschreibung "Funktionsweise der Memory Management Unit": Eingehende virtuelle Adressen werden auf Richtigkeit überprüft (ob eine Adresse in dem zulässigen Bereich zwischen 0 und einem definierten Maximum liegt). Bei negativem Prüfungsausgang erfolgt eine Rückmeldung an die CPU, bei positivem Prüfungsausgang wird die virtuelle Adresse durch die Zugabe einer Basisadresse in eine reale Adresse gewandelt und an den Bus weitergegeben.
Die MMU ist ein Filter zwischen CPU und Bus, das folgende Aufgaben hat:
- Prüfung, ob eine Adresse in dem zulässigen Bereich zwischen 0 und einem definierten Maximum liegt.
- Verschiebung der von der CPU generierten Adresse auf die richtige Stelle im Adressraum des Busses durch Addition einer Basisadresse.
Alle Programme beginnen damit mit der virtuellen Adresse 0 und enden mit ihrer höchsten Adresse. Adressen dazwischen sind gültig, alle anderen ungültig.
Adressen der CPU, die von der MMU verarbeitet werden, werden virtuelle Adressen genannt.
Die umgerechneten Adressen werden physikalische oder reale Adressen genannt.
Virtueller Adressraum:
Bildbeschreibung "Virtueller Adressraum": Der virtuelle Adressraum (der CPU) wird eingebettet in zwei für den Prozess nicht-zugreifbare Bereiche und bildet so den physikalische Adressraum (des Busses).
Die MMU baut einen "Käfig" auf, der jeden Zugriff nach außen unterbindet. Versucht ein Prozess außerhalb zuzugreifen, wird die Instruktion aufgrund eines Signals von der MMU abgebrochen. Das Programm terminiert (in der Regel).
Bildbeschreibung "Virtualisierung": Drei virtuelle Adressräume: Prozess 3, Prozess 3, und noch einmal Prozess 3. Aber nur ein physikalischer Adressraum, der sich wie folgt zusammensetzt: Betriebssystem + Prozess 2 (entspricht dem zweiten Prozess 3) + Lücke + Prozess 1 (entspricht dem ersten Prozess 3) + Lücke + Prozess 3 (entspricht dem dritten Prozess 3) + Lücke + I/O.
Diese Virtualisierung gilt für jedes Programm. Daher können unabhängig voneinander mehrere jeweils mit der Adresse 0 beginnenden und verschieden lange Programme gleichzeitig im Arbeitsspeicher liegen.
Der Kern wird von der MMU wie ein Prozess mit einem virtuellen Adressraum behandelt. Damit der Kern an alle Geräte und Prozesse heran kann, hat sein Bereich die Basisadresse 0 und die maximal mögliche Länge.
Durch das Addieren der Basisadresse sind die Segmente unabhängig von der Position im RAM, d.h. sie können während einer Programmunterbrechung verschoben werden. Dies ist zur Beseitigung von Lücken zwischen den Segmenten erforderlich.
Alle Segmente müssen zusammen gleichzeitig in den RAM passen. Ist dieser voll, so kann weder ein neues Segment (Programm) geschaffen noch ein bestehendes vergrößert werden.
Definitionen und Erläuterungen
Ein Bereich eines Arbeitsspeichers, der virtuell bei 0 beginnt, wird Segment genannt.
In der Praxis können Programme gleichzeitig mehrere Segmente besitzen (wird hier aus Gründen der Vereinfachung weggelassen). Jedem Segment wird ein Deskriptor (MMU-Registersatz) zugeordnet, der folgendes enthält:
- Physikalische Basisadresse
- Länge des Segments
- Zugriffsrechte (Lesen/Schreiben/Ausführen)
Wenn ein Programm ausgeführt wird, ist dessen MMU-Deskriptor aktiv. Wechselt die Ausführung zu einem anderen Programm, wird dessen MMU-Deskriptor aktiviert, der vorherige ist inaktiv.
Kernel und Prozess
Bildbeschreibung "Kernel und Prozess": MMU-Deskriptor 1 = Einbettung des Prozesses in physikalischen Adressraum. MMU-Deskriptor 2 = Code und Daten des Kernel (abgelegt im Betriebssystem, welches sich im ersten für den Prozess nicht-zugreifbare Bereich befindet) + Zugriffsrechte des Kernel (umschließt die verbleibenden Bereiche).
Aufgaben der MMU:
Die wesentliche Aufgabe der MMU besteht darin, die einzelnen Programme gegenüber einem versehentlichen gegenseitigen Überschreiben zu schützen. Jedes Segment ist dadurch wie ein Gehege, aus dem das Programm nicht ausbrechen kann. So sind die anderen sowie der Kernel selbst geschützt.
Eine andere Aufgabe besteht in der Herstellung der Ortsunabhängigkeit der Segmente, daher können die Segmente an verschiedenen Stellen im physikalischen RAM stehen.
Die Realisierung von virtuellen Adressen mit einem unüberwindbaren Schutzmechanismus wie die MMU ist eines der wichtigsten Schutzkonzepte in Computern.
Zugriff auf die MMU-Register:
Bildbeschreibung "Zugriff auf die MMU-Register": MMU-Registersätze sind besondere Adressbereiche zugreifbar. MMU nimmt einen Bereich zwischen der dem letzten Prozess folgenden Lücke und dem Bereich I/O ein. Ein MMU-Registersatz besteht aus den drei Bereichen Länge, Erlaubnis und Basis-Adresse.
Systemaufrufe
Idee der Systemaufrufe
Bestimmte Routinen, die immer wieder gebraucht werden, werden aus den Programmen entfernt und als Betriebssystem zusammengefasst.
Jede dieser Routinen hat eine Schnittstelle: Name, Parameter samt Resultat.
Die Routinen im Kernel werden wie über ein Call angesprungen, wobei allerdings das User-Programm verlassen und das Betriebssystem betreten wird.
Dieser Wechsel erfolgt durch eine Trap-Instruktion; diese wird manchmal Software-Interrupt bezeichnet, was allerdings falsch ist, da es sich um keine Unterbrechung handelt.
Im Kernel wird dann die Routine ausgeführt.
Wechsel zum Kernel mittels Trap-Instruktion:
Bildbeschreibung "Wechsel zum Kernel mittels Trap-Instruktion": Zwei Modes. User-Mode mit User-Programm und Systemaufruf und Kernel-Mode mit Systemaufruf-Verteilung (I/O-System, File-System, Netzwerk-Dienste, Fehlerbehandlung). Der Trap-Bereich bildet die Schnittstelle zwischen diesen beiden Modes.
Mittels einer Return-from-trap-Instruktion wird wieder in das User-Programm zurückgekehrt.
Wenn von dem Wechsel ins Betriebssystem abgesehen wird, ist ein Systemaufruf (Syscall) vollkommen einem Aufruf einer Subroutine gleich. [Es gibt Betriebssysteme, bei denen das nicht so ist - aus Gründen der Vereinfachung wird dies hier weggelassen.]
Systemaufruf = Supervisorcall = Syscall = Aufruf einer Routine im Kernel aus einem Benutzerprogramm heraus.
CPU-Arbeitsmodi
Im Status-Register der CPU befindet sich ein Bit (manchmal sind es auch mehrere) zum Vermerken des globalen Arbeitsmodus der CPU:
- User-Mode: Normaler, eingeschränkter Modus
- Kernel-Mode: nur vom Betriebssystem benutzter Modus ohne jede Einschränkung.
Die Einschränkungen betreffen:
- Ausführung bestimmter Instruktionen: I/O-Instruktionen, Administrationsinstruktionen (Reset, Stop), Setzen des Status-Registers
- Wahl des MMU-Deskriptors: In Abhängigkeit vom Modus werden unterschiedliche Deskriptoren benutzt.
Was passiert beim Trap
- Status-Register wird auf den Stack gebracht
- PC wird (wie bei jsr) auf den Stack gebracht
- CPU-Modus wechselt in den Kernel-Mode
- Daher wird ein anderer MMU-Deskriptor benutzt
- Sprung an einer vorher festgelegte Adresse im Kernel
Da der Kernel selbst auch Programm mit Routinen usw. ist, benutzt er einen eigenen Stack, d.h. es findet noch ein Stack-Wechsel statt.
Weiterhin werden noch (fast) alle Register gerettet.
Was passiert beim Return-from-Trap?
- Wechsel in den User-Mode
- Benutzen des alten MMU-Deskriptors
- Wiederherstellen des alten PC-Wertes
- Wiederherstellen des alten SR-Wertes
Analog zum Trap muss auch der Stack gewechselt werden. Weiterhin werden noch (fast) alle Register wieder hergestellt.
Bei jedem Syscall findet ein Wechsel des Virtuellen Adressraums einschließlich Änderungen des Arbeitsmodus und Stacks statt.
- Supervisor-Mode = Privilegierter Mode = Kernel-Mode
- Nicht-Privilegierter Mode = User-Mode
Beispiel: Syscall read()
Bildbeschreibung "Syscall read()": Erstens = Absetzen des Lese-Kommandos (Betriebssystem an I/O). Zweitens = Kopieren der Daten ins Programm (I/O an Prozess).
Swapping und Paging
Idee des Swapping
Eigenschaften der Segmente:
- Alle Segmente müssen zusammen in den Arbeitsspeicher passen.
- Das größte Segment (längste Programm) ist auch durch die Größe des Arbeitsspeichers begrenzt.
Um die 1. Eigenschaft zu beseitigen, wird ein Stück Plattenspeicher als Arbeitsspeichererweiterung benutzt. Dieser Plattenbereich ist um ein Vielfaches größer als der Arbeitsspeicher, so dass nun alle Segmente zusammen auf die Platten passen müssen, aber nicht zusammen in den Arbeitsspeicher.
Wenn ein Programm ausgeführt werden soll, wird es in den RAM gebracht (swap in), wenn es pausiert, wird es aus dem RAM ausgelagert (swap out). Dieses Verlagern wird Swapping genannt.
Bildbeschreibung "Swapping": Grafische Darstellung der Verlagerung.
Der Schritt zum Paging
Beim Segmentieren muss immer noch der gesamte Prozess in den RAM passen. Um nur die wichtigen Teile in den RAM einzulagern und alles andere auf dem Swap-Gerät zu lassen,
- wird dieses Segment in gleich große Seiten (Pages, Kacheln) eingeteilt,
- werden nur die Seiten, die gebraucht werden, in den RAM geladen.
Typische Seitengrößen liegen bei 4 bis 8 KB (Seite = Page = Kachel).
Jetzt brauchen nur noch die tatsächlich benötigten Seiten - das können 2-3 Stück sein - eines Prozesses im RAM liegen. Je weniger es sind, desto langsamer ist das Programm, da dann sehr häufig Seiten nachgeladen werden müssen.
Paging - Swapping:
Bildbeschreibung "Paging - Swapping": Grafische Darstellung des im vorangegangenen Absatz beschriebenen Verfahrens.
Paging - Adressumsetzung
Der virtuelle Adressraum wird durch Aufteilung der virtuellen Adresse in zwei Bitfelder in gleich großer Seiten eingeteilt.
Jede Seite erhält von der MMU einen eigenen Deskriptor, der jetzt ohne ein Längenfeld auskommen kann, d.h. es gibt jetzt sehr viele Deskriptoren.
Ist die Basisadresse im Deskriptor 0, dann ist die Seite ausgelagert, was bei einem Zugriff zum Abbruch der Instruktion führt, ansonsten liegt die Seite an der angegebenen Stelle.
Alle Zugriffe auf eingelagerte Seiten passieren ohne Probleme die MMU.
Beispiel für 32 bit-Addressraum, Seitengröße ist 4 KB:
Bildbeschreibung "Paging - Adressumsetzung": Virtuelle Adresse = Page-ID (20 bit) + Adresse innerhalb der Seite (12 bit). Page-ID: Indizierung und Auswahl des Registersatzes. Zusammen erfolgt die Adressumsetzung und dann die Bildung der realen Adresse.
Zugriff auf ausgelagerte Seite:
- Die MMU zeigt eine Speicherverletzung an, die den Abbruch der Instruktion bewirkt.
- Es wird eine (nicht programmierte) Trap-Instruktion ausgeführt, wobei alles das, was beim Syscall erfolgt, durchgeführt wird (Kernel-Mode).
- Im Kernel wird die fehlende Seite nachgeladen.
- Der korrespondierende MMU-Deskriptor wird verändert.
- Anschließend wird in den User-Mode zurückgekehrt und die abgebrochene Instruktion wiederholt.
Damit ist das Einlagern von Seiten aus der Sicht des Programms vollkommen transparent.
Seitenaustauschverfahren:
Bei jedem Schreibzugriff durch die CPU wird eine Seite als modifiziert markiert (Setzen des dirty-Bits).
Seiten ohne gesetztes dirty-Bit brauchen beim Auslagern nicht auf das Swap-Gerät geschrieben werden.
Seiten, die am längsten nicht mehr benutzt wurden, sind gute Kandidaten zum Auslagern. Die Verfahren zur Bestimmung, welche Seite ausgelagert und welche eingelagert wird, beeinflussen entscheidend die Performance.
Prozesse und Threads:
Jeder Prozess erhält einen eigenen virtuellen Adressraum, der normalerweise getrennt von allen anderen ist. Ausnahme: Speicherbereiche zur Interprozess-Kommunikation.
Wenn mehrere "Prozesse" denselben virtuellen Adressraum benutzen, werden sie Threads (Pfäden) genannt.
Threads haben den großen Vorteil, dass ein Prozesswechsel ohne einen Wechsel des Virtuellen Adressraums auskommt, was viel schneller geht.
Sie haben den Nachteil des geringen Speicherschutzes, da die einzelnen Threads sich jederzeit überschreiben können.