Was ist die Architektur eines Computers?
Die Architektur eines Computersystems ist wie ein Schichtenmodell, bei dem jede Schicht eine bestimmte Rolle spielt:
Anwendungsprogramme: Das sind die Programme, die der Benutzer direkt nutzt, z. B. Textverarbeitung oder Webbrowser.
Betriebssystem: Es liegt zwischen den Anwendungsprogrammen und der Hardware. Es verwaltet die Ressourcen und ermöglicht den Programmen, mit der Hardware zu kommunizieren. Es ist wie ein Vermittler, der sicherstellt, dass alles reibungslos läuft.
Hardware: Das sind die physischen Komponenten wie CPU, Speicher und Festplatte.
Ein System besteht aus verbundenen Komponenten, die ein erwartetes Verhalten haben und über Schnittstellen mit ihrer Umgebung interagieren. Eine Schnittstelle ist wie ein Vertrag: Sie definiert eine Menge von Operationen, die eine Komponente anbietet, z. B. „Daten lesen“ oder „Daten schreiben“.
Die Architektur eines Computersystems ist ein Schichtenmodell:
Anwendungsprogramme → Betriebssystem → Hardware.
Ein System besteht aus verbundenen Komponenten mit einem erwarteten Verhalten.
Schnittstellen definieren eine Menge von Operationen, über die Komponenten miteinander interagieren.
Welche Komponenten hat ein Computer?
Ein Computersystem besteht aus drei Hauptkomponenten, die wie ein Team zusammenarbeiten:
Hardware:
Das sind die physischen Teile des Systems, wie die CPU (das „Gehirn“ des Computers), der Hauptspeicher (der Kurzzeitspeicher) und die Ein-/Ausgabegeräte (z. B. Tastatur, Maus, Festplatte).
Die Hardware ist wie die Bühne und die Instrumente eines Orchesters – ohne sie geht nichts.
Betriebssystem:
Das Betriebssystem ist der Vermittler zwischen der Hardware und den Anwendungsprogrammen. Es sorgt dafür, dass die Programme die Hardware nutzen können, ohne sich um die Details kümmern zu müssen.
Es ist wie der Dirigent, der sicherstellt, dass alle Komponenten harmonisch zusammenarbeiten.
Anwendungsprogramme:
Das sind die Programme, die der Benutzer direkt nutzt, wie Textverarbeitung, Webbrowser oder Spiele.
Sie ermöglichen die Interaktion zwischen Benutzern und dem Computersystem. Es ist, als ob die Musiker die Melodien spielen, die das Publikum hören will.
Ein Computersystem besteht aus:
Hardware: CPU, Hauptspeicher, Ein-/Ausgabegeräte.
Betriebssystem: Trennt Anwendungen von der Hardware.
Anwendungsprogramme: Ermöglichen die Interaktion zwischen Benutzern und dem System.
Wie kommunizieren die einzelnen Komponenten miteinander?
Die Kommunikation in einem Computersystem erfolgt in Schichten, wobei jede Schicht nur mit der darunterliegenden spricht:
Schichtenprinzip – Jede Schicht interagiert nur mit der direkt darunterliegenden über eine festgelegte Schnittstelle.
Anwendungen & Betriebssystem – Programme nutzen Systemaufrufe, um mit dem Betriebssystem zu kommunizieren, z. B. um Dateien zu öffnen oder Netzwerkverbindungen herzustellen.
Betriebssystem & Hardware – Die Hardware stellt dem Betriebssystem eine spezielle Schnittstelle namens ISA (Instruction Set Architecture) zur Verfügung. Diese besteht aus Maschinenbefehlen, mit denen das Betriebssystem die Hardware steuert.
So wird eine klare Trennung zwischen Software und Hardware gewährleistet!
Ein Computer funktioniert in Schichten, die nur direkt miteinander sprechen:
Programme reden mit dem Betriebssystem über Systemaufrufe.
Das Betriebssystem redet mit der Hardware über spezielle Maschinenbefehle (ISA).
Jede Schicht spricht nur mit der darunterliegenden – nicht mit anderen direkt.
Dadurch bleibt alles geordnet und verständlich!
Wie sind die Komponenten organisiert?
Ein Computersystem ist klar strukturiert – alle Komponenten sind in Schichten angeordnet:
Jede Schicht hat eine bestimmte Aufgabe und kann nur mit der direkt darunterliegenden kommunizieren.
Ganz unten: Die Hardware (z. B. CPU, Speicher).
Darüber: Das Betriebssystem, das die Hardware verwaltet und Programme steuert.
Ganz oben: Die Anwendungsprogramme, die der Benutzer nutzt.
Dieses Schichtenmodell sorgt für Ordnung und klare Zuständigkeiten – Änderungen in einer Schicht beeinflussen die anderen nur minimal.
Ein Computer ist wie eine Torte mit mehreren Schichten:
Unten ist die Hardware.
In der Mitte ist das Betriebssystem, das alles steuert.
Oben sind die Programme, die du benutzt.
Jede Schicht arbeitet nur mit der darunterliegenden – so bleibt alles übersichtlich!
Was ist die Grundidee eines Computers?
Der Computer wurde als universelle Maschine entwickelt – er kann beliebige Berechnungen und Informationsverarbeitung durchführen.
Dank der Universalmaschinen-Idee lassen sich Programme in den Speicher laden und ausführen, ohne dass die Hardware verändert werden muss.
Die Von-Neumann-Architektur macht es möglich, dass Programme nicht mehr fest in die Hardware eingebaut sein müssen – sie können flexibel gespeichert und ausgeführt werden.
Um die Bedienung zu vereinfachen, übernimmt ein Betriebssystem die Steuerung der Hardware und bietet eine benutzerfreundliche Oberfläche für Programme.
Diese Konzepte haben den Computer zu einem vielseitigen Werkzeug für alle möglichen Anwendungen gemacht!
Ein Computer ist eine universelle Maschine, die Programme speichern und ausführen kann.
Früher musste die Hardware für jede Aufgabe extra gebaut werden.
Dank der Von-Neumann-Architektur kann ein Computer Programme einfach in den Speicher laden und ausführen.
Das Betriebssystem erleichtert die Bedienung, indem es die Hardware für Programme steuert.
So kann ein Computer alles Mögliche berechnen und verarbeiten, ohne ständig umgebaut zu werden!
Welche Hardware-Komponenten hat ein Computer bzw. ein „moderner“ Von Neumann-Rechner?
Ein Computer besteht aus mehreren wichtigen Komponenten, die in einer Hierarchie angeordnet sind:
Prozessor (CPU) – Das Gehirn des Computers, oft mit Cache-Speicher, um schnell auf häufig benötigte Daten zuzugreifen.
Speicher
Register (direkt in der CPU, extrem schnell)
Cache (schneller Zwischenspeicher nahe der CPU)
Hauptspeicher (RAM) – Kurzzeitspeicher für laufende Programme.
Sekundärspeicher (Festplatte/SSD) – Langfristige Speicherung von Daten.
Tertiärspeicher – Externe Medien für Backups und Archivierung.
Ein-/Ausgabegeräte – Alles, womit der Computer Daten empfängt oder ausgibt, z. B.:
Monitor, Tastatur, Maus (Terminal)
Externe Festplatten, Netzwerkcontroller, Drucker, Kamera, Mikrofon
Diese Komponenten arbeiten zusammen, damit der Computer effizient Daten verarbeiten und speichern kann!
Ein Computer hat vier Hauptteile:
Prozessor (CPU) – Macht alle Berechnungen.
Schneller Speicher (Register, Cache, RAM) für Programme.
Langsamer Speicher (Festplatte/SSD) für dauerhafte Daten.
Tertiärspeicher für Backups.
Ein-/Ausgabegeräte – Alles, was man zum Arbeiten braucht (z. B. Monitor, Maus, Tastatur).
So kann ein Computer schnell rechnen, speichern und mit uns interagieren!
Nennen Sie drei Gründe für die Verbreitung von Computern!
Moderne Computer sind so leistungsfähig und zugänglich wie nie zuvor – dank drei entscheidender Faktoren:
Günstige und schnelle Hardware – Rechenleistung ist heute leistbar und bietet enorme Geschwindigkeit.
Vernetzung schafft neue Möglichkeiten – Computer können kommunizieren, Daten austauschen und weltweit zusammenarbeiten.
Einfache Bedienung durch Betriebssysteme – Ein Betriebssystem verwaltet die Hardware und macht Computer für jeden nutzbar.
Diese Entwicklungen haben Computer alltagstauglich, vernetzt und extrem leistungsfähig gemacht!
Computer sind schnell und günstig.
Sie können sich vernetzen und Daten austauschen.
Betriebssysteme machen sie einfach bedienbar.
Deshalb sind Computer praktisch und überall einsetzbar!
Was macht ein Betriebssystem? Welche Aufgaben haben Betriebsysteme?
Einprägsame Erklärung:
Das Betriebssystem ist das unsichtbare Bindeglied zwischen der Computer-Hardware und den Anwendungen.
Es verwaltet die Hardware (z. B. CPU, Speicher, Ein-/Ausgabegeräte).
Es ermöglicht Anwendungen, sicher und kontrolliert mit der Hardware zu interagieren – über Benutzer- und Programmierschnittstellen.
Es trennt Programme von der Hardware, sodass Software auf verschiedenen Geräten läuft, ohne an einen bestimmten Hardware-Typ gebunden zu sein.
Zugriffsrechte-Verwaltung sorgt dafür, dass Programme nur auf erlaubte Ressourcen zugreifen können.
🔹 Wichtige Aufgaben: ✅ CPU-Zeit planen – Bestimmt, welches Programm wann Rechenleistung bekommt. ✅ Speicher verwalten – Belegt und gibt Speicher frei. ✅ Ein-/Ausgabegeräte steuern – Verarbeitet Eingaben (z. B. Tastatur) und Ausgaben (z. B. Monitor).
Ohne das Betriebssystem wäre die Nutzung eines Computers viel zu kompliziert und unsicher!
Ein Betriebssystem ist die Steuerzentrale des Computers.
Es verwaltet die Hardware (Prozessor, Speicher, Ein-/Ausgabegeräte).
Es macht den Computer einfacher bedienbar, weil Programme nicht direkt mit der Hardware arbeiten müssen.
Es sorgt für Sicherheit, indem es den Zugriff auf Hardware und Daten kontrolliert.
🔹 Was es tut: ✅ CPU verwalten – Entscheidet, welches Programm rechnet. ✅ Speicher organisieren – Vergibt und räumt Speicherplatz. ✅ Geräte steuern – Sorgt dafür, dass Maus, Tastatur & Co. funktionieren.
Ohne ein Betriebssystem wäre ein Computer unbrauchbar für normale Nutzer!.
Welche Schnittstellen werden vom BS Anwendungen zur Verfügung gestellt?
Ein Betriebssystem hat zwei Hauptschnittstellen, um die Kommunikation zu ermöglichen:
Programmierschnittstelle (API) – Programme nutzen sie, um mit dem Betriebssystem zu sprechen.
Beispiel: Ein Programm speichert eine Datei, indem es eine API-Funktion für Dateizugriff aufruft.
Benutzerschnittstelle (UI) – Nutzer interagieren über Systemprogramme mit dem Betriebssystem.
Beispiele:
Shell – Eine Kommandozeile zur Steuerung des Computers.
Compiler – Übersetzt Quellcode in ausführbare Programme.
Editor – Bearbeitet Text oder Code.
Dazu kommt eine dritte, tiefere Schnittstelle:
Instruction Set Architecture (ISA) – Hier spricht das Betriebssystem direkt mit der Hardware.
Es bestimmt, welche Maschinenbefehle die CPU versteht.
👉 Zusammen bilden diese Schnittstellen die Brücke zwischen Mensch, Programmen, Betriebssystem und Hardware.
Ein Betriebssystem hat drei wichtige Schnittstellen:
Für Programme – Sie kommunizieren über die API mit dem Betriebssystem.
Für Benutzer – Sie nutzen Systemprogramme wie die Shell oder den Editor.
Für Hardware – Das Betriebssystem nutzt die ISA, um direkt mit der CPU zu reden.
Diese Schnittstellen sorgen dafür, dass Programme, Nutzer und Hardware reibungslos zusammenarbeiten!
Aus welchen Schichten besteht ein Computersystem?
Ein Computer funktioniert durch ein drei-schichtiges System, das mit Schnittstellen verbunden ist:
Oben: Anwendungsprogramme (wie Shell, Compiler, und Dienstprogramme) – Sie ermöglichen den Benutzern, mit dem System zu interagieren.
Mittlere Schicht: Betriebssystem – Es verwaltet und koordiniert die Hardware und sorgt dafür, dass Programme sicher und effizient laufen.
Unten: Hardware – Die physische Grundlage, z. B. CPU, Speicher und Ein-/Ausgabegeräte.
Zwischen diesen Schichten gibt es zwei wichtige Schnittstellen:
Programmierschnittstellen (API) und Benutzerschnittstellen (UI) für den oberen Bereich, um mit dem Betriebssystem zu kommunizieren.
Instruction Set Architecture (ISA), die die Verbindung zwischen Betriebssystem und Hardware bildet.
Die Standardbibliothek sorgt dafür, dass Systemaufrufe für Programme vereinheitlicht sind und die Kommunikation vereinfacht wird.
👉 Zusammen bilden diese Komponenten eine funktionierende Maschine, die den Benutzern die gewünschten Ergebnisse liefert!
Ein Computer besteht aus drei Schichten:
Oben: Programme wie Shell, Compiler und Dienstprogramme, die den Nutzern helfen.
Mitte: Das Betriebssystem, das die Hardware steuert und Programme verwaltet.
Unten: Hardware wie die CPU und Speicher.
Es gibt zwei Arten von Schnittstellen:
Oben: Programmierschnittstellen und Benutzerschnittstellen für die Kommunikation zwischen Programmen und Betriebssystem.
Unten: ISA, die das Betriebssystem mit der Hardware verbindet.
Die Standardbibliothek stellt sicher, dass Programme die gleichen, vereinheitlichten Befehle verwenden.
Diese Schichten und Schnittstellen machen den Computer für den Benutzer benutzbar!
Welche Aufgaben hat ein Betriebssystem bzw. die Betriebsystem-Schicht?
Das Betriebssystem ist wie ein Schutzschild zwischen den Anwendungsprogrammen und der Hardware und sorgt dafür, dass alles reibungslos funktioniert. Es übernimmt dabei die folgenden Aufgaben:
Abschirmung der Hardware – Verhindert, dass Programme direkt auf die Hardware zugreifen.
CPU-Zeitplanung – Der CPU-Scheduler teilt die Rechenzeit fair und effizient auf verschiedene Programme auf.
Speicherverwaltung – Teilt und verwaltet den Hauptspeicher und den virtuellen Speicher. Hier kommt Virtualisierung ins Spiel, um den Speicher zu optimieren.
Steuerung von Ein-/Ausgabegeräten – Organisiert, wie Geräte wie Festplatten und Tastaturen mit dem Betriebssystem kommunizieren und sorgt dafür, dass Dateien ordentlich gespeichert werden (über Dateisysteme).
Prozess-Synchronisation sorgt dafür, dass verschiedene Programme nicht durcheinander laufen, wenn sie gleichzeitig auf die CPU zugreifen wollen.
👉 Zusammen macht das Betriebssystem den Computer sicher, effizient und benutzerfreundlich!
Das Betriebssystem sorgt dafür, dass Programme sicher mit der Hardware arbeiten, ohne sich gegenseitig zu stören. Es macht Folgendes:
Schützt die Hardware – Programme können nicht direkt auf die Hardware zugreifen.
Verteilt die Rechenzeit – Der CPU-Scheduler sorgt dafür, dass alle Programme fair rechen können.
Verwaltet den Speicher – Das Betriebssystem verteilt den Speicherplatz und hilft beim virtuellen Speicher.
Steuert Geräte und Dateien – Sorgt dafür, dass Geräte wie Festplatten richtig funktionieren und Dateien korrekt gespeichert werden.
Prozess-Synchronisation stellt sicher, dass Programme nicht gleichzeitig auf dieselben Ressourcen zugreifen und sich gegenseitig stören.
Welche Idee wird „von Neumann“ zugeschrieben?
Früher waren Programme fest in den Rechner eingebaut – wie ein Radio, das nur eine bestimmte Anzahl von Sendern abspielen konnte. Heute ist das anders:
Programme und Daten werden geladen: Bevor ein Programm ausgeführt wird, wird es zusammen mit den benötigten Daten in den Hauptspeicher (RAM) geladen. Das ist wie das Laden von Musik in einen MP3-Player – die Songs sind nicht fest eingebaut, sondern können jederzeit ausgetauscht werden.
Gemeinsamer Speicher für Programme und Daten: Der Hauptspeicher enthält sowohl das Programm als auch die Programmdaten. Es ist wie ein Schreibtisch, auf dem du sowohl deine Notizen (Daten) als auch dein Rezept (Programm) ablegst, um eine Mahlzeit zuzubereiten.
Entfernen nach der Ausführung: Nachdem das Programm fertig ist, werden sowohl das Programm als auch die Daten wieder aus dem Hauptspeicher entfernt. Das ist wie das Aufräumen des Schreibtischs, wenn die Arbeit erledigt ist.
Programme und Daten werden vor der Ausführung in den Hauptspeicher (RAM) geladen.
Der Hauptspeicher enthält sowohl das Programm als auch die Programmdaten.
Nach der Ausführung werden Programm und Daten wieder aus dem Hauptspeicher entfernt.
Warum ist Neumanns Idee ein Meilenstein für die Informatik?
Die moderne Idee eines Computers ist, dass er eine universelle Maschine ist, die beliebige Programme ausführen kann. Dafür muss nur eine einzige Fähigkeit fest eingebaut sein:
Fähigkeit zur Programmausführung: Der Computer muss in der Lage sein, jedes Programm, das sich im Hauptspeicher (RAM) befindet, auszuführen. Das ist wie ein Universalwerkzeug, das jede Aufgabe erledigen kann, solange du die richtige „Anleitung“ (Programm) gibst.
Keine Änderungen nötig: Sobald diese Fähigkeit vorhanden ist, muss idealerweise nie wieder etwas verändert werden. Der Computer kann jedes Programm ausführen, das du ihm gibst – ob Textverarbeitung, Spiel oder Videoeditor.
Diese Idee entspricht der Vision des Computers als universelle Maschine: Ein Gerät, das durch Software flexibel und für fast jede Aufgabe einsetzbar ist.
Der Computer muss nur die Fähigkeit haben, beliebige Programme aus dem Hauptspeicher auszuführen.
Diese Fähigkeit ist fest eingebaut und muss nie wieder verändert werden.
Dies macht den Computer zu einer universellen Maschine, die für jede Aufgabe geeignet ist.
Was ist ein Programm im Hauptspeicher?
Algorithmus:
Ein Algorithmus ist wie ein Rezept zur Lösung eines Problems. Er beschreibt Schritt für Schritt, wie man von der Problemspezifikation (z. B. im Lastenheft) zur Lösung kommt. Es ist die Idee oder der Plan, bevor man ihn umsetzt.
Programm:
Ein Programm ist die Umsetzung des Algorithmus in eine Programmiersprache. Es ist, als ob du das Rezept in eine Sprache übersetzt, die der Computer versteht.
Programm im Hauptspeicher:
Wenn das Programm in den Hauptspeicher geladen wird, wird es zu einer Folge von Befehlen, die der Computer ausführen kann. Es ist wie ein Koch, der die Anweisungen Schritt für Schritt abarbeitet.
Prozess:
Ein Prozess ist ein Programm in Ausführung. Es ist, als ob der Koch tatsächlich am Herd steht und das Rezept zubereitet.
Algorithmus: Beschreibung einer Lösung zu einem Problem.
Programm: Abbildung des Algorithmus auf eine Programmiersprache.
Programm im Hauptspeicher: Folge von Befehlen.
Prozess: Programm in Ausführung.
Wie sieht eine CPU (Central Processor Unit) aus? Wie ist ein Prozessor aufgebaut?
Rechenwerk (ALU):
Alle Berechnungen eines Computers finden im Prozessor statt, genauer gesagt im Rechenwerk, auch ALU (Arithmetic Logic Unit) genannt. Die ALU ist wie das „Gehirn“ des Prozessors, das mathematische Operationen (z. B. Addition) und logische Vergleiche (z. B. „größer als“) durchführt.
Zugriff auf Programme und Daten:
Der Prozessor greift auf Programme und Daten zu, die sich im Hauptspeicher (RAM) befinden. Es ist, als ob der Koch (Prozessor) die Zutaten (Daten) und das Rezept (Programm) aus dem Regal (Hauptspeicher) holt.
Befehlszähler (Program Counter, PC):
Der Befehlszähler enthält die Speicheradresse des nächsten auszuführenden Befehls. Es ist wie ein Lesezeichen, das dem Prozessor sagt, wo er im Programm weitermachen soll.
Befehlsregister (Instruction Register, IR):
Das Befehlsregister speichert den momentan auszuführenden Befehl. Es ist wie die aktuelle Anweisung, die der Koch gerade befolgt.
Programmstatuswort (PSW):
Das Programmstatuswort enthält wichtige Informationen wie:
Benutzer-/Systemmodus: Ob der Prozessor im geschützten Systemmodus (supervisor mode) oder im Benutzermodus arbeitet.
Interrupt-Masken-Level: Welche Unterbrechungen gerade erlaubt oder blockiert sind.
ALU-Ergebnis-Bits: Informationen über das Ergebnis der letzten Berechnung (z. B. ob das Ergebnis null oder negativ war).
Rechenwerk (ALU): Führt alle Berechnungen im Prozessor durch.
Hauptspeicher: Enthält Programme und Daten, auf die der Prozessor zugreift.
Befehlszähler (PC): Speichert die Adresse des nächsten Befehls.
Befehlsregister (IR): Speichert den aktuellen Befehl.
Programmstatuswort (PSW): Enthält Informationen wie Benutzer-/Systemmodus, Interrupt-Masken und ALU-Ergebnis-Bits.
Welche Schritte hat ein Befehlszyklus oder Instruktionszyklus des Prozessors?
Der Instruktionszyklus beschreibt, wie ein Prozessor Befehle ausführt. Er besteht aus drei Phasen:
Holphase (Fetch Stage):
Der Prozessor holt den nächsten Befehl aus dem Speicher.
Das Speicheradressregister (MAR) wird mit dem Wert des Befehlszählers (PC) belegt, und die Adresse wird an den Adressbus gesendet.
Der Inhalt der Speicherzelle (der Befehl) wird aus dem Cache oder Hauptspeicher in das Befehlsregister (IR) geladen.
Zum Schluss wird der Befehlszähler (PC) um Eins erhöht, um auf den nächsten Befehl vorzubereiten.
Es ist, als ob du ein Buch aufschlägst, die aktuelle Seite liest und dann das Lesezeichen auf die nächste Seite legst.
Ausführungsphase (Execution Stage):
Der im Befehlsregister (IR) geladene Befehl wird ausgeführt.
In dieser Phase können zusätzliche Daten oder Adressen aus dem Speicher geholt werden, falls der Befehl das erfordert.
Es ist, als ob du die Anweisung auf der Seite ausführst, z. B. eine Berechnung durchführst oder eine Entscheidung triffst.
Unterbrechungsphase:
Der Prozessor prüft, ob eine Unterbrechung (Interrupt) vorliegt.
Falls ja, wird die aktuelle Ausführung unterbrochen, und der Prozessor kümmert sich um die Unterbrechung.
Es ist, als ob du beim Lesen des Buches plötzlich einen Anruf bekommst und kurz unterbrechen musst.
Der Instruktionszyklus besteht aus drei Phasen:
Der Befehl wird aus dem Speicher geholt und ins Befehlsregister (IR) geladen.
Der Befehlszähler (PC) wird um Eins erhöht.
Der Befehl im IR wird ausgeführt.
Weitere Daten oder Adressen können geholt werden.
Der Prozessor prüft, ob eine Unterbrechung vorliegt.
Wie sieht ein CPU-Befehlszyklus oder Instruktionszyklus bzgl. der Register aus?
Die Abarbeitung von Befehlen im Prozessor erfolgt getaktet, d. h., jeder Schritt wird durch einen Taktimpuls gesteuert. Hier ist, wie es abläuft:
Holphase (Fetch Phase):
Der Programmzähler (Befehlszählerregister) enthält die Adresse des nächsten Befehls.
Diese Adresse wird ins Speicheradressregister (MAR) geladen und über den Adressbus an den Hauptspeicher gesendet.
Der Befehl wird über den Datenbus aus dem Hauptspeicher ins Befehlsregister (IR) geladen.
Währenddessen wird der Programmzähler (PC) um Eins erhöht, um auf den nächsten Befehl vorzubereiten.
Es ist, als ob du ein Buch aufschlägst, die aktuelle Seite liest und das Lesezeichen auf die nächste Seite legst.
Der Befehl im Befehlsregister (IR) wird vom Steuerwerk decodiert und ausgeführt.
Daten werden verarbeitet und im Akkumulator (einem speziellen Register für Berechnungen) gespeichert.
Bei indirekter Adressierung werden Indexregister (z. B. Register L und H) verwendet, um Adressen zur Laufzeit zu berechnen.
Ein Sprungbefehl ändert den Wert des Befehlszählers (PC), sodass der Prozessor an einer anderen Stelle im Programm weitermacht.
Es ist, als ob du die Anweisung auf der Seite ausführst und manchmal zu einer ganz anderen Seite springst, um weiterzulesen.
Programmzähler (PC) → Speicheradressregister (MAR) → Adressbus → Hauptspeicher → Befehlsregister (IR).
Der PC wird um Eins erhöht.
Befehlsregister (IR) → Steuerwerk → Daten → Akkumulator.
Indexregister (z. B. Register L/H) werden für indirekte Adressierung verwendet.
Ein Sprungbefehl setzt den Befehlszähler (PC) neu.
Welche wichtigen Register hat die CPU? Welche Aufgaben haben diese Register?
Programmzähler/Befehlszähler (PC):
Der Programmzähler (PC) enthält die Adresse der Speicherzelle, in der der nächste auszuführende Befehl steht. Es ist wie ein Lesezeichen, das dem Prozessor sagt, wo er im Programm weitermachen soll.
Speicheradressregister (MAR):
Das Speicheradressregister (MAR) enthält die Adresse der Speicherzelle, die als Nächstes gelesen oder beschrieben werden soll. Es ist wie ein Zeiger, der auf die richtige Stelle im Speicher zeigt.
Befehlsregister (IR):
Das Befehlsregister (IR) speichert den aktuellen Befehl, der gerade verarbeitet oder ausgeführt wird. Es ist wie die aktuelle Anweisung, die der Prozessor befolgt.
Programmstatuswortregister (PSW):
Das Programmstatuswortregister (PSW) enthält verschiedene Bits, die den Zustand des Prozessors anzeigen:
Carry: Zeigt an, ob ein Überlauf bei einer Berechnung aufgetreten ist.
Overflow: Zeigt an, ob das Ergebnis einer Berechnung zu groß für das Register war.
Zero: Zeigt an, ob das Ergebnis einer Berechnung null ist.
Negative: Zeigt an, ob das Ergebnis einer Berechnung negativ ist.
Interrupt: Zeigt an, ob eine Unterbrechung bearbeitet werden soll.
Supv (Supervisor Mode): Zeigt an, ob der Prozessor im privilegierten Systemmodus arbeitet.
Akkumulator:
Der Akkumulator ist eines von mehreren Datenregistern und speichert ein Zwischenergebnis einer Berechnung. Es ist wie ein Notizblock, auf dem der Prozessor Zwischenschritte notiert.
Unterbrechungs(test-)phase:
In dieser Phase prüft der Prozessor, ob eine Unterbrechung (Interrupt) vorliegt, die bearbeitet werden muss. Es ist, als ob der Prozessor kurz innehält, um zu schauen, ob etwas Dringendes passiert ist.
Programmzähler (PC): Adresse des nächsten Befehls.
Speicheradressregister (MAR): Adresse der nächsten zu lesenden/beschreibenden Speicherzelle.
Programmstatuswortregister (PSW): Enthält Zustandsbits wie Carry, Overflow, Zero, Negative, Interrupt, Supv.
Akkumulator: Speichert Zwischenergebnisse von Berechnungen.
Unterbrechungs(test-)phase: Prüft, ob eine Unterbrechung bearbeitet werden muss.
Was ist ein Cache?
Der Cache ist wie ein schneller Zwischenspeicher, der die Leistung des Computers erheblich verbessert. Das funktioniert, weil Programme und Daten oft temporale und räumliche Lokalität aufweisen:
Temporale Lokalität: Wenn auf eine Speicherstelle zugegriffen wird, ist die Wahrscheinlichkeit hoch, dass bald wieder darauf zugegriffen wird.
Räumliche Lokalität: Wenn auf eine Speicherstelle zugegriffen wird, ist die Wahrscheinlichkeit hoch, dass auch benachbarte Speicherstellen bald benötigt werden.
Dank dieser Lokalität kann der Cache wiederholte Hauptspeicherzugriffe vermeiden, was die Bearbeitungszeit von Befehlen verkürzt, da der Cachezugriff deutlich schneller ist als der Hauptspeicherzugriff.
Cache-Zeitvorteil:
Angenommen, 80 % der Zugriffe gehen in den Cache und 20 % in den Hauptspeicher.
Wenn der Cache neunmal schneller ist als der Hauptspeicher, ergibt sich ein Gesamtzeitvorteil von Faktor 3.
Es ist, als ob du 80 % deiner Einkäufe in einem schnellen Supermarkt um die Ecke erledigst und nur 20 % in einem weiter entfernten Laden – du sparst viel Zeit!
Der Cache nutzt temporale und räumliche Lokalität, um wiederholte Hauptspeicherzugriffe zu vermeiden.
Da der Cachezugriff schneller ist als der Hauptspeicherzugriff, verkürzt sich die Bearbeitungszeit von Befehlen.
Cache-Zeitvorteil: Bei 80 % Cache-Zugriffen und 20 % Hauptspeicher-Zugriffen ergibt sich ein Zeitvorteil von Faktor 3, wenn der Cache neunmal schneller ist.
Welche Probleme entstehen, wenn ein Cache eingesetzt wird?
1. Cache-Management:
Der Cache ist wie ein kleiner Tisch, auf dem du die wichtigsten Dinge ablegst, die du schnell brauchst. Aber was machst du, wenn der Tisch voll ist und du etwas Neues ablegen möchtest?
Du musst alte Daten opfern, um Platz zu schaffen. Aber welche?
Least Recently Used (LRU): Die Daten, die am längsten nicht mehr verwendet wurden, werden zuerst entfernt. Es ist, als ob du die ältesten Notizen wegwirfst, die du nicht mehr brauchst.
First In, First Out (FIFO): Die Daten, die zuerst in den Cache kamen, werden zuerst entfernt. Es ist, wie eine Warteschlange, bei der der Erste auch als Erster wieder geht.
2. Cache-Konsistenz:
Stell dir vor, du hast eine Kopie eines Dokuments auf deinem Schreibtisch (Cache) und das Original im Schrank (Hauptspeicher). Wenn du die Kopie änderst, stimmt sie nicht mehr mit dem Original überein.
Das Betriebssystem muss sicherstellen, dass solche Unterschiede keine Fehler verursachen. Es gibt zwei Strategien:
Write-Through: Jede Änderung im Cache wird sofort auch im Hauptspeicher durchgeführt. Es ist, als ob du jedes Mal, wenn du die Kopie änderst, auch das Original aktualisierst.
Write-Back: Die Änderungen werden zunächst nur im Cache gespeichert und später in den Hauptspeicher geschrieben. Das Betriebssystem muss dann sicherstellen, dass die Änderungen irgendwann synchronisiert werden.
Wenn der Cache voll ist, müssen alte Daten entfernt werden.
Strategien: LRU (am längsten nicht verwendet) oder FIFO (zuerst reingekommen, zuerst raus).
Änderungen im Cache müssen mit dem Hauptspeicher synchronisiert werden, um Fehler zu vermeiden.
Strategien: Write-Through (sofortige Synchronisation) oder Write-Back (spätere Synchronisation).
Wie läuft der Cache-Algorithmus ab?
Der Cache ist wie ein schneller Zwischenspeicher, der häufig genutzte Daten vorübergehend speichert, um den Zugriff darauf zu beschleunigen. Hier ist, wie es funktioniert:
Daten werden in den Cache kopiert:
Häufig benutzte Daten werden vom Hauptspeicher in den Cache kopiert. Es ist, als ob du wichtige Dokumente vom Schrank (Hauptspeicher) auf deinen Schreibtisch (Cache) legst, um sie schneller griffbereit zu haben.
Zugriff auf Daten:
Wenn Daten benötigt werden, schaut der Prozessor zuerst im Cache nach.
Wenn die Daten im Cache gefunden werden (Cache Hit), werden sie direkt verwendet, und ein langsamer Hauptspeicherzugriff wird vermieden. Es ist, als ob du das Dokument auf deinem Schreibtisch findest und es sofort verwenden kannst.
Wenn die Daten nicht im Cache gefunden werden (Cache Miss), muss der Prozessor auf den Hauptspeicher zugreifen.
Daten in den Cache laden:
Bei einem Cache Miss werden die Daten aus dem Hauptspeicher geholt und eine Kopie im Cache abgelegt. Das geschieht, weil die Wahrscheinlichkeit hoch ist, dass diese Daten bald wieder benötigt werden. Es ist, als ob du das Dokument aus dem Schrank holst und es auf deinen Schreibtisch legst, um es beim nächsten Mal schneller zu finden.
Häufig benutzte Daten werden vom Hauptspeicher in den Cache kopiert.
Bei einem Datenzugriff wird zuerst im Cache gesucht:
Cache Hit: Daten werden direkt aus dem Cache verwendet.
Cache Miss: Daten werden aus dem Hauptspeicher geholt und im Cache gespeichert.
Wie sieht ein Hauptspeicher aus?
Hauptspeicher (RAM):
Der Hauptspeicher ist wie eine lange Reihe von gleich großen Schubladen, die jeweils eine Speicherzelle darstellen. Jede Schublade hat eine eindeutige Adresse (einen Index), über die sie direkt angesprochen werden kann.
Das Speicheradressregister (MAR) der CPU enthält die Adresse der Speicherzelle, auf die zugegriffen werden soll. Es ist, als ob du eine Schubladennummer angibst, um den Inhalt zu finden.
Der Hauptspeicher hat die Eigenschaft des wahlfreien Zugriffs (Random Access): Jede Speicherzelle kann direkt angesprochen werden, unabhängig von der Reihenfolge der Zugriffe. Es ist, als ob du jede Schublade öffnen kannst, ohne die anderen zu durchsuchen.
Sekundärspeicher:
Der Sekundärspeicher ist wie ein Archiv, das für die dauerhafte Speicherung von Daten zuständig ist. Im Gegensatz zum flüchtigen Hauptspeicher bleiben die Daten hier auch nach dem Ausschalten des Computers erhalten.
Die gebräuchlichsten Typen von Sekundärspeicher sind:
Magnetplatte (Festplatte, HDD): Speichert Daten auf magnetischen Scheiben. Es ist wie eine Schallplatte, auf der Informationen gespeichert werden.
Flash-Speicher (SSD, Solid State Drive): Speichert Daten in elektronischen Zellen. Es ist wie ein USB-Stick, nur viel größer und schneller.
Eine lange Folge von gleich großen Speicherzellen, die einzeln adressiert werden können.
Wahlfreier Zugriff (Random Access): Jede Zelle kann direkt über ihre Adresse angesprochen werden.
Dient der dauerhaften Speicherung von Daten.
Beispiele: Festplatte (HDD) und Flash-Speicher (SSD).
Wie funktioniert die Speicherung auf einer SSD (solid state disk)?
Ein Flash-Chip (auch EEPROM genannt) ist wie ein Notizblock, der in Abschnitte (Erase Blocks) unterteilt ist. Jeder Abschnitt hat eine feste Größe, z. B. 128 KB oder 256 KB.
NOR-Flash:
Bei NOR-Flash besteht jeder Block aus einzelnen Daten-Bits, die einzeln gelesen und geschrieben werden können. Es ist, als ob du in einem Notizblock jedes Wort einzeln ändern kannst.
Jedes Bit kann einzeln von 1 auf 0 gesetzt werden.
NAND-Flash:
Bei NAND-Flash ist jeder Block in Seiten unterteilt. Eine Seite enthält nicht nur Daten-Bits, sondern auch einen Out-Of-Band-Bereich (OOB).
Der OOB-Bereich wird für Fehlerbehandlung und die Kennzeichnung von beschädigten Seiten verwendet. Es ist, als ob du am Rand der Seite Notizen machst, um Fehler zu korrigieren oder Schäden zu markieren.
Daten können hier nur seitenweise gelesen und geschrieben werden. Es ist, als ob du ganze Absätze auf einmal bearbeiten musst, statt einzelne Wörter.
Löschen-Operation:
Bei beiden Flash-Arten muss das Löschen auf einem kompletten Block ausgeführt werden. Es ist, als ob du eine ganze Seite deines Notizblocks radierst, um sie neu zu beschreiben.
Nach etwa 100.000 Löschzyklen ist ein Block abgenutzt (wear out) und kann nicht mehr zuverlässig verwendet werden. Es ist, als ob die Seite deines Notizblocks durch zu häufiges Radieren durchscheinend wird.
Ein Flash-Chip besteht aus Erase-Blöcken (128 KB oder 256 KB).
Einzelne Bits können gelesen und geschrieben werden.
Jedes Bit kann von 1 auf 0 gesetzt werden.
Daten sind in Seiten organisiert, die einen Out-Of-Band-Bereich (OOB) für Fehlerbehandlung enthalten.
Daten können nur seitenweise gelesen und geschrieben werden.
Löschen: Muss auf einem kompletten Block ausgeführt werden.
Abnutzung: Nach ca. 100.000 Löschzyklen ist ein Block abgenutzt.
Wie funktioniert die Speicherung auf einer Festplatte (hard disk drive)?
Eine HDD (Festplatte) ist wie ein riesiges Bücherregal, das für die dauerhafte Speicherung von Daten verwendet wird. Sie bietet wahlfreien Zugriff (random access), d. h., du kannst jede „Seite“ (Datenblock) direkt ansteuern, ohne die anderen durchsuchen zu müssen.
Aufbau und Funktionsweise:
Schreib-/Lesekopf:
Der Schreib-/Lesekopf ist wie ein Arm, der über die rotierenden Scheiben der Festplatte gleitet, um Daten zu lesen oder zu schreiben.
Spuren, Sektoren und Blöcke:
Die Festplatte ist in Spuren (konzentrische Kreise) und Sektoren (Unterteilungen der Spuren) unterteilt.
Mehrere Sektoren bilden einen Block, die kleinste Einheit für Lese-/Schreibvorgänge.
Zylinder:
Ein Zylinder besteht aus allen Spuren, die übereinander auf den verschiedenen Scheiben liegen. Es ist, als ob du alle Seiten eines Buches auf einmal lesen könntest.
Zugriffszeiten:
Positionierungszeit: Die Zeit, die der Schreib-/Lesekopf braucht, um die richtige Spur zu finden.
Latenzzeit: Die Zeit, bis der richtige Sektor unter dem Kopf vorbeikommt.
Übertragungszeit: Die Zeit, um die Daten in den Pufferspeicher des Controllers zu übertragen.
Gesamte Zugriffszeit: Positionierungszeit + Latenzzeit + Übertragungszeit.
Fehlererkennung und -behebung:
Parity-Bits: Zusätzliche Bits, die zur Fehlererkennung und -behebung verwendet werden. Es ist, als ob du eine Prüfsumme hinzufügst, um sicherzustellen, dass die Daten korrekt sind.
Platten-Cache:
Ein kleiner Cache auf der Festplatte speichert häufig genutzte Daten, um den Zugriff zu beschleunigen. Es ist wie ein Notizblock, auf dem du die wichtigsten Informationen griffbereit hast.
HDD: Dauerspeicher mit wahlfreiem Zugriff.
Schreib-/Lesekopf: Liest und schreibt Daten auf rotierenden Scheiben.
Spuren, Sektoren, Blöcke, Zylinder: Organisationsstruktur der Daten.
Zugriffszeit: Positionierungszeit + Latenzzeit + Übertragungszeit.
Parity-Bits: Für Fehlererkennung und -behebung.
Platten-Cache: Beschleunigt den Datenzugriff.
Wie läßt sich die Zugriffszeit/Suchzeit bei mechanischen Festplatten verringern?
1. Zusammengehörige Daten lokal zusammenfassen:
Wenn Daten, die häufig zusammen verwendet werden, lokal zusammengefasst werden, kann die Leistung erheblich verbessert werden. Das ist wie das Sortieren von Büchern in einer Bibliothek: Wenn alle Bücher zu einem Thema in einem Regal stehen, findest du sie schneller.
Bei Festplatten bedeutet das, dass zusammengehörige Daten in benachbarten Sektoren oder Blöcken gespeichert werden sollten. Dadurch werden die Zugriffszeiten reduziert, da der Schreib-/Lesekopf weniger bewegt werden muss.
2. Disk-Scheduling-Strategien:
Wenn mehrere konkurrierende Aufträge gleichzeitig auf die Festplatte zugreifen wollen, muss die Bearbeitungsreihenfolge optimiert werden. Das geschieht durch Disk-Scheduling-Strategien:
First-Come, First-Served (FCFS): Aufträge werden in der Reihenfolge bearbeitet, in der sie eintreffen. Es ist wie eine Warteschlange an der Kasse.
Shortest Seek Time First (SSTF): Der Auftrag mit der kürzesten Zugriffszeit wird zuerst bearbeitet. Es ist, als ob du zuerst die Bücher holst, die am nächsten liegen.
SCAN (Elevator Algorithm): Der Schreib-/Lesekopf bewegt sich in eine Richtung und bearbeitet alle Aufträge auf dem Weg. Dann kehrt er um und bearbeitet die Aufträge in der entgegengesetzten Richtung. Es ist wie ein Aufzug, der in einem Gebäude auf und ab fährt.
C-SCAN: Ähnlich wie SCAN, aber der Kopf kehrt sofort zum Anfang zurück, nachdem er das Ende erreicht hat, ohne Aufträge auf dem Rückweg zu bearbeiten.
Häufig zusammen genutzte Daten sollten in benachbarten Speicherbereichen gespeichert werden, um die Zugriffszeiten zu reduzieren.
FCFS: Aufträge werden in der Reihenfolge ihrer Ankunft bearbeitet.
SSTF: Der Auftrag mit der kürzesten Zugriffszeit wird zuerst bearbeitet.
SCAN: Der Schreib-/Lesekopf bewegt sich in eine Richtung und bearbeitet Aufträge auf dem Weg.
C-SCAN: Wie SCAN, aber der Kopf kehrt sofort zum Anfang zurück.
Welche Disk-Scheduling-Strategien kennen Sie?
FCFS (First-Come, First-Served):
Funktionsweise: Die Aufträge werden in der Reihenfolge ihres Eingangs bearbeitet. Es ist wie eine Warteschlange an der Kasse: Wer zuerst kommt, wird zuerst bedient.
Vorteile:
Einfach zu implementieren: Keine komplexe Logik erforderlich.
Nachteile:
Ineffizient: Lange Wartezeiten, wenn sich die Aufträge über die gesamte Platte verteilen.
SSTF (Shortest-Seek-Time-First):
Funktionsweise: Der Auftrag mit der kürzesten Zugriffszeit wird als Nächstes bearbeitet. Der Schreib-/Lesekopf bewegt sich zur nächstgelegenen Spur. Es ist, als ob du zuerst die Bücher holst, die am nächsten liegen.
Effizient: Reduziert die durchschnittliche Zugriffszeit.
Starvation (Verhungern): Aufträge, die weiter entfernt sind, könnten nie bearbeitet werden.
Lösung: Priorisierung und Aging (Wartezeitabhängige Prioritätsanpassung).
SCAN (Elevator Algorithm):
Funktionsweise: Der Schreib-/Lesekopf bewegt sich abwechselnd von außen nach innen und von innen nach außen über die gesamte Platte. Dabei werden alle Aufträge bearbeitet, deren Spuren überquert werden. Es ist wie ein Aufzug, der in einem Gebäude auf und ab fährt und dabei alle Haltestellen bedient.
Fair: Alle Aufträge werden irgendwann bearbeitet.
Aufträge werden in der Reihenfolge ihres Eingangs bearbeitet.
Der Auftrag mit der kürzesten Zugriffszeit wird als Nächstes bearbeitet.
Starvation wird durch Priorisierung und Aging vermieden.
Der Schreib-/Lesekopf bewegt sich abwechselnd von außen nach innen und von innen nach außen und bearbeitet dabei alle Aufträge auf dem Weg.
Wie sieht die Speicherhierarchie aus? Welche Eigenschaft hat sie? Was versteht man unter dem Begriff „Cache Modell“?
Das Computerspeicher-System ist wie eine Hierarchie von Schichten, bei der jede Schicht schneller, aber teurer ist als die nächste. Jede Schicht dient als Cache für die darunterliegende, langsamere Schicht. Hier ist, wie es funktioniert:
1. Prozessor(CPU)-Register:
Schnell, aber sehr teuer: Die Register sind die schnellste Speicherebene und befinden sich direkt im Prozessor. Sie speichern die Daten, die der Prozessor gerade verarbeitet. Es ist wie ein Arbeitsplatz auf deinem Schreibtisch, auf dem du die wichtigsten Dinge ablegst.
2. Cache:
Temporale und räumliche Lokalität: Der Cache nutzt die Tatsache, dass Programme oft auf dieselben oder benachbarte Daten zugreifen.
Cache-Management:
Auslagerungsalgorithmus: Entscheidet, welche Daten im Cache bleiben und welche entfernt werden (z. B. LRU – Least Recently Used).
Cache-Konsistenz: Da der Cache eine Kopie der Daten aus dem Hauptspeicher enthält, müssen Unterschiede zwischen Original und Kopie verwaltet werden.
3. Hauptspeicher (RAM):
Flüchtig und manchmal knapp: Der Hauptspeicher ist schneller als der Sekundärspeicher, aber die Daten gehen bei Stromausfall verloren. Es ist wie ein großer Tisch, auf dem du viele Dokumente ablegen kannst, aber sie verschwinden, wenn das Licht ausgeht.
4. Sekundärspeicher:
HDD (Festplatte) oder SSD (Solid State Disk): Diese Speicher sind langsamer als der Hauptspeicher, aber die Daten bleiben auch nach dem Ausschalten des Computers erhalten. Es ist wie ein Schrank, in dem du wichtige Dokumente aufbewahrst.
5. Tertiärspeicher:
Magnetband, CD-ROM, DVD, Diskette, USB, externe Festplatte: Diese Speicher sind billig, lagerbar und transportierbar, aber sie sind langsam und oft nur sequentiell zugreifbar (z. B. Magnetbänder). Sie werden für Backups und Langzeitarchivierung verwendet. Es ist wie ein Archivraum, in dem du alte Dokumente aufbewahrst, die du selten brauchst.
Speicherhierarchie:
Prozessorregister: Schnell, teuer, direkt im Prozessor.
Cache: Nutzt temporale und räumliche Lokalität, verwaltet Kopien der Hauptspeicherdaten.
Hauptspeicher (RAM): Flüchtig, schneller Zugriff, begrenzte Kapazität.
Sekundärspeicher: HDD oder SSD, dauerhafte Speicherung.
Tertiärspeicher: Magnetband, CD-ROM, USB, externe Festplatte – billig, lagerbar, langsam.
Wie ist ein Computersystem strukturiert? Wie wirken die Hardware-Komponenten und Geräte zusammen? Wie kommuniziert die CPU mit einem Gerät? Wie kommuniziert der Treiber mit dem Controller? Welche Register hat der Controller?
Ein Computersystem ist wie ein Netzwerk von Komponenten, die über einen Bus miteinander verbunden sind. Hier ist, wie es funktioniert:
Bus-System:
Datenbus, Adressbus und Protokoll:
Der Bus ist wie eine Datenautobahn, die die CPU, den Hauptspeicher und die Geräte-Controller verbindet.
Der Adressbus gibt an, wohin die Daten gehen sollen, und der Datenbus transportiert die Daten selbst.
Das Protokoll definiert, wie die Kommunikation abläuft – es ist wie die Verkehrsregeln auf der Autobahn.
Geräte-Controller:
Jeder Geräte-Controller steuert die eigentliche Geräte-Hardware an, z. B. eine Festplatte oder eine Tastatur.
Vier Register-Typen:
Kontrollregister: Steuert das Gerät (z. B. „Starte Lesevorgang“).
Statusregister: Zeigt den aktuellen Zustand des Geräts an (z. B. „Beschäftigt“ oder „Fertig“).
Dateneingangsregister/-puffer: Empfängt Daten vom Gerät.
Datenausgangsregister/-puffer: Sendet Daten an das Gerät.
Parallelarbeit und Bus-Master:
Die CPU und die Controller arbeiten parallel, aber zu einem bestimmten Zeitpunkt kann immer nur einer den Bus als Bus-Master nutzen. Es ist, als ob nur ein Auto gleichzeitig auf einer einspurigen Brücke fahren kann.
Gerätetreiber:
Das Betriebssystem kommuniziert mit den Controllern über Gerätetreiber (Device Driver).
Speicherabgebildete I/O (Memory-Mapped I/O):
Die Register des Controllers werden wie Speicherzellen behandelt. Dies „verschwendet“ zwar Adressraum, macht aber die Verwendung von höheren Programmiersprachen möglich.
Port-basierte I/O:
Spezielle CPU-Befehle werden verwendet, um auf die Controller-Register zuzugreifen.
Bus-System: Verbindet CPU, Hauptspeicher und Geräte-Controller über Datenbus, Adressbus und ein Protokoll.
Geräte-Controller: Steuern die Geräte-Hardware und haben vier Register-Typen:
Kontrollregister, Statusregister, Dateneingangsregister, Datenausgangsregister.
Bus-Master: Nur eine Komponente (CPU oder Controller) kann den Bus gleichzeitig nutzen.
Gerätetreiber: Das Betriebssystem kommuniziert mit Controllern über spezialisierte Treiber.
Speicherabgebildete I/O: Controller-Register werden wie Speicherzellen behandelt, was höhere Programmiersprachen ermöglicht.
Was ist memory-mapped I/O?
Bei der speicherabgebildeten I/O (Memory-Mapped I/O) werden die Register des Geräte-Controllers wie Teile des Hauptspeichers behandelt. Das bedeutet:
Adressierung: Die Register des Controllers erhalten Speicheradressen, genau wie normale Speicherzellen. Es ist, als ob du die Schubladen eines Schranks (Hauptspeicher) und die Knöpfe einer Maschine (Controller-Register) mit denselben Nummern versehen würdest.
Gerätetreiber: Der auf der CPU laufende Gerätetreiber kann auf diese Register zugreifen, indem er einfach die entsprechenden Speicheradressen verwendet. Es ist, als ob du direkt in die Schublade greifst, um die Maschine zu steuern.
Bus-Nutzung: Der Bus wird für den Datenaustausch zwischen der CPU und den Controller-Registern verwendet. Es ist, als ob du eine Brücke (Bus) nutzt, um zwischen deinem Schreibtisch (CPU) und dem Schrank (Controller) hin und her zu gehen.
Einfache Programmierung: Höhere Programmiersprachen können verwendet werden, da die Register wie Speicherzellen behandelt werden.
Flexibilität: Der Zugriff auf die Controller-Register ist genauso einfach wie der Zugriff auf den Hauptspeicher.
Adressraumverbrauch: Die Adressen der Controller-Register „belegen“ einen Teil des Adressraums, der sonst für den Hauptspeicher verwendet werden könnte.
Bei speicherabgebildeter I/O werden die Register des Geräte-Controllers wie Teile des Hauptspeichers adressiert.
Der Gerätetreiber kann die Register durch direkte Adressierung über den Bus ansteuern.
Vorteile: Einfache Programmierung, Flexibilität.
Nachteile: Verbraucht Adressraum.
Welche Modelle und Konzepte liegen dieser Geräte-Anbindung zugrunde? Wenn man über ein Ein-/Ausgabegerät spricht, meint man eigentlich ein virtuelles Gerät, warum? Was ist ein virtuelles Gerät? Welche Teile hat ein virtuelles Gerät?
Durch die Konzepte Abstraktion, Kapselung und Schichtenmodellierung wird ein physisches Gerät in eine vereinfachte Form gebracht, die leicht durch ein Programm angesprochen werden kann. Dieses vereinfachte Modell nennt man ein „virtuelles Gerät“.
Schichten eines virtuellen Geräts:
Geräte-Mechanik:
Dies ist die physische Hardware des Geräts, z. B. die beweglichen Teile einer Festplatte oder die Tasten einer Tastatur. Es ist wie das „Fleisch und Blut“ des Geräts.
Controller-Elektronik:
Der Controller ist die elektronische Steuerungseinheit, die die Mechanik des Geräts verwaltet. Er übersetzt die Befehle des Betriebssystems in Aktionen der Geräte-Mechanik. Es ist wie das „Gehirn“ des Geräts.
Betriebssystem-Gerätetreiber:
Der Gerätetreiber ist die Software, die das Betriebssystem verwendet, um mit dem Controller zu kommunizieren. Er abstrahiert die Komplexität der Hardware und bietet eine einfache Schnittstelle für Programme. Es ist wie ein Dolmetscher, der die Sprache des Betriebssystems in die Sprache des Controllers übersetzt.
Physische Geräte-Hardware:
Die tatsächliche Hardware besteht nur aus den beiden unteren Schichten: Geräte-Mechanik und Controller-Elektronik.
Das Betriebssystem und die Programme interagieren jedoch mit dem virtuellen Gerät, das durch die drei Schichten repräsentiert wird.
Abstraktion: Die Komplexität der Hardware wird versteckt, sodass Programme einfach mit dem Gerät interagieren können.
Kapselung: Änderungen an der Hardware (z. B. ein neuer Controller) beeinflussen nicht die Programme, solange die Schnittstelle des virtuellen Geräts gleich bleibt.
Schichtenmodellierung: Jede Schicht hat eine klare Aufgabe, was die Entwicklung und Wartung vereinfacht.
Ein virtuelles Gerät besteht aus drei Schichten:
Geräte-Mechanik: Physische Hardware.
Controller-Elektronik: Steuert die Mechanik.
Betriebssystem-Gerätetreiber: Software, die die Hardware abstrahiert.
Die physische Hardware umfasst nur die Mechanik und den Controller.
Vorteile: Abstraktion, Kapselung, Schichtenmodellierung.
Was ist der Vorteil des Schichtenmodells?
Die Schichtenarchitektur macht die Implementierung einer einzelnen Schicht einfach und überschaubar, weil:
Klare Schnittstellen:
Jede Schicht muss nur die Schnittstellen zur nächsthöheren und zur nächsttieferen Schicht implementieren. Es ist, als ob du nur die Türen zu den Nachbarräumen kennen musst, ohne zu wissen, was dahinter passiert.
Die Kommunikation zwischen den Schichten ist klar definiert, was die Entwicklung und Wartung vereinfacht.
Kapselung (Geheimnisprinzip):
Jede Schicht hat eine klar umrissene Aufgabe, die sie intern löst. Die Details der Implementierung sind nach außen hin verborgen. Es ist, als ob jede Schicht eine „Black Box“ ist, die nur bestimmte Ein- und Ausgaben hat.
Dies schützt die Schicht vor falscher oder missbräuchlicher Nutzung durch andere Schichten.
Abstraktion:
Durch die Schichtenarchitektur wird die Komplexität reduziert. Jede Schicht bietet eine abstrakte Sicht auf die darunterliegende Schicht, sodass die höheren Schichten nicht mit den Details der tieferen Schichten belastet werden.
Einfache Änderungen:
Da die Verantwortlichkeiten klar abgegrenzt sind, können Änderungen in einer Schicht vorgenommen werden, ohne die anderen Schichten zu beeinflussen. Es ist, als ob du ein Stockwerk eines Hauses renovierst, ohne die anderen Stockwerke zu stören.
Schichtenarchitektur vereinfacht die Implementierung durch:
Klare Schnittstellen: Nur die Kommunikation mit der nächsthöheren und nächsttieferen Schicht muss realisiert werden.
Kapselung: Jede Schicht hat eine klar definierte Aufgabe, und die Implementierungsdetails sind verborgen.
Abstraktion: Höhere Schichten müssen die Details der tieferen Schichten nicht kennen.
Einfache Änderungen: Verantwortlichkeiten sind klar abgegrenzt, was Änderungen erleichtert.
Welche Aufgaben haben die Teile eines virtuellen Gerätes?
Ein virtuelles Gerät besteht aus drei Schichten, die zusammenarbeiten, um die Komplexität der Hardware zu verbergen und die Steuerung zu vereinfachen:
Diese Schicht realisiert die „Physik“ des Geräts, d. h. die physische Hardware wie Motoren, Sensoren oder Tasten. Es ist wie das „Fleisch und Blut“ des Geräts.
Controller:
Treiber:
Das Betriebssystem steuert die Geräte, indem es mit den Controllern kommuniziert. Da jeder Controller anders ist, gibt es für jeden Controller einen eigenen Gerätetreiber.
Anwendungsprogramme und andere Teile des Betriebssystems können nur über den Gerätetreiber auf das Gerät zugreifen. Der Treiber ist wie ein Dolmetscher, der die Sprache des Betriebssystems in die Sprache des Controllers übersetzt.
Um die Karteikarte richtig zu lösen, muss die Antwort mindestens folgende Punkte enthalten:
Geräte-Mechanik: Realisiert die physische Hardware des Geräts.
Controller: Steuert die elektromechanische Hardware des Geräts.
Treiber: Das Betriebssystem kommuniziert über spezielle Gerätetreiber mit den Controllern.
Zugriff: Anwendungsprogramme und das Betriebssystem greifen nur über den Gerätetreiber auf das Gerät zu.
Was sind die Vorteile eines virtuellen Gerätes bzw. des virtuellen Modells?
Die Abstraktion, Kapselung und Schichtenmodellierung entlasten die CPU und vereinfachen den Zugriff auf Geräte erheblich. Hier ist, wie das funktioniert:
Entlastung der CPU:
Durch die Schichtenarchitektur wird die CPU von der direkten Steuerung der Geräte befreit. Stattdessen übernehmen Controller und Gerätetreiber diese Aufgaben. Es ist, als ob du einen Assistenten hast, der sich um die Details kümmert, während du dich auf die wichtigsten Aufgaben konzentrieren kannst.
Vereinfachung des Gerätezugriffs:
Abstraktion: Jede Schicht bietet eine vereinfachte Sicht auf die darunterliegende Schicht. Programme müssen nicht wissen, wie die Hardware funktioniert – sie interagieren nur mit der obersten Schicht.
Kapselung: Jede Schicht hat eine klar umrissene Aufgabe, und die Implementierungsdetails sind nach außen verborgen. Dies schützt vor falschem Zugriff und ermöglicht modulare Austauschbarkeit. Es ist, als ob du ein Auto fährst, ohne zu wissen, wie der Motor funktioniert.
Einfacher Entwurf von Treibern und Kommunikations-Stacks:
Da jede Schicht nur eine Teilaufgabe hat, wird der Entwurf von Treibern oder Kommunikations-Stacks vereinfacht. Es ist, als ob du ein Haus in einzelne Räume unterteilst, die unabhängig voneinander gestaltet werden können.
Zugriffsschutz und Austauschbarkeit:
Die Kapselung sorgt dafür, dass nur die definierten Schnittstellen genutzt werden können. Dies schützt vor Fehlern und ermöglicht es, Geräte oder Komponenten auszutauschen, ohne das gesamte System zu ändern. Es ist, als ob du ein defektes Teil in einem Auto einfach austauschen kannst, ohne das ganze Auto auseinanderzunehmen.
Entlastung der CPU: Controller und Treiber übernehmen die Gerätesteuerung.
Vereinfachung des Gerätezugriffs: Abstraktion und Kapselung verbergen die Komplexität der Hardware.
Klar umrissene Teilaufgaben: Jede Schicht hat eine spezifische Funktion, was den Entwurf von Treibern und Kommunikations-Stacks vereinfacht.
Zugriffsschutz und Austauschbarkeit: Kapselung schützt vor falschem Zugriff und ermöglicht modulare Austauschbarkeit.
Klassifizieren sie die E/A-Software-Komponenten!
Die Ein-/Ausgabe-Software ist in ein Schichtenmodell unterteilt, das die Komplexität der Gerätesteuerung vereinfacht. Die drei Schichten sind:
Geräteunabhängige Software-Anteile:
Diese Schicht ist für allgemeine Aufgaben zuständig, die für alle Geräte gleich sind. Dazu gehören:
Puffer im Hauptspeicher reservieren: Es wird Speicherplatz für die Daten bereitgestellt, die zwischen dem Gerät und dem System ausgetauscht werden.
Gerätenamen auf Nummern abbilden: Geräte werden durch eindeutige Nummern identifiziert, um sie einfach anzusprechen.
Fehler behandeln: Es werden Fehler erkannt und behandelt, z. B. wenn ein Gerät nicht antwortet.
Exklusive Benutzung synchronisieren: Es wird sichergestellt, dass nur ein Prozess gleichzeitig auf ein Gerät zugreifen kann.
Geräteabhängiger Gerätetreiber:
Diese Schicht ist spezifisch für jedes Gerät und steuert die Controller-Elektronik. Der Treiber übersetzt die allgemeinen Befehle der geräteunabhängigen Schicht in gerätespezifische Anweisungen. Es ist wie ein Dolmetscher, der die Sprache des Betriebssystems in die Sprache des Geräts übersetzt.
Unterbrechungsroutinen:
Diese Schicht behandelt Unterbrechungen (Interrupts), die von den Geräten ausgelöst werden, z. B. wenn ein Gerät eine Aufgabe abgeschlossen hat. Die Unterbrechungsroutinen sorgen dafür, dass die CPU schnell auf diese Ereignisse reagieren kann.
Geräteunabhängige Software-Anteile: Puffer reservieren, Gerätenamen auf Nummern abbilden, Fehler behandeln, exklusive Benutzung synchronisieren.
Geräteabhängiger Gerätetreiber: Steuert die gerätespezifische Hardware.
Unterbrechungsroutinen: Behandeln Interrupts, die von den Geräten ausgelöst werden.
Sollte man die Funktionalität eines virtuellen Gerätes eher in der Controller-Hardware oder eher im korrespondierenden Treiber (in der Software) realisieren?
Die Wahl zwischen Hardware- und Software-Implementierung hängt von den Anforderungen an Effizienz, Flexibilität und Komplexität ab:
Implementierung in Hardware:
Effizienz: Hardware-Lösungen sind in der Regel schneller und energieeffizienter als Software-Lösungen, da sie spezialisierte Schaltkreise verwenden, die genau auf eine Aufgabe zugeschnitten sind. Es ist, als ob du einen speziellen Werkzeugkasten hast, der genau das richtige Werkzeug für die Aufgabe bereithält.
Abstraktion: Die Details der Implementierung werden in der Hardware verborgen, was die Nutzung für Software vereinfacht. Es ist, als ob du ein Auto fährst, ohne zu wissen, wie der Motor funktioniert.
Implementierung in Software:
Flexibilität: Software-Lösungen sind einfacher zu ändern und anzupassen. Wenn sich die Anforderungen ändern, kann die Software aktualisiert werden, ohne die Hardware zu modifizieren. Es ist, als ob du ein Dokument bearbeitest, anstatt eine Maschine umzubauen.
Weniger Aufwand: Die Entwicklung von Software erfordert oft weniger Ressourcen als die Herstellung von Hardware. Es ist, als ob du ein Rezept änderst, anstatt eine neue Küche zu bauen.
Hardware-Implementierung: Effizienter, da spezialisierte Schaltkreise verwendet werden, und abstrahiert die Details.
Software-Implementierung: Flexibler und einfacher zu ändern, erfordert weniger Aufwand.
Was passiert bei einem Gerätezugriff nachdem der Gerätetreiber den Auftrag dazu bekommen hat? (die Frage ist als Motivation für Polling bzw. Interrupt gemeint)
Die Kommunikation zwischen dem Treiber und dem Controller läuft in mehreren Schritten ab:
Auftragserteilung:
Der Treiber sendet über den Bus einen Kommando-Befehl an das Kontrollregister des Controllers. Es ist, als ob du einem Assistenten eine Aufgabe gibst, die er erledigen soll.
Auftragsdurchführung:
Der Controller führt den Auftrag auf der Hardware aus. Wenn der Auftrag abgeschlossen ist, liegen die Ergebnisse (z. B. gelesene Daten) im Datenausgangsregister/-puffer des Controllers. Es ist, als ob der Assistent die Aufgabe erledigt und das Ergebnis auf deinen Schreibtisch legt.
Fertigstellungsmeldung:
Der Controller muss dem Treiber mitteilen, dass der Auftrag abgeschlossen ist. Dies kann auf zwei Arten geschehen:
Polling (Abfragebetrieb):
Die CPU fragt periodisch das Statusregister des Controllers ab, um zu prüfen, ob der Auftrag fertig ist. Dies ist jedoch ineffizient, besonders in Multi-Tasking-Systemen, da die CPU Zeit mit dem Abfragen verbringt und dabei Prozesskontext-Wechsel erforderlich sind. Es ist, als ob du ständig nachschaust, ob der Assistent fertig ist, anstatt dich auf andere Aufgaben zu konzentrieren.
Unterbrechung (Interrupt):
Mit Hardware-Unterstützung kann der Controller eine Unterbrechung anfordern, sobald der Auftrag fertig ist. Die CPU unterbricht dann ihre aktuelle Arbeit und reagiert zeitnah auf das Fertigstellungs-Ereignis. Es ist, als ob der Assistent dich anruft, sobald er fertig ist, sodass du sofort reagieren kannst.
Auftragserteilung: Der Treiber sendet einen Befehl an das Kontrollregister des Controllers.
Auftragsdurchführung: Der Controller führt den Auftrag aus und legt die Ergebnisse im Datenausgangsregister ab.
Polling: Die CPU fragt periodisch das Statusregister ab (ineffizient bei Multi-Tasking).
Unterbrechung: Der Controller löst eine Unterbrechung aus, um die CPU zu benachrichtigen (effizienter).
Was ist ein Interrupt? Warum brauchen wir den Unterbrechungsmechanismus?
Unterbrechungen (Interrupts) sind ein wichtiger Mechanismus, um auf unvorhergesehene Ereignisse zu reagieren oder die Kontrolle an das Betriebssystem zu übergeben. Es gibt verschiedene Arten von Unterbrechungen:
Software-Traps (System Calls):
Dies sind absichtlich ausgelöste Unterbrechungen, die von Programmen verwendet werden, um Betriebssystemdienste anzufordern. Es ist, als ob du den Lehrer fragst, ob du auf die Toilette gehen darfst.
Software-Interrupts (Exceptions):
Diese werden durch Fehler im Programm ausgelöst, z. B. eine Division durch Null oder ein Page Fault (Seitenfehler). Sie werden auch als „Ausnahmen“ bezeichnet. Es ist, als ob du beim Rechnen einen Fehler machst und der Lehrer eingreifen muss.
Hardware-Interrupts:
Diese werden durch externe Ereignisse außerhalb der CPU ausgelöst, z. B. durch ein Gerät, das eine Aufgabe abgeschlossen hat. Die Signale werden von einem Interrupt-Controller priorisiert und an die CPU weitergeleitet. Es ist, als ob ein Alarm ertönt und du sofort reagieren musst.
Verwendung von Interrupts:
Präemptives Multitasking:
Interrupts können verwendet werden, um Prozesskontext-Wechsel zu erzwingen und die Kontrolle an das Betriebssystem zu übergeben. Auch in einem präemptiven System sollten Prozesse kooperativ sein und sich z. B. freiwillig von „rechnend“ nach „bereit“ wechseln.
Atomare Abschnitte:
Bei Single-Core-Prozessoren können atomare Abschnitte (ununterbrechbare Codeabschnitte) durch kurzes Sperren von Interrupts realisiert werden. Besser sind jedoch spezielle CPU-Instruktionen, die atomare Operationen garantieren.
Software-Traps (System Calls): Absichtlich ausgelöste Unterbrechungen für Betriebssystemaufrufe.
Software-Interrupts (Exceptions): Durch Programmfehler ausgelöste Unterbrechungen, z. B. Division durch Null.
Hardware-Interrupts: Durch externe Ereignisse ausgelöste Unterbrechungen, priorisiert durch den Interrupt-Controller.
Präemptives Multitasking: Interrupts erzwingen Prozesskontext-Wechsel.
Atomare Abschnitte: Kurzes Sperren von Interrupts oder spezielle CPU-Instruktionen.
Wie kann z.B. die CPU wissen, welcher Leseauftrag fertig ist?
Der Interrupt-Controller ist die Schaltzentrale für Unterbrechungen und sorgt dafür, dass die CPU effizient auf wichtige Ereignisse reagieren kann.
Er ist mit verschiedenen Geräte-Controllern verbunden, die Unterbrechungen auslösen können.
Mehrere Leitungen verbinden ihn mit der CPU:
Unterbrechungseingang: Signalisiert der CPU, dass ein Ereignis ihre Aufmerksamkeit benötigt.
Bestätigungsleitung: Die CPU teilt mit, dass sie die Unterbrechung registriert hat.
Unterbrechungsnummern-Leitungen: Übermitteln eine Nummer, die genau angibt, welches Gerät oder welches Ereignis die Unterbrechung ausgelöst hat.
So kann die CPU gezielt auf wichtige Ereignisse reagieren, ohne ständig nachfragen zu müssen!
Der Interrupt-Controller verbindet die CPU mit den Ein-/Ausgabegeräten und meldet wichtige Ereignisse.
Eine Leitung meldet der CPU, dass etwas passiert ist.
Eine Leitung bestätigt, dass die CPU die Meldung erhalten hat.
Mehrere Leitungen übertragen eine Nummer, die zeigt, welches Gerät oder Ereignis die Unterbrechung ausgelöst hat.
So muss die CPU nicht ständig nachfragen, sondern wird automatisch benachrichtigt.
Woher weiß der Interrupt-Handler, wer den Interrupt ausgelöst hat?
Die CPU kann herausfinden, welches Gerät eine Unterbrechung ausgelöst hat, auf zwei Arten:
Direkte Übermittlung:
Der Interrupt-Controller sendet die Unterbrechungsnummer direkt an die CPU über spezielle Eingänge oder Register.
So weiß die CPU sofort, welches Gerät Aufmerksamkeit benötigt.
Abfrage der Geräte (Polling):
Die Interrupt Service Routine (ISR) kann die Statusregister der Controller einmalig abfragen.
Das bedeutet, die CPU fragt jedes Gerät, ob es die Unterbrechung ausgelöst hat.
Die erste Methode ist schneller, die zweite flexibler!
Die CPU kann herausfinden, welches Gerät eine Unterbrechung ausgelöst hat:
Direkt: Die Unterbrechungsnummer wird über Register oder CPU-Eingänge übermittelt.
Indirekt: Die CPU fragt die Statusregister der Geräte nacheinander ab.
Die direkte Methode ist schneller, die indirekte universeller.
Warum sind Interrupts für das BS wichtig? Wer löst Interrupts aus?
Interrupts sind das Rückgrat moderner Computersysteme – sie ermöglichen es dem Betriebssystem, die Kontrolle zu behalten und effizient auf Ereignisse zu reagieren.
Hardware-Interrupts: Geräte-Controller melden externe Ereignisse, z. B. eine Tasteneingabe oder eine Netzwerknachricht.
Software-Exceptions: Die CPU erkennt Fehler in Programmen und meldet sie an das Betriebssystem.
System Calls („SW-Traps“): Programme rufen gezielt Betriebssystemfunktionen auf, z. B. um Dateien zu speichern.
Hardware-Timer-Interrupts: Ermöglichen präemptives Scheduling, sodass das Betriebssystem laufende Programme unterbrechen und andere starten kann.
Zusätzlich arbeiten Interrupts mit Speicherschutzmechanismen, privilegierten Befehlen und Zeitgebern zusammen, um das System sicher und stabil zu halten. Ohne Interrupts wäre ein modernes Betriebssystem nicht denkbar!
Interrupts helfen dem Betriebssystem, die Kontrolle über den Computer zu behalten.
Geräte-Interrupts: Externe Ereignisse (z. B. Mausbewegung) melden sich.
Fehlermeldungen: Die CPU erkennt Software-Probleme.
System Calls: Programme rufen Betriebssystem-Funktionen auf.
Timer-Interrupts: Steuern, welches Programm wann läuft.
Zusammen mit Schutzmechanismen sorgen Interrupts dafür, dass der Computer sicher und effizient arbeitet.
Wie wird das Konzept der „Programmierschnittstelle“ im Betriebssystem realisiert bzw. implementiert? Was ist ein „system call“?
Software-Traps sind geplante Unterbrechungen, mit denen Programme das Betriebssystem um Hilfe bitten.
Wenn ein Programm eine Software-Trap auslöst, übergibt es die Kontrolle an das Betriebssystem.
Das Betriebssystem führt dann eine spezielle Interrupt-Routine im System-Modus aus.
Alle Systemaufrufe zusammen bilden die Programmierschnittstelle des Betriebssystems – sie erlaubt Programmen, auf wichtige Funktionen wie Dateisysteme, Speicherverwaltung oder Netzwerkdienste zuzugreifen.
Auch Systemprogramme wie die Shell nutzen diese Schnittstelle, um Befehle auszuführen und mit dem Benutzer zu interagieren.
Ohne Software-Traps könnten Programme nicht sicher und standardisiert mit dem Betriebssystem kommunizieren!
Programme können das Betriebssystem gezielt um Hilfe bitten, indem sie Software-Traps auslösen.
Das Betriebssystem übernimmt kurzzeitig die Kontrolle.
Es führt spezielle Befehle im System-Modus aus.
Dadurch können Programme auf wichtige Funktionen wie Dateien speichern oder Prozesse starten zugreifen.
Auch die Shell nutzt diese Befehle, um mit dem Benutzer zu kommunizieren.
So können Programme sicher und einfach mit dem Betriebssystem arbeiten.
Welche Aufgabe hat das Betriebssystem bei einer Unterbrechung? Warum sagt man, daß durch die Unterbrechung das Betriebssystem „aktiviert“ wird?
Wenn ein Programm einen System Call ausführt, wird eine spezielle Unterbrechungsroutine im Kernel-Modus des Betriebssystems gestartet.
Jeder System Call hat eine Aufruf-ID, damit das Betriebssystem genau weiß, welche Funktion ausgeführt werden soll (z. B. Datei öffnen, Prozess starten).
Durch diesen Mechanismus kann das Betriebssystem jederzeit die Kontrolle zurückgewinnen, selbst wenn ein Programm abstürzt oder fehlerhaft ist.
Neben Interrupts sorgen auch Speicherschutzmechanismen, privilegierte Befehle und Zeitgeber dafür, dass das Betriebssystem die volle Kontrolle über das System behält.
Ohne diesen Schutz könnte ein fehlerhaftes Programm das gesamte System instabil machen!
Ein System Call ruft eine spezielle Kernel-Funktion auf, die das Betriebssystem steuert.
Jeder Aufruf hat eine ID, damit das System weiß, was es tun soll.
Das Betriebssystem gewinnt immer wieder die Kontrolle zurück, damit Programme das System nicht durcheinanderbringen.
Interrupts, Speicherschutz und Zeitgeber helfen dabei, das System stabil und sicher zu halten.
So bleibt der Computer zuverlässig und geschützt.
Wie funktioniert ein Systemaufruf?
Jedes Mal, wenn ein Programm eine Funktion des Betriebssystems nutzen will – zum Beispiel eine Datei öffnen oder Daten speichern – führt es einen System Call aus.
System Calls sind Funktionsaufrufe, die eine Programmierschnittstelle zwischen Programmen und dem Betriebssystem bilden.
Parameter für den Aufruf können auf drei Arten übergeben werden:
Auf dem Stack des Prozesses,
Direkt in CPU-Registern,
Indirekt per Speicheradresse.
Sobald die Parameter bereit sind, löst der System Call eine spezielle „trap“-Instruktion aus.
Diese trap wechselt in den Systemmodus und ruft den gewünschten Systemdienst auf.
Nach der Ausführung kehrt das Programm wieder in seinen ursprünglichen Modus zurück (Benutzermodus oder Systemmodus).
Ohne System Calls könnten Programme nicht sicher mit dem Betriebssystem interagieren!
Programme nutzen System Calls, um Dienste des Betriebssystems zu verwenden, z. B. um Dateien zu öffnen oder Daten zu speichern.
Ein System Call ist wie eine Funktion, die das Betriebssystem aufruft.
Parameter können auf drei Arten übergeben werden:
Über den Stack,
Indirekt durch eine Speicheradresse.
Der Aufruf geschieht durch eine spezielle trap-Instruktion, die das Betriebssystem aktiviert.
Nach der Ausführung läuft das Programm normal weiter.
So können Programme sicher mit dem Betriebssystem zusammenarbeiten.
Warum muß der laufende Prozess gerettet werden, bevor eine Unterbrechung bearbeitet werden soll?
Wenn eine Unterbrechung (Interrupt) auftritt, speichert das System eine Kopie des aktuellen Zustands.
Dazu gehören wichtige Daten wie der Programmzähler (wo das Programm gerade war) und der Modus (Benutzermodus oder Systemmodus).
Nach der Bearbeitung des Interrupts kann das System den ursprünglichen Zustand genau wiederherstellen.
So kann das unterbrochene Programm genau da weitermachen, wo es gestoppt wurde, ohne Fehler oder Datenverlust.
Ohne diese Sicherung würde jede Unterbrechung das Programm durcheinanderbringen!
Bei einer Unterbrechung speichert das System eine Kopie des aktuellen Zustands.
Es merkt sich, wo das Programm war und in welchem Modus es lief.
Danach kann das System diesen Zustand wiederherstellen, sodass das Programm genau dort weitermacht.
So bleibt alles stabil und funktioniert reibungslos.
Angenommen, es gäbe keine Interrupts, welche Alternative hätte man?
Stell dir vor, du fragst ständig nach, ob dein Paket angekommen ist – genau so funktioniert Polling!
Die CPU gibt dem Controller eine Aufgabe und fragt immer wieder nach, ob sie erledigt ist.
Dieses ständige Nachfragen blockiert Ressourcen und ist ineffizient.
Besonders bei Multitasking-Systemen wäre es problematisch, weil alle Prozesse kooperativ arbeiten müssten, um keine Leistung zu verschwenden.
Eine bessere Lösung sind Interrupts, bei denen der Controller die CPU benachrichtigt, sobald er fertig ist.
Polling ist wie ein ungeduldiges Kind, das jede Minute fragt: „Sind wir schon da?“ – nervig und ineffektiv!
Beim Polling fragt die CPU ständig den Controller: „Bist du fertig?“
Das ist ineffizient, weil die CPU die ganze Zeit wartet.
Bei Multitasking würde das nur funktionieren, wenn alle Programme fair zusammenarbeiten.
Besser ist es, wenn der Controller von selbst Bescheid gibt, sobald er fertig ist (Interrupts).
So kann die CPU in der Zwischenzeit andere Aufgaben erledigen.
Was ist der Nachteil der Polling-Technik? Welche Nachteile hat Polling?
Polling ist wie ein Schüler, der ständig nachsieht, ob die Prüfungsergebnisse online sind – aber sie sind noch nicht da!
Die CPU fragt den Controller immer wieder, ob er fertig ist.
Jede einzelne Abfrage ist zwar schnell, aber wenn das Ergebnis immer „Nein“ ist, wird viel CPU-Zeit verschwendet.
Währenddessen kann entweder kein anderer Prozess laufen oder die CPU muss sich ständig selbst unterbrechen (schlafen legen und später wieder aufwachen).
Das kostet noch mehr Leistung und macht das Timing unregelmäßig.
Besser: Interrupts! Dann meldet sich der Controller von selbst, sobald er fertig ist.
Beim Polling fragt die CPU immer wieder: „Bist du fertig?“
Das geht schnell, aber wenn die Antwort immer „Nein“ ist, wird viel Zeit verschwendet.
Währenddessen kann die CPU nichts anderes tun oder muss sich ständig schlafen legen und wieder aufwachen – das kostet Leistung.
Deshalb sind Interrupts besser, weil der Controller von selbst Bescheid gibt, wenn er fertig ist.
Wozu ist es gut, daß es die zwei Modi User- und Systemmodus gibt?
Stell dir vor, dein Computer hat zwei Räume:
Den sicheren Maschinenraum (Systemmodus) – Nur das Betriebssystem darf hier arbeiten.
Den Nutzerbereich (Benutzermodus) – Hier laufen normale Programme, aber mit eingeschränkten Rechten.
Warum?
Wichtige Befehle, die Speicher oder Geräte direkt steuern, könnten das System beschädigen.
Deshalb gibt es privilegierte Befehle, die nur im Systemmodus ausgeführt werden dürfen.
So bleibt das System stabil und geschützt.
Das ist wie in einem Flugzeug: Passagiere dürfen nicht ins Cockpit – nur die Piloten (Betriebssystem) haben Zugriff auf die Steuerung!
Der Computer schützt wichtige Bereiche, indem er zwei Modi nutzt:
Systemmodus: Nur das Betriebssystem darf hier bestimmte wichtige Befehle ausführen.
Benutzermodus: Normale Programme haben nur begrenzten Zugriff.
Das verhindert, dass Programme den Speicher oder Geräte beschädigen.
Welche hardwarenahen Aktionen passieren bei einer Unterbrechung?
Stell dir vor, der Interrupt-Controller ist der Notruf für die CPU – er ruft an, um mitzuteilen, dass etwas Wichtiges passiert ist. Der Notruf liefert auch gleich die Nummer, um welches Ereignis es sich handelt.
Nachdem die CPU den aktuellen Befehl abgeschlossen hat, speichert sie den aktuellen Zustand (wie das Öffnen einer Akte) und springt zu einer speziellen Notruf-Routine, die genau für dieses Ereignis zuständig ist.
Die Interrupt Service Routine (ISR) wird im Systemmodus ausgeführt, um das Ereignis zu bearbeiten, und die CPU sorgt dafür, dass sie nach der Bearbeitung wieder im gleichen Zustand weiterarbeiten kann wie vorher.
So kann die CPU nach der Abarbeitung wieder zur normalen Arbeit zurückkehren, als ob nichts passiert wäre.
Das ist wie ein Feuerwehr-Einsatz: Der Notruf wird entgegen genommen, der Feuerwehrmann springt sofort in den Einsatz, und nach dem Löschen des Feuers geht er zurück zum normalen Alltag.
Der Interrupt-Controller informiert die CPU über ein Ereignis und liefert eine Ereignis-Nummer.
Die CPU speichert ihren aktuellen Zustand und ruft die richtige Interrupt-Routine auf, um das Ereignis zu bearbeiten.
Nach der Abarbeitung holt die CPU ihren gespeicherten Zustand zurück und setzt das unterbrochene Programm fort.
So kann die CPU auf wichtige Ereignisse reagieren, ohne ihre normale Arbeit ständig zu unterbrechen.
Was passiert bei zeitgleichen Anforderungs-Konflikten?
Stell dir vor, der Interrupt-Controller ist ein Telefonzentrale, die ständig Anrufe entgegennimmt. Doch es gibt Regeln:
Interrupts gesperrt (interrupt disabled) = Die Telefonzentrale nimmt keine Anrufe an, wenn sie gerade in einem wichtigen Gespräch ist. Das wird auch als kritischer Abschnitt bezeichnet – zum Beispiel, wenn die CPU gerade mit einem besonders wichtigen Task beschäftigt ist.
Priorisierung: Manchmal gibt es wichtige Anrufe, die die Leitung blockieren und dafür sorgen, dass weniger wichtige Anrufe warten müssen. Das passiert, wenn die Anrufe priorisiert werden, also je nach Wichtigkeit behandelt werden.
Reentrancy: Falls die Telefonzentrale selbst Anrufe weiterleitet, ohne das Gespräch zu unterbrechen, muss sie doppelt reagieren können (reentrant), um alle Anfragen zu bedienen.
So bleibt die Telefonzentrale organisiert, auch wenn mehrere Anrufe gleichzeitig eingehen.
Interrupts können gesperrt werden, wenn die CPU gerade an etwas Wichtigem arbeitet, damit keine Störungen auftreten.
Ansonsten können wichtige Interrupts höher priorisiert werden und unterbrechen weniger wichtige.
Wenn eine allgemeine Interrupt-Routine verwendet wird, muss sie in der Lage sein, mehrfach zu reagieren, falls mehrere Interrupts gleichzeitig kommen.
Was ist der Unterschied zwischen Hardware- und Software Unterbrechung?
Hardware-Unterbrechung: Wie ein plötzliches Signal von einem externen Gerät – du kannst nicht vorhersehen, wann es kommt, und es passiert einmalig und unerwartet. Zum Beispiel, wenn ein Gerät dir sagt: „Ich bin fertig, du kannst weiterarbeiten!“.
Software-Unterbrechung: Das ist wie ein Geplanter Alarm aus dem Programm heraus – es passiert, weil das Programm es so will und ist in gewisser Weise vorhersehbar, da es durch den Code ausgelöst wird. Zum Beispiel, wenn das Programm sagt: „Ich brauche Hilfe von der Software!“.
Die Hardware-Unterbrechung ist unvorhersehbar und kommt plötzlich, während die Software-Unterbrechung mehr kontrollierbar und geplant ist.
Hardware-Unterbrechung: Wird von einem externen Gerät ausgelöst, ist unvorhersehbar und einmalig.
Software-Unterbrechung: Wird vom Programm selbst ausgelöst, ist vorhersehbar und reproduzierbar.
Was ist der Unterschied zwischen der „programmierten“ Ein-/Ausgabe und DMA?
Unterbrechungsgesteuerte Ein-/Ausgabe: Stellt dir vor, der Controller schickt dir immer wieder kleine Datenstücke, und jedes Mal, wenn eines kommt, ruft er die CPU an, um es zu holen. Das kostet viel Zeit, weil die CPU immer wieder mit dem Transfer beschäftigt ist.
DMA (Direkter Speicherzugriff): Beim DMA übernimmt ein spezialisierter Controller den ganzen Datenumzug zwischen Geräten und Speicher – ohne die CPU ständig zu stören. Die CPU kann in der Zwischenzeit ihre eigenen Aufgaben erledigen. Der DMA-Controller stellt sicher, dass die Daten in Blöcken übertragen werden, und erst wenn alles erledigt ist, meldet er der CPU, dass der Transfer abgeschlossen ist.
Vorteil von DMA: Die CPU wird nicht unnötig mit dem Umkopieren von Daten belastet und kann gleichzeitig andere Aufgaben erledigen. Das macht das System insgesamt effizienter und schneller.
Unterbrechungsgesteuerte Ein-/Ausgabe: Der Controller schickt immer nur kleine Daten und ruft die CPU immer wieder auf, um sie zu holen. Das kostet viel Rechenzeit.
DMA (Direkter Speicherzugriff): Der DMA-Controller kümmert sich darum, Daten direkt vom Gerät in den Speicher zu übertragen, ohne dass die CPU ständig unterbrochen wird. Dadurch kann die CPU andere Aufgaben erledigen, während die Datenübertragung läuft.
Warum wird DMA verwendet?
DMA entlastet die CPU, indem es den Datenverkehr übernimmt. So muss die CPU nicht ständig unterbrochen werden, um Daten zu kopieren, und kann sich anderen Aufgaben widmen. Das sorgt für eine effizientere Nutzung der Rechenleistung.
DMA nimmt der CPU die Arbeit ab, Daten zu kopieren, damit sie sich auf wichtigere Aufgaben konzentrieren kann.
Warum kann DMA die CPU stören?
Der DMA-Controller übernimmt den Datenverkehr, aber da er den Bus für seinen Transfer nutzt, muss die CPU warten, wenn sie währenddessen auf den Speicher zugreifen möchte.
Die CPU muss warten, wenn der DMA-Controller den Bus für die Datenübertragung benutzt.
Beschreiben Sie die Arbeitsweise zwischen DMA und Festplatten-Controller?
Der Treiber gibt dem DMA-Controller die Adresse, Anzahl der Daten und das Gerät an.
Die CPU befiehlt dem Festplatten-Controller, einen Block zu lesen.
Der Festplatten-Controller signalisiert dem DMA-Controller, dass die Daten bereit sind.
Der DMA-Controller fordert das nächste Datenstück an.
Das Datenstück wird in den Hauptspeicher geschrieben und die Adresse sowie die Anzahl werden angepasst.
Wenn alle Daten übertragen wurden, benachrichtigt der DMA-Controller die CPU durch eine Unterbrechung.
Der Treiber gibt dem DMA-Controller die notwendigen Infos.
Die CPU lässt den Festplatten-Controller Daten lesen.
Der Festplatten-Controller sagt dem DMA-Controller, dass die Daten bereit sind.
Der DMA-Controller holt die Daten.
Die Daten werden in den Hauptspeicher kopiert, bis alle übertragen sind.
Der DMA-Controller informiert die CPU, wenn die Übertragung abgeschlossen ist.
Wie viele Register muß der DMA-Controller haben, damit er seine Aufgabe machen kann?
Stell dir vor, der DMA-Controller ist wie ein Logistikmanager, der den Transport von Daten organisiert – er nutzt dafür fünf wichtige „Werkzeuge“ (Register):
Speicheradresse-Register: Dieses Register hält die Adresse im Hauptspeicher, von der aus Daten gelesen oder in die Daten geschrieben werden. Es ist wie die Adresse eines Lagerhauses.
Gerätnummer-Register: Hier wird festgehalten, welches Gerät (z. B. Festplatte) an der Operation beteiligt ist – ähnlich wie die Angabe, welches Lieferfahrzeug unterwegs ist.
Zähler-Register: Dieses Register speichert, wie viele Datenworte noch übertragen werden müssen, vergleichbar mit einer Stückzahl, die geliefert werden soll.
Operations-Register: Es zeigt an, ob es sich um eine Lese- oder Schreiboperation handelt – quasi wie ein Hinweis, ob Waren abgeholt oder angeliefert werden.
Kontroll-Register: Mit diesem Register wird der konfigurierte DMA-Transfer gestartet – sozusagen der Startknopf für den Transport.
Diese Register zusammen ermöglichen es dem DMA-Controller, den Datenfluss effizient und zielgerichtet zu steuern!
Speicheradresse-Register: Zeigt, wo im Hauptspeicher Daten gelesen oder geschrieben werden sollen.
Gerätnummer-Register: Bestimmt, welches Gerät an der Datenübertragung beteiligt ist.
Zähler-Register: Gibt an, wie viele Datenworte noch übertragen werden müssen.
Operations-Register: Legt fest, ob Daten gelesen oder geschrieben werden.
Kontroll-Register: Startet den konfigurierten DMA-Transfer.
Diese Register sorgen dafür, dass der DMA-Controller den Datentransfer richtig und effizient abwickeln kann.
Wodurch wird E/A „realisiert“?
Programmgesteuerte Eingabe/Ausgabe durch Polling:
Was passiert? Die CPU fragt kontinuierlich (in Schleifen) nach, ob ein Gerät bereit ist, um Daten zu übertragen. Das nennt man „busy waiting“.
Effizienz: Diese Methode verbraucht viel CPU-Zeit, weil die CPU ständig wartet, ohne etwas anderes zu tun.
Unterbrechungsgesteuerte E/A:
Was passiert? Statt ständig nachzusehen, ob das Gerät bereit ist, wartet die CPU, bis das Gerät eine „Unterbrechung“ (Interrupt) sendet, um sie zu informieren.
Effizienz: Das ist effizienter als Polling, weil die CPU nicht ständig nachfragen muss. Allerdings sind die Eingriffe in den Prozess noch softwaregesteuert und erfordern einige CPU-Ressourcen für die Interrupt-Verarbeitung.
DMA (Direct Memory Access):
Was passiert? Ein spezieller DMA-Controller übernimmt das Kopieren von Daten zwischen dem Gerät und dem Hauptspeicher, ohne die CPU stark zu belasten.
Effizienz: Während des Transfers kann die CPU nicht auf den Bus zugreifen, aber sie wird von der Aufgabe des Datentransfers entlastet und kann andere Berechnungen durchführen.
Polling: Die CPU fragt ständig nach (nicht sehr effizient).
Unterbrechungsbasierte E/A: Die CPU wartet, bis sie benachrichtigt wird (effizienter).
DMA: Ein spezieller Controller übernimmt den Datentransfer (sehr effizient, aber verhindert CPU-Zugriffe auf den Bus).
Wann findet die Umschaltung der Modi User- und Systemmodus statt?
Wenn ein Benutzerprogramm einen Systemaufruf tätigt – etwa um auf eine geschützte Ressource zuzugreifen – passiert Folgendes:
Systemmodus aktivieren: Bevor eine privilegierte Betriebssystemprozedur (BS-Prozedur) ausgeführt wird, schaltet die Hardware den Prozessor in den Systemmodus. Dadurch wird gewährleistet, dass die folgende Unterbrechungsbehandlung in einem sicheren, kontrollierten Umfeld stattfindet.
Ausführung der Unterbrechungsroutine: Im Systemmodus ruft der Prozessor die entsprechende Unterbrechungsroutine auf. Diese Routine ist ein Teil des Betriebssystems – also vertrauenswürdig und sorgfältig abgesichert.
Rückkehr in den ursprünglichen Modus: Bevor die Unterbrechungsroutine endet, wechselt der Prozessor wieder in den ursprünglichen Modus (Benutzer- oder Prozessmodus).
Wichtig ist, dass nicht der aufrufende Prozess, sondern die Betriebssystemroutine die erforderlichen Privilegien erhält, um die geforderte Aufgabe sicher und geschützt auszuführen.
Wenn ein Programm einen Systemaufruf macht, schaltet die Hardware den Prozessor zuerst in den Systemmodus.
Im Systemmodus wird eine sichere Routine des Betriebssystems ausgeführt, die den Systemaufruf bearbeitet.
Bevor die Routine endet, wechselt der Prozessor wieder in den ursprünglichen Modus.
Das bedeutet: Die privilegierten Befehle werden von der Betriebssystemroutine ausgeführt, nicht vom aufrufenden Programm.
Wie wird der Schutz des Adressbereichs (Adressraums) eines Prozesses realisiert?
Stell dir vor, jeder Prozess hat seinen eigenen „sicheren Raum“ im Hauptspeicher – wie ein privates Zimmer in einem großen Haus. Eine spezielle Hardware, oft als MMU bezeichnet, sorgt dafür, dass ein Programm nur in seinem zugewiesenen Bereich (seinem Adressraum) operieren kann und verhindert den Zugriff auf fremde Bereiche.
Basisregister: Dieses Register enthält die niedrigste physikalische Adresse des erlaubten Speicherbereichs – quasi die Türschwelle zu deinem privaten Zimmer.
Grenzregister: Es legt fest, wie groß dein Zimmer ist, also wie viele Adressen (Worte) dir zur Verfügung stehen. Überschreitungen werden erkannt und können durch Interrupts behandelt werden.
Adressumsetzung: Programme werden relativ zur Adresse Null kompiliert. Das bedeutet, sie kennen nur „ihren eigenen“ Startpunkt, nicht den tatsächlichen physischen Ort im Speicher. Der Loader kann den Programmcode dann flexibel in jeden freien Hauptspeicherbereich laden. Mithilfe des Basisregisters wird die relative Adresse in eine absolute, physikalische Bus-Adresse umgerechnet: Absolute Adresse = Basisadresse (aus dem Basisregister) + relative Adresse (aus dem Speicheradressregister).
Diese Technik ermöglicht Relokierbarkeit und Schutz gleichzeitig – der Programmcode bleibt unabhängig von seiner tatsächlichen Platzierung im Hauptspeicher, und das System verhindert, dass ein Prozess unberechtigt in den Speicher eines anderen eingreift. Zwar kann diese Umrechnung die Performance theoretisch um einen Faktor beeinträchtigen, doch der Sicherheitsgewinn ist meist entscheidend.
Speicher-Schutz: Jeder Prozess darf nur in einem bestimmten Bereich des Hauptspeichers arbeiten.
Basisregister: Zeigt an, wo der erlaubte Speicherbereich beginnt.
Grenzregister: Gibt an, wie groß der erlaubte Bereich ist.
Adressumrechnung: Ein Programm wird so programmiert, dass es immer bei Adresse Null beginnt. Beim Zugriff wird dann zur richtigen physischen Adresse addiert: Physikalische Adresse = Basisadresse + relative Adresse.
Flexibilität: Dadurch kann der Loader das Programm an einer beliebigen freien Stelle im Hauptspeicher platzieren, ohne dass das Programm selbst geändert werden muss.
Diese Hardware sorgt dafür, dass ein Programm nicht auf Speicherbereiche zugreifen kann, die ihm nicht gehören, und ermöglicht gleichzeitig, dass Programme flexibel im Speicher platziert werden können.
Was ist eine relative Adresse?
Stell dir vor, ein Programm wird so erstellt, dass es immer bei Adresse Null startet – das ist seine relative Adresse. Diese relative Adresse wird vom „Binder“ während des Compile-/Link-Vorgangs festgelegt. Zur Laufzeit wird diese relative Adresse mithilfe des Basisregisters in eine absolute physikalische Adresse umgerechnet. Das Basisregister enthält die Startadresse des erlaubten Adressraums. Außerdem kodieren die oberen Bits der relativen Adresse häufig, zu welchem Segment (z. B. RAM-Daten, Stack, Programmcode, konstante Daten) sie gehört.
Dieses System der relativen Adressen ermöglicht die Relokierbarkeit des Programms, da der Loader den Code an einer beliebigen freien Speicherstelle platzieren kann, ohne dass der Programmcode selbst angepasst werden muss. Wichtig: Hier spricht man nicht von der relativen Adressierung im Sinne von Assembler-Befehlssätzen, sondern von der Verwendung relativer Adressen zur flexiblen Platzierung und zum Schutz von Speichersegmenten.
Ein Programm wird so erstellt, dass es mit einer Adresse beginnt, die als relative Adresse bezeichnet wird – also als Wert, der immer bei Null startet. Dieser Wert wird beim Kompilieren und Linken festgelegt.
Basisregister: Enthält die Startadresse des erlaubten Speicherbereichs.
Relative Adresse: Wird zur Laufzeit zu einer absoluten Adresse addiert, um den genauen Speicherort zu bestimmen.
Segmentnummer: Die oberen Bits der relativen Adresse sagen oft, zu welchem Segment (z. B. Daten, Stack, Programmcode) sie gehört.
Dadurch kann der Loader das Programm flexibel in den Hauptspeicher laden, ohne dass der Code verändert werden muss – das nennt man Relokierbarkeit.
Wichtig ist, dass hier „relative Adressen“ anders verwendet werden als die relative Adressierung in Assemblersprachen.
Was ist eine absolute Adresse?
Die physikalische Adresse, die auf dem Adressbus verwendet wird, entsteht automatisch durch die Addition von zwei Komponenten:
Basisadresse (aus dem Basisregister): Das ist der Startpunkt des erlaubten Speicherbereichs, den die Speicherschutzhardware verwaltet.
Relative Adresse: Diese wird vom Programm (während des Compile-/Link-Vorgangs) relativ zu Null vergeben.
Die Speicherschutz- bzw. Segmentierungs-Hardware rechnet zur Laufzeit automatisch: Absolute Adresse = Basisadresse + Relative Adresse Dadurch muss das Programm diese Umrechnung nicht selbst vornehmen, was den Programmablauf vereinfacht. Obwohl beide Begriffe – relative und absolute Adressierung – aus der Sicht des Assemblers betrachtet werden, erfolgt hier die praktische Umsetzung der Umrechnung im Hintergrund durch die Hardware.
Die tatsächliche Adresse, die im Speicher genutzt wird, ergibt sich so: Physikalische Adresse = Startadresse (aus dem Basisregister) + relative Adresse
Basisadresse: Gibt den Anfang des erlaubten Speicherbereichs an.
Relative Adresse: Wird beim Kompilieren festgelegt und ist immer relativ zu Null.
Die Hardware übernimmt diese Berechnung automatisch, sodass das Programm nicht selbst damit beschäftigt ist. Dies vereinfacht den Umgang mit Speicher und schützt gleichzeitig den Adressraum.
Welche „Dienste“ stellt die Hardware dem Betriebssystem zur Verfügung?
Stell dir das Betriebssystem als einen strengen Dirigenten vor, der das gesamte Orchester (dein Computersystem) im Takt hält. Dafür sorgen vier fundamentale Mechanismen:
Privilegierte Befehle: Wie spezielle Dirigenten-Noten, die nur im Systemmodus (dem Chefbereich) ausgeführt werden dürfen. Nur der Dirigent – also das Betriebssystem – hat Zugriff auf diese kritischen Befehle, um sicherzustellen, dass alles korrekt gesteuert wird.
Speicherschutz: Vergleichbar mit einem persönlichen Raum, in den nur bestimmte Leute eintreten dürfen. Mithilfe von Basis- und Grenzregistern (oder auch Paging) wird dafür gesorgt, dass ein Programm nur auf seinen eigenen Speicherbereich zugreifen kann – niemand darf einfach in den privaten Raum eines anderen eindringen.
Unterbrechungen (Interrupts): Diese sind wie akustische Signale oder Fanfaren, die das Orchester darauf aufmerksam machen, dass etwas Wichtiges passiert. Interrupts aktivieren das Betriebssystem, sodass es sofort eingreifen und die Kontrolle übernehmen kann, wenn z. B. ein Gerät seine Dienste benötigt.
Zeitgeber (HW-Timer): Wie ein präziser Taktgeber, der die Zeit aufteilt und bestimmt, wie lange jedes Instrument (Prozess) spielt. Das ermöglicht ein preemptives Scheduling, bei dem die CPU-Zeit gerecht verteilt wird.
Zusätzlich wird der Bus – ähnlich einer Hauptverkehrsstraße – genutzt, um Geräte-Controller anzubinden und auch den DMA (Direct Memory Access) zu ermöglichen, sodass Daten effizient zwischen den Komponenten ausgetauscht werden können. Alle diese Mechanismen zusammen garantieren, dass das Betriebssystem die vollständige Kontrolle über das System behält und reibungslos arbeiten kann.
Um sicherzustellen, dass das Betriebssystem die Kontrolle über das ganze System behält, werden folgende Mechanismen eingesetzt:
Privilegierte Befehle: Nur im Systemmodus dürfen bestimmte wichtige Befehle ausgeführt werden. Das verhindert, dass Benutzerprogramme kritische Systembereiche manipulieren.
Speicherschutz: Mit Methoden wie Basis- und Grenzregistern oder Paging wird sichergestellt, dass ein Programm nur auf den ihm zugewiesenen Speicherbereich zugreifen kann.
Unterbrechungen (Interrupts): Interrupts aktivieren das Betriebssystem, wenn externe Ereignisse eintreten, sodass es die Kontrolle übernehmen kann.
Zeitgeber (HW-Timer): Hardware-Timer teilen die CPU-Zeit auf und ermöglichen preemptives Scheduling, sodass alle Prozesse fair bedient werden.
Außerdem sorgt der Bus dafür, dass Geräte-Controller und gegebenenfalls der DMA effizient eingebunden werden – wie in hardwarenahen Treibern. All diese Mechanismen arbeiten zusammen, damit das Betriebssystem immer die Oberhand behält.
Welche Vorteile haben relative Adressen?
Stell dir vor, Programme haben die Freiheit wie Reisende: Ihr Code und ihre Adressbereiche können überall im Hauptspeicher "umziehen", wohin gerade Platz ist. Diese Flexibilität – dank relokierbarem Code – ermöglicht eine dynamische Allokierung, bei der der Speicher wie ein wandelbarer, lebendiger Raum genutzt wird.
Programme, die relokierbaren Code verwenden, können im Hauptspeicher an jeden freien Platz verschoben werden. Das nennt man dynamische Allokierung.
Wie funktioniert ein Boot(ing)-Vorgang?
Stell dir vor, du schaltest deinen Computer ein, und er beginnt wie von Zauberhand zu arbeiten. Aber hinter den Kulissen passiert ein genau choreografierter Startvorgang, der als „Hochfahren“ (Booting) bezeichnet wird:
Ur-Lader (Bootloader):
Beim Einschalten des Rechners wird der Ur-Lader automatisch ausgeführt. Er befindet sich in einem speziellen Speicherbereich (z. B. im ROM oder BIOS/UEFI) und hat eine einfache Aufgabe: den eigentlichen Lader von der Festplatte zu laden. Es ist, als ob du einen Schlüssel drehst, um den Motor zu starten.
Lader (Loader):
Der Lader wird vom Ur-Lader gestartet und übernimmt die nächste Aufgabe: Er lädt die wesentlichen Teile des Betriebssystems in den Hauptspeicher (RAM). Es ist, als ob der Motor nun den Generator startet, der das ganze Haus mit Strom versorgt.
Hochfahren (Booting):
Dieser gesamte Vorgang wird als „Hochfahren“ bezeichnet. Das Betriebssystem wird Schritt für Schritt aktiviert, bis es bereit ist, Befehle entgegenzunehmen. Es ist, als ob das Haus nach und nach zum Leben erwacht – zuerst das Licht, dann die Heizung und schließlich alle anderen Geräte.
Ur-Lader: Wird beim Einschalten automatisch ausgeführt und lädt den eigentlichen Lader von der Festplatte.
Lader: Lädt die wesentlichen Teile des Betriebssystems in den Hauptspeicher.
Hochfahren (Booting): Der gesamte Startvorgang, bei dem das Betriebssystem geladen und aktiviert wird.
Stell dir vor, du möchtest ein Problem lösen – zum Beispiel einen Kuchen backen. Hier ist, wie die Konzepte Algorithmus, Programm, Programm im Hauptspeicher und Prozess zusammenwirken:
Ein Algorithmus ist wie ein Rezept. Er beschreibt Schritt für Schritt, wie du das Problem lösen kannst. Die Problemspezifikation (z. B. „Backe einen Schokoladenkuchen“) wird im Lastenheft festgehalten. Es ist die Idee oder der Plan, bevor du ihn umsetzt.
Ein Programm ist die Umsetzung des Algorithmus in eine Programmiersprache. Es ist, als ob du das Rezept in eine Sprache übersetzt, die der Computer versteht – z. B. „Nimm 200 g Mehl, füge 100 g Zucker hinzu...“.
Wenn das Programm in den Hauptspeicher (RAM) geladen wird, wird es zu einer Folge von Befehlen, die der Computer ausführen kann. Diese Befehle arbeiten zur Laufzeit auf Daten. Es ist, als ob du die Zutaten auf den Küchentisch legst und Schritt für Schritt das Rezept befolgst.
Ein Prozess ist ein Programm in Ausführung. Es ist, als ob du tatsächlich in der Küche stehst und den Kuchen backst – die Befehle werden ausgeführt, und das Ergebnis entsteht.
Algorithmus: Beschreibung einer Lösung zu einem Problem (z. B. ein Rezept).
Programm im Hauptspeicher: Folge von Befehlen, die zur Laufzeit auf Daten arbeiten.
Prozess: Ein Programm in Ausführung.
Was ist ein Prozess? Was muß das BS zur Verwaltung von Prozessen wissen? Was gehört zum Prozesskontext?
Ein Prozess ist wie ein Arbeiter in einer Fabrik (dem Betriebssystem), der eine bestimmte Aufgabe erledigt. Er besteht nicht nur aus dem Programm (der Anleitung), sondern auch aus dem Prozesskontext, der alle Informationen enthält, die der Arbeiter benötigt, um seine Arbeit fortzusetzen. Hier ist, was dazu gehört:
Registerinhalte:
Der Befehlszähler zeigt an, wo der Prozess im Programm steht.
Das Statusregister enthält Informationen wie den Systemmodus (S-Modus) oder Benutzermodus (U-Modus).
Der Prozess-Stackpointer zeigt auf den aktuellen Stack, der lokale Variablen und Rücksprungadressen speichert.
Grenzen des Adressraums:
Basis-/Grenzregister oder Segment-/Seitentabellen definieren, auf welchen Speicherbereich der Prozess zugreifen darf.
Beim „Forken“ (Erzeugen eines neuen Prozesses) wird der Speicherbereich nicht vererbt, sondern kopiert.
Prozessnummer:
Eine eindeutige ID, die den Prozess identifiziert.
Prozess-Scheduling-Priorität:
Bestimmt, wie dringend der Prozess die CPU benötigt.
Prozesszustand:
Zeigt an, ob der Prozess rechnend, bereit oder blockiert ist.
Belegte Ressourcen:
Dazu gehören z. B. geöffnete Dateien oder andere Ressourcen, die der Prozess verwendet.
Prozess-Kontrollblock (PCB):
Der PCB ist wie die Personalakte des Arbeiters. Er speichert den gesamten Prozesskontext, sodass der Prozess später fortgesetzt werden kann, wenn er unterbrochen wurde.
Ein Prozess besteht aus:
Programm: Der auszuführende Code.
Prozesskontext: Im PCB gespeichert, enthält:
Registerinhalte: Befehlszähler, Statusregister, Stackpointer.
Grenzen des Adressraums: Basis-/Grenzregister oder Segment-/Seitentabellen.
Prozessnummer: Eindeutige ID.
Scheduling-Priorität: Bestimmt die Dringlichkeit.
Prozesszustand: Rechnend, bereit oder blockiert.
Belegte Ressourcen: Z. B. geöffnete Dateien.
Was ist für die CPU-Verwaltung verantwortlich?
Stell dir das Betriebssystem als den Dirigenten eines großen Orchesters vor, der die Prozesstabelle – den Partiturbogen mit allen Prozess-PCBs – akribisch verwaltet. Mit seiner ausgeklügelten Scheduling-Strategie wählt der CPU-Scheduler den nächsten „Solisten“ aus, der die Rechenbühne betritt und das Programmkonzert fortsetzt.
Das Betriebssystem verwaltet die Prozesstabelle, in der alle Prozess-PCBs gespeichert sind. Der CPU-Scheduler entscheidet dann anhand einer bestimmten Strategie, welcher der bereitstehenden Prozesse als Nächstes ausgeführt wird.
Erklären Sie die Prozessorzustände!
Klar, hier ist eine optisch verbesserte Version deiner Antwort:
In einem Einprozessorsystem ist immer nur ein Prozess aktiv – der „Rechen-Solist“, der gerade von der CPU bearbeitet wird. Alle anderen Prozesse haben eine bestimmte Position:
Bereit: Kämpfen um CPU-Zeit.
Blockiert: Warten auf ein Ereignis (z.B. Ein-/Ausgabe).
Unterbrechungen spielen hier eine wichtige Rolle und können auf verschiedene Weisen auftreten:
Kooperative Abgabe (SW-Trap): Der Prozess gibt die CPU freiwillig ab.
Erzwungene Abgabe (HW-Interrupt): Die CPU wird gezwungen, die Ausführung zu stoppen.
Geräte-Interrupt: Ein externes Signal weckt einen blockierten Prozess.
Wichtig:
Blockierte Prozesse gehen immer zuerst in den „bereit“-Zustand und nie direkt in den „rechnend“-Zustand.
Der Übergang von „blockiert“ zu „bereit“ erfolgt durch ein Signal von einem anderen Prozess.
In einem Einprozessorsystem:
Nur ein Prozess ist aktiv und wird von der CPU bearbeitet.
Andere Prozesse sind entweder:
Bereit: Warten auf die CPU.
Blockiert: Warten auf ein Ereignis.
Unterbrechungen können den Prozesswechsel auslösen:
Kooperative Abgabe (SW-Trap) oder erzwungene Abgabe (HW-Interrupt).
Geräte-Interrupts wecken blockierte Prozesse.
Hinweis: Blockierte Prozesse gehen immer zuerst in den „bereit“-Zustand und warten auf ein Ereignis, bevor sie wieder rechnen können.
Warum geht ein Prozess nicht vom Zustand blockiert in den Zustand rechnend? Was kann die Konsequenz sein, wenn das so wäre?
Natürlich, hier ist die Antwort optisch aufbereitet:
Problem: Häufige Ein-/Ausgaben in einem oder vielen Prozessen sind wie ständig klingelnde Telefone – der Scheduler wird immer wieder unterbrochen.
Folge:
Der Scheduler verliert die Kontrolle über die Prozesse.
Die ursprünglich geplante Scheduling-Strategie wird gestört und funktioniert nicht mehr effizient.
Veranschaulichung: Ständige Störungen führen dazu, dass der Scheduler nicht mehr ordentlich zwischen Prozessen auswählen kann.
Problem:
Häufige Ein-/Ausgaben stören den Scheduler.
Der Scheduler verliert die Kontrolle.
Die Scheduling-Strategie wird weniger effektiv.
Erklärung: Wenn Prozesse oft Ein-/Ausgaben machen, wird der Scheduler ständig unterbrochen und kann nicht mehr effizient arbeiten.
Kann ein Prozess auf seinen eigenen Prozesskontext zugreifen?
Nein, da er sich dann ein unendliches Zeitquantum oder Systemrechte geben könnte.
Was ist die Ursache dafür, daß ein Prozess den Zustand wechselt?
Ablauf der Prozessverwaltung:
CPU zugeteilt / entzogen: Die CPU wird entweder präemptiv durch eine Unterbrechung entzogen oder zugeteilt.
Unterbrechung tritt ein:
Freiwillig: Der Prozess gibt die CPU freiwillig ab (z.B. via SW-Trap).
Präemptiv: Ein externer Geräte-Interrupt zwingt den Prozess zur Abgabe der CPU.
Ein-/Ausgabeanforderung: Der Prozess wartet auf ein Ereignis oder ein Signal (z.B. eine E/A-Anforderung).
Ereignis oder Signalisierung: Ein E/A-Ereignis oder eine Signalisierung tritt ein, und der Prozess kann wieder aktiv werden.
Prozess zugelassen / beendet: Der Prozess wird entweder zur Ausführung zugelassen oder endet, je nach seiner Situation und dem Scheduler.
Ablauf:
CPU zugeteilt / entzogen:
Die CPU wird durch eine Unterbrechung (präemptiv) zugeteilt oder entzogen.
Unterbrechung:
Freiwillig (z.B. durch SW-Trap) oder präemptiv (z.B. Geräte-Interrupt).
Ein-/Ausgabeanforderung: Der Prozess wartet auf ein Ereignis oder ein Signal (E/A-Anforderung).
Ereignis eintreten: Ein E/A-Ereignis oder Signal lässt den Prozess weiterarbeiten.
Prozess: Der Prozess wird zugelassen oder beendet.
Welche Software-Aktionen passieren bei einer „Unterbrechung“ (im Zust. rechnend)?
Ablauf einer Unterbrechungsbehandlung:
Sichern: Die Unterbrechungsroutine sorgt dafür, dass der Dispatcher alle Registerinhalte des unterbrochenen Prozesses speichert – entweder auf dem systemeigenen Stapel oder im PCB des Prozesses.
Einfügen: Der PCB des unterbrochenen Prozesses wird in die passende Warteschlange eingefügt – entweder bereit oder blockiert.
Behandeln der Unterbrechung: Je nach Bedarf ruft die Unterbrechungsroutine den Ein-/Ausgabeteil des Betriebssystems auf, um das E/A-Ereignis zu bearbeiten.
Auswählen: Der Scheduler wählt aus den „bereiten“ Prozessen den nächsten Prozess aus, der rechnen darf, und teilt ihm ein Zeitquantum zu.
Wiederherstellen: Der Dispatcher stellt alle Registerinhalte des ausgewählten Prozesses wieder her, setzt den Timer auf das Zeitquantum und führt den Befehl „Return From Interrupt (RTI)“ aus, um in den neuen Kontext zurückzukehren (inkl. Wiederherstellung des User- und Systemmodus).
Sichern: Der Dispatcher speichert alle Registerinhalte des unterbrochenen Prozesses.
Einfügen: Der Prozess wird in die Warteschlange (bereit oder blockiert) eingefügt.
Behandeln der Unterbrechung: Falls nötig, wird der Ein-/Ausgabeteil des Betriebssystems aufgerufen.
Auswählen: Der Scheduler wählt den nächsten Prozess aus und teilt ihm ein Zeitquantum zu.
Wiederherstellen: Der Dispatcher stellt die Registerinhalte des ausgewählten Prozesses wieder her und setzt den Timer. Der Befehl „RTI“ sorgt dafür, dass der Prozess weiterläuft.
Was ist der Unterschied zwischen Scheduler und Dispatcher?
Scheduler: Der Scheduler ist wie der Regisseur eines Films: Er entscheidet, welcher Prozess als nächster die Hauptrolle (den Prozessor) übernimmt. Dabei folgt er der festgelegten Strategie für die Rechenzeitvergabe und weist dem Prozess ein Zeitquantum zu, das ihm erlaubt, die CPU zu nutzen.
Dispatcher: Der Dispatcher ist der Techniker hinter den Kulissen: Er führt den Kontextwechsel durch, indem er die Prozesskontexte sichert und wiederherstellt. Bei präemptiven Systemen sorgt er zusätzlich dafür, dass der Timer richtig gesetzt wird, um den nächsten Prozesswechsel auszulösen, falls die Zeit abgelaufen ist.
Scheduler:
Setzt die Strategie für die Zuteilung der CPU.
Wählt den nächsten bereitstehenden Prozess aus und teilt ihm ein Zeitquantum zu.
Dispatcher:
Führt den Kontextwechsel durch:
Sichert und stellt die Prozesskontexte wieder her.
Setzt bei präemptiven Systemen den Timer, um nach Ablauf der Zeit einen Prozesswechsel auszulösen.
Was ist der Unterschied zwischen präemptiv und nicht präemptiv?
Präemptiv: In einem präemptiven System ist der HW-Timer der „Strafvollzieher“. Er entzieht einem Prozess die CPU, falls dieser sich nicht kooperativ verhält und die CPU nicht freiwillig abgibt. Das System könnte trotzdem von den Prozessen erwarten, sich kooperativ zu verhalten, z.B. durch ein regelmäßiges Wechseln von „rechnend“ nach „bereit“. Werden Prozesse jedoch immer wieder zwangsweise entzogen, könnte das ein Hinweis auf eine System-Überlastung sein.
Nicht präemptiv: In einem nicht präemptiven System gibt es keine automatische Möglichkeit, einem Prozess die CPU zu entziehen. Stattdessen müssen die Prozesse freiwillig kooperieren und sich selbstständig die CPU teilen, indem sie sie nach einer gewissen Zeit abgeben.
Präemptiv:
Das System entzieht einem Prozess die CPU über den HW-Timer, falls er nicht freiwillig abgibt.
Kooperatives Verhalten wird erwartet, aber häufige Entzüge deuten auf Überlastung hin.
Nicht präemptiv:
Das System kann einem Prozess nicht die CPU entziehen.
Die Prozesse müssen sich freiwillig abwechseln, um die CPU zu nutzen.
Welche Möglichkeiten gibt es, daß ein Prozess vom Zustand rechnend in den Zustand bereit geht?
1. Nicht präemptives System: In einem nicht präemptiven System blockiert ein Prozess die CPU so lange, bis er sich freiwillig dazu entscheidet, sie abzugeben. Das bedeutet: Alle Prozesse müssen zu 100% kooperieren und dürfen nicht ohne Zustimmung der anderen laufen.
2. Präemptives System: Ein präemptives System kann einem Prozess die CPU auch ohne seine Zustimmung entziehen. Dies geschieht über einen Zeitscheiben-Interrupt. In den meisten modernen Systemen ist diese präemptive Zuteilung der Prozessorzeit die Norm, da sie eine bessere Prozesskontrolle und Effizienz ermöglicht.
3. E/A-Gerätezugriffs-Interrupt: Ein E/A-Gerätezugriffs-Interrupt tritt auf, um ein Ereignis zu signalisieren, das von einem Gerät erzeugt wurde, z.B. wenn eine Eingabe/Ausgabe abgeschlossen ist. Dieser Interrupt kann den Systemfluss beeinflussen und einen neuen Prozess aktivieren.
1. Nicht präemptives System:
Ein Prozess blockiert die CPU, bis er sie freiwillig abgibt.
Kooperation ist zwingend erforderlich.
2. Präemptives System:
Ein Prozess kann die CPU über einen Zeitscheiben-Interrupt verlieren.
Moderne Systeme nutzen meist präemptives Scheduling.
3. E/A-Gerätezugriffs-Interrupt:
Ein Interrupt signalisiert ein Ereignis, das durch ein E/A-Gerät ausgelöst wurde (z.B. abgeschlossene Eingabe/Ausgabe).
Bei einem Einprozessorsystem läuft zu jedem Zeitpunkt genau ein Prozess. Warum laufen die Prozesse trotzdem scheinbar parallel? Wie kann ein Prozessor mehrere Prozesse quasi-parallel ablaufen lassen?
Parallelität im Time-Sharing-Betrieb: Im Time-Sharing-Betrieb entsteht der Eindruck von Parallelität, weil der Scheduler im schnellen Wechsel jedem bereiten Prozess ein Quantum an Rechenzeit zuweist. Dies erzeugt den Eindruck, dass mehrere Prozesse gleichzeitig ablaufen, obwohl sie in Wahrheit nacheinander, aber sehr schnell, ausgeführt werden.
Parallelität im Time-Sharing-Betrieb:
Der Scheduler gibt jedem bereiten Prozess ein kleines Zeit-Quantum.
Dadurch entsteht der Eindruck, dass Prozesse gleichzeitig laufen, obwohl sie nacheinander ausgeführt werden.
Welche Scheduling Strategien gibt es?
Nicht präemptive (kooperative) Systeme:
FCFS (First-Come-First-Served):
Fair, aber nicht ideal für interaktive Prozesse.
Bei dieser Strategie wird der Prozess, der zuerst kommt, auch zuerst bearbeitet.
SJF (Shortest Job First):
Minimiert die Gesamtwartezeit, ideal für den Batch-Betrieb.
Allerdings unfair, da längere Prozesse immer wieder warten müssen.
Prioritäts-Scheduling:
Besonders geeignet für interaktive Prozesse, da diese häufig eine hohe Interaktivität benötigen.
Unfair, da Starvation auftreten kann, bei der niedriger priorisierte Prozesse nie ausgeführt werden.
Round Robin:
Wird oft in präemptiven Systemen verwendet. Jeder Prozess erhält ein Zeitquantum, nach dessen Ablauf er wieder an den Scheduler zurückgegeben wird.
Kombination von Round Robin und Prioritäts-Scheduling:
Interaktive Prozesse erhalten dynamisch höhere Prioritäten, aber kleinere Zeitscheiben.
Rechenlastige Prozesse erhalten niedrigere Prioritäten, aber größere Zeitscheiben.
Fair, aber nicht gut für interaktive Prozesse.
Minimiert Wartezeiten, gut für Batch-Betrieb, aber unfair.
Gut für interaktive Prozesse, aber unfair (Starvation).
Häufig in präemptiven Systemen genutzt, verteilt CPU-Zeit auf Prozesse.
Interaktive Prozesse erhalten höhere Priorität und kleinere Zeitscheiben.
Rechenintensive Prozesse erhalten niedrigere Priorität und größere Zeitscheiben.
Wie funktioniert die SJF-Strategie?
Bearbeitung nach Rechenzeitbedarf: Die Prozesse im „bereiten“ Zustand werden in der Reihenfolge ihres Rechenzeitbedarfs bearbeitet – die kurzen Prozesse kommen zuerst dran. Das bedeutet, dass kurzfristige Aufgaben bevorzugt und schnell abgearbeitet werden, bevor längere Prozesse ausgeführt werden.
Bearbeitung nach Rechenzeitbedarf:
Prozesse im „bereit“ Zustand werden nach aufsteigendem Rechenzeitbedarf bearbeitet.
Kurze Prozesse kommen zuerst dran.
Welche theoretische Eigenschaft hat die SJF-Strategie?
Früh eintreffender Prozess und Starvation: Ein Prozess, der früh eintrifft, aber viel Rechenzeit benötigt oder in einer Endlosschleife steckt, blockiert nicht die später eintreffenden Prozesse. Allerdings hat SJF das Problem der Starvation: Lange Prozesse, die spät kommen, könnten nie ausgeführt werden. Dieses Problem kann jedoch mit Prioritätsanpassung (Aging) gemildert werden.
Beweis zur Minimierung der Gesamtwartezeit:
Wenn ein langer Prozess L vor einem kurzen Prozess K ausgeführt wird, verlängert sich die Wartezeit von L beim Vertauschen der Reihenfolge, aber die Wartezeit von K verkürzt sich deutlich mehr.
Alle anderen Prozesse bleiben unbeeinflusst.
Ein solcher Tausch verringert die Gesamtwartezeit, weshalb jede andere Ausführungsreihenfolge als SJF noch optimiert werden kann.
Daraus folgt, dass SJF eine optimale Strategie zur Minimierung der Gesamtwartezeit ist.
Früh eintreffender Prozess und Starvation:
Ein Prozess mit hohem Rechenzeitbedarf blockiert spätere Prozesse nicht.
Starvation tritt auf, wenn lange Prozesse nie ausgeführt werden, was mit Aging behoben werden kann.
Wenn ein langer Prozess L vor einem kurzen Prozess K läuft, wird die Wartezeit von K durch einen Tausch deutlich reduziert.
Der Tausch verringert die Gesamtwartezeit und zeigt, dass SJF die optimale Strategie ist.
Für welchen Betrieb ist die SJF-Strategie geeignet? Warum?
Eignung von SJF für Batch-Betrieb: Das SJF-Verfahren ist ideal für den Batch-Betrieb, da hier Aufträge (Jobs) ohne Benutzerinteraktion und in regelmäßigen Abständen verarbeitet werden. In einem solchen Szenario kennt man die Laufzeiten der Prozesse im Voraus, wodurch SJF effizient genutzt werden kann, um Gesamtwartezeiten zu minimieren.
Eignung von SJF für Batch-Betrieb:
SJF eignet sich gut für den Batch-Betrieb, bei dem keine Benutzerinteraktion erforderlich ist.
Laufzeiten der Aufträge sind bekannt und können optimiert werden.
Wird bei Round-Robin ein Scheduler benötigt? Wer unterbricht einen Prozess bei RR?
Zuweisung der Zeitscheibe durch den Scheduler: Der Scheduler weist jedem Prozess ein Quantum der Zeitscheibe zu. Wenn diese abgelaufen ist, wird ein HW-Timer-Interrupt ausgelöst. Die Unterbrechungsroutine veranlasst daraufhin den Dispatcher, mit der Prozesskontextsicherung zu beginnen, um den nächsten Prozess auszuführen.
Zeitscheibe und Prozesswechsel:
Der Scheduler gibt jedem Prozess ein Quantum der Zeitscheibe.
Nach Ablauf des Quants löst der HW-Timer einen Interrupt aus.
Der Dispatcher sichert den Prozesskontext und wechselt zum nächsten Prozess.
Welche Strategie benutzt man für einen Time-Sharing-Betrieb?
1. Round Robin: Ein einfaches, weit verbreitetes Verfahren ist Round Robin, bei dem jeder Prozess im Zustand bereit vom Scheduler eine gleich lange Zeitscheibe (time slice) zugewiesen bekommt. Die Prozesse werden reihum abgearbeitet. Allerdings haben interaktive Prozesse oft Schwierigkeiten, wenn rechenintensive Prozesse ebenfalls die CPU beanspruchen.
2. Verbesserung von Round Robin: Eine Verbesserung von Round Robin besteht darin, dass der Scheduler die Zeitscheibenlänge dynamisch anpasst – basierend auf der Priorität des Prozesses oder darauf, wie viel Rechenzeit der Prozess schon verbraucht hat. Diese dynamische Anpassung sorgt für eine effizientere Nutzung der CPU.
3. Dynamische Prioritätsvergabe: Die Priorität eines Prozesses kann auch dynamisch vergeben werden, je nach dessen Verhalten. Zum Beispiel erhalten IO-Anfragen automatisch eine höhere Priorität, weil sie nur kurzfristig die CPU benötigen und somit interaktive Prozesse nicht unnötig blockieren.
1. Round Robin:
Round Robin weist jedem bereit-Prozess eine gleiche Zeitscheibe zu.
Interaktive Prozesse können unter rechenintensiven Prozessen leiden.
2. Verbesserung von Round Robin:
Der Scheduler kann die Zeitscheibenlänge basierend auf Priorität oder verbrauchter Rechenzeit anpassen.
3. Dynamische Prioritätsvergabe:
IO-Anfragen erhalten dynamisch hohe Priorität, da sie nur kurz die CPU beanspruchen.
Welche allgemeinen Kriterien liegenden den Scheduling-Strategien zugrunde?
1. Effizienz: Ziel ist es, den Prozessor möglichst gut auszulasten, sodass er während der gesamten Zeit aktiv arbeitet und keine Leerlaufzeiten entstehen.
2. Minimale Antwortzeit: Bei interaktiven Prozessen wird bevorzugt, dass diese möglichst schnell eine Antwort erhalten. Sie sollen vor rechenintensiven Prozessen ausgeführt werden, um eine gute Nutzererfahrung zu gewährleisten.
3. Fairness: Es ist wichtig, dass kein Prozess verhungert, also keine endlos langen Wartezeiten hat, weil andere Prozesse immer wieder bevorzugt werden.
4. Minimale Durchlaufzeit: Die Durchlaufzeit soll so gering wie möglich sein, während der maximale Durchsatz der Prozesse erreicht wird. Die Zeitscheibe sollte dabei ausgewogen gewählt werden, um sowohl Verwaltungsaufwand als auch Interaktivität zu optimieren.
1. Effizienz:
Der Prozessor soll immer gut ausgelastet sein.
2. Minimale Antwortzeit:
Interaktive Prozesse sollen schnell bearbeitet werden, bevor rechenlastige Prozesse.
3. Fairness:
Kein Prozess darf verhungern.
4. Minimale Durchlaufzeit:
Zeitscheiben sollten so gewählt werden, dass der Durchsatz hoch und der Verwaltungsaufwand niedrig bleibt.
Wie groß sollte man eine Zeitscheibe z.B. bei Round Robin wählen? Was ist das Problem mit zu großer oder zu kleiner Zeitscheibe?
Probleme mit Zeitscheibenlängen:
Zu lange Zeitscheiben: Interaktive Prozesse mit hohem Ein-/Ausgabebedarf leiden, wenn rechenintensive Prozesse lange Zeitscheiben haben und diese vollständig ausnutzen. Die Antwortzeiten für interaktive Prozesse werden dadurch erheblich verzögert.
Zu kurze Zeitscheiben: Kurze Zeitscheiben verursachen einen hohen Kontextwechselaufwand. Die CPU verbringt dann viel Zeit mit der Verwaltung der Kontextwechsel und nicht mit der Ausführung der Prozesse, was die Effizienz und die Prozessgeschwindigkeit verringert.
Prozesse mit hohem Ein-/Ausgabebedarf: Diese Prozesse können von langen Zeitscheiben kaum profitieren, da sie in der Regel frühzeitig blockieren, z.B. durch Warten auf Benutzereingaben, bevor ihre Zeitscheibe überhaupt abgelaufen ist.
Lange Zeitscheiben: Interaktive Prozesse mit Ein-/Ausgabebedarf haben lange Wartezeiten, wenn rechenintensive Prozesse lange laufen.
Kurze Zeitscheiben: Häufige Kontextwechsel machen die CPU weniger effizient und verlangsamen die Prozesse.
Ein-/Ausgabe-intensive Prozesse: Blockieren oft bevor ihre Zeitscheibe endet und können keine langen Zeitscheiben nutzen.
Wie wählt man die Größe der Zeitscheibe im allgemeinen?
Zeitscheibenlänge: Die Zeitscheibe sollte etwas größer sein als die gewöhnliche Interaktionszeit eines Prozesses. Auf diese Weise hat der Prozess genug Zeit, um seine Aufgaben zu erledigen, ohne dass er zu schnell unterbrochen wird, aber auch nicht so lang, dass andere Prozesse unnötig blockiert werden.
Zeitscheibe: Die Zeitscheibe sollte größer als die übliche Interaktionszeit des Prozesses sein, damit der Prozess seine Arbeit effizient erledigen kann.
Wie wird der Zugriff auf ein Gerät (Device) im Time-Sharing-Betrieb vom BS organisiert?
Geräte-Warteschlangen im Time-Sharing-Betrieb:
Warteschlangen: Für jedes Speichergerät gibt es eine eigene Geräte-Warteschlange (device queue), in die Aufträge vom Ein-/Ausgabeteil des Betriebssystems eingereiht werden. Jeder Auftrag enthält die Prozessnummer des anfordernden Prozesses.
Auftragsabwicklung: Der Gerätetreiber holt die Aufträge aus der Warteschlange und führt sie aus. Dabei ist der Treiber nicht strikt an die Reihenfolge in der Warteschlange gebunden. Stattdessen kann er geschickt den nächsten Auftrag wählen, um die Zugriffszeit des Geräts zu minimieren.
Drucker: Beim Drucken muss der Prozess jedoch anders gestaltet werden. Wenn mehrere Prozesse gleichzeitig zeilenweise oder absatzweise drucken wollen, könnte dies zu einem Durcheinander auf dem Papier führen. Um dies zu verhindern, werden die Druckausgaben zunächst in einer Spooler-Datei gesammelt und erst dann ausgedruckt, wenn der Prozess seine Druckaufträge abgeschlossen hat.
Warteschlangen und Drucker:
Geräte-Warteschlangen: Es gibt für jedes Gerät eine Warteschlange, in die Prozesse ihre Aufträge einreihen. Der Gerätetreiber entscheidet, in welcher Reihenfolge die Aufträge ausgeführt werden.
Drucker: Beim Drucken werden die Aufträge in einer Spooler-Datei gesammelt, damit der Drucker nicht durcheinander gerät, wenn mehrere Prozesse gleichzeitig drucken wollen.
Wer macht den Prozesswechsel? Welche Aufgaben hat der Dispatcher?
Der Dispatcher ist verantwortlich für den Prozess-Kontextwechsel. Er sorgt dafür, dass der aktuell laufende Prozess gestoppt und der neue Prozess mit den richtigen Prozessdaten fortgesetzt wird.
Aufgaben des Dispatchers:
Sichern der aktuellen Prozessdaten (Kontext).
Wiederherstellen des Kontexts des neuen Prozesses.
Wechsel zur Ausführung des nächsten Prozesses.
Der Dispatcher sorgt dafür, dass der Prozess wechselt. Er speichert die Daten des laufenden Prozesses und stellt die Daten des nächsten Prozesses wieder her.
Wie wird ein Prozess gestoppt, weiter zu rechnen?
HW-Zeitgeber und Unterbrechung:
Ein HW-Zeitgeber löst einen Timer-Interrupt aus, der die CPU unterbricht.
Der laufende Prozess wird gestoppt und in die Menge der bereiten Prozesse zurückgestellt.
Daraufhin wird normalerweise ein anderer Prozess zur Ausführung ausgewählt.
Wichtiger Punkt: Das Betriebssystem selbst ist ein Programm, das ohne Hardware-Unterstützung (z. B. einen Timer-Interrupt) keinen Prozess stoppen kann, der gerade läuft.
Timer-Interrupt:
Ein HW-Zeitgeber stoppt den aktuellen Prozess und stellt ihn zurück in die Warteschlange.
Ohne Timer-Interrupt kann das Betriebssystem keinen Prozess zwangsläufig stoppen.
Welche Hardware wird hier eingesetzt?
Zeitgeber und Unterbrechung:
Ein HW-Zeitgeber löst eine Unterbrechung der CPU aus.
Wichtiger Punkt: Das Betriebssystem selbst ist ein Programm, das ohne Hardware-Unterstützung (z. B. einen Zeitgeber-Interrupt) keinen Prozess stoppen kann, der gerade läuft.
Zeitgeber-Interrupt:
Ohne Zeitgeber-Interrupt kann das Betriebssystem keinen Prozess zwangsläufig stoppen.
Warum braucht das Betriebssystem einen Timer?
Festplattenzugriff – Ausführung einer read-Operation:
Software-Unterbrechung (Trap) & Kontextrettung:
Der Hochsprachen-Befehl read wird während der Übersetzung in einen entsprechenden Systemaufruf umgewandelt.
read
Eine Software-Unterbrechung (Trap) wird ausgelöst, wodurch zunächst der aktuelle Kontext des Prozesses P gesichert wird.
Anschließend ruft das Betriebssystem den geräteunabhängigen Ein-/Ausgabeteil auf.
Parameterprüfung & Cache-Check:
Das Betriebssystem überprüft, ob die übergebenen Parameter gültig sind.
Es wird festgestellt, ob die benötigten Daten bereits im Cache des Hauptspeichers vorhanden sind.
Fall A: Sind die Daten im Cache, so werden sie in den Adressraum von P kopiert.
Danach kann P nach der Rückkehr von der Unterbrechung weiterarbeiten.
Blockierung & Geräte-Warteschlange:
Fall B: Falls die Daten nicht im Cache sind, muss auf einen Plattenzugriff zurückgegriffen werden.
Prozess P wird in den Zustand blockiert versetzt.
Der Leseauftrag wird an die Geräte-Warteschlange des Festplattenlaufwerks angehängt.
Der Gerätetreiber wird darüber informiert.
Auftragsentnahme & Vorbereitung durch den Gerätetreiber:
Sobald der Gerätetreiber aktiv wird, entnimmt er den Leseauftrag aus der Warteschlange.
Er reserviert im betriebssystemeigenen Speicherplatz für die einzulesenden Daten.
Der Treiber bestimmt die gerätespezifische Datenblockadresse und übermittelt einen Lesebefehl an den Gerätecontroller.
Festplattenzugriff & DMA-Übertragung:
Der Gerätecontroller ermittelt die physische Adresse des gewünschten Datenblocks.
Der Lesebefehl wird ausgeführt, und mit Hilfe des DMA-Controllers werden die Daten in den reservierten Speicherbereich kopiert.
Während dieser Übertragung können andere Prozesse rechen, da die CPU nicht blockiert ist.
Nach Abschluss des Kopiervorgangs löst der DMA-Controller eine DMA-Ende-Unterbrechung aus.
DMA-Ende-Unterbrechung & Benachrichtigung:
Über den Unterbrechungsvektor wird die DMA-Ende-Unterbrechungsroutine gestartet.
Diese Routine informiert den Gerätetreiber, dass der Lesevorgang abgeschlossen wurde.
Zuordnung des Auftrags:
Der Gerätetreiber überprüft in der Geräte-Warteschlange, von welchem Prozess der Leseauftrag stammt.
Daraufhin informiert er den geräteunabhängigen Ein-/Ausgabeteil des Betriebssystems über den Abschluss des Leseauftrags.
Datenkopie in den Prozess-Speicher & Freigabe:
Der Ein-/Ausgabeteil kopiert die gelesenen Daten aus dem systemeigenen Speicher in den Adressraum des Prozesses P.
Prozess P wird in den Zustand bereit versetzt, z. B. durch eine entsprechende Signalisierung.
Fortsetzung der Ausführung:
Sobald P wieder die CPU zugeteilt bekommt, setzt es die Arbeit nach dem read-Aufruf fort.
Wie wird eine read-Operation ausgeführt?
Software-Unterbrechung:
Der read-Befehl wird in einen Systemaufruf umgewandelt.
Eine Software-Unterbrechung wird ausgelöst, und der Kontext von Prozess P wird gespeichert.
Das Betriebssystem startet den Ein-/Ausgabeteil.
Prüfung:
Das OS prüft, ob die Parameter stimmen und ob die Daten bereits im Cache sind.
Falls ja, kopiert es die Daten in den Adressraum von P.
P kann dann weiterarbeiten.
Blockierung & Auftrag:
Wenn die Daten nicht im Cache sind, wird P blockiert.
Der Leseauftrag wird in die Geräte-Warteschlange des Festplattenlaufwerks eingereiht.
Der Gerätetreiber wird informiert.
Gerätetreiber arbeitet:
Der Gerätetreiber entnimmt den Auftrag aus der Warteschlange.
Er reserviert Speicher, bestimmt die Blockadresse und sendet einen Lesebefehl an den Gerätecontroller.
Datenübertragung:
Der Gerätecontroller liest den Datenblock von der Festplatte.
Mit Hilfe des DMA-Controllers werden die Daten in den reservierten Speicher kopiert.
Nach dem Kopiervorgang löst der DMA-Controller eine DMA-Ende-Unterbrechung aus.
Benachrichtigung:
Die DMA-Ende-Unterbrechungsroutine informiert den Gerätetreiber, dass der Auftrag abgeschlossen ist.
Weiterleitung:
Der Gerätetreiber stellt fest, von welchem Prozess der Auftrag stammt, und benachrichtigt das OS.
Datenkopie & Freigabe:
Das OS kopiert die Daten in den Speicher von Prozess P.
P wird als bereit markiert.
Fortsetzung:
Sobald P wieder rechen darf, wird der read-Aufruf fortgesetzt und P arbeitet weiter.
Warum wird nicht schon beim Compilieren die logische Datenbeschreibung (logische Adresse) durch die physische Beschreibung (physische Adresse) ersetzt?
Einprägsame Antwort:
Längerer Zeitraum zwischen Kompilierung und Ausführung
Während dieser Zeit können sich Datenstrukturen oder Startadressen ändern.
Deshalb:
Logische Adressen werden erst zur Laufzeit auf physische Adressen abgebildet.
Dies ermöglicht eine dynamische Anpassung zur Laufzeit, da der Speicherort während der Programmausführung noch verändert werden kann.
Einfache Antwort:
Während der Zeit zwischen dem Kompilieren und Ausführen eines Programms kann sich etwas im Programm ändern (z.B. Startadresse oder Daten).
Deshalb: Die logischen Adressen werden erst während der Ausführung des Programms in physische Adressen umgewandelt.
Warum werden die gelesenen Daten erst im systemeigenen Speicherbereich abgelegt und nicht gleich im Adressraum des anfordernden Prozesses P?
Problem bei sofortiger Datenübertragung in den Adressraum Wenn die gelesenen Daten sofort in den Adressraum des Prozesses P übertragen würden, gäbe es zwei Hindernisse:
Zieladresse an den Controller weitergeben: Das Betriebssystem müsste über den Treiber dem Controller die Zieladresse mitteilen, was die Verwaltung erschwert.
Prozess-Adressraum darf nicht verschoben werden: Der Adressraum von Prozess P dürfte nicht bewegt werden, bis der Lesevorgang abgeschlossen ist. Wenn Prozesse ausgelagert sind, ist der Adressraum nicht verfügbar.
Kapselung und Aufgabenteilung:
Es widerspricht den Prinzipien der Kapselung und Aufgabenteilung, dem Controller die Zieladresse mitzuteilen.
Das Verschieben blockierter Prozesse oder das Auslagern auf die Festplatte würde die effiziente Verwaltung des Hauptspeichers behindern.
Wenn Daten sofort in den Adressraum des Prozesses P übertragen werden, entstehen zwei Probleme:
Der Controller müsste die Zieladresse kennen.
Der Adressraum von Prozess P könnte nicht verschoben werden, was die Effizienz des Hauptspeichers beeinträchtigt.
Es widerspricht den Prinzipien der Kapselung und Aufgabenteilung, dem Controller die Zieladresse zu geben.
Wir nehmen an, daß ein Programm einen read(f,b)-Befehl bei dem Datensatz b von der Datei f ausführt. Wie kann dieser Lese-Befehl beim Gerätetreiber und Controller aussehen? (Der Gerätetreiber kennt nur die logische Blocknummer, der Controller kennt nur die Zylinder-, Platten- und Sektornummer)
Gerätetreiber: Der Gerätetreiber fordert das Lesen von Daten mit einer logischen Blocknummer, einer Pufferadresse und der Länge der zu lesenden Daten an. Funktionsaufruf: read(logische Blocknummer, Pufferadresse, Länge)
read(logische Blocknummer, Pufferadresse, Länge)
Geräte-Controller: Der Geräte-Controller übersetzt die logische Blocknummer in physische Daten und liest die Daten von den Festplatten. Er benötigt zusätzlich Details wie die Zylinder-, Platten- und Sektorennummer, sowie die Pufferadresse und Länge der zu lesenden Daten. Funktionsaufruf: read(Zylinder, Platten, Sektorennummer, Pufferadresse, Länge)
read(Zylinder, Platten, Sektorennummer, Pufferadresse, Länge)
Gerätetreiber: Der Treiber liest mit einer logischen Blocknummer und Pufferadresse. Aufruf: read(logische Blocknummer, Pufferadresse, Länge)
Geräte-Controller: Der Controller liest mit Zylinder, Platten, Sektor und Pufferadresse. Aufruf: read(Zylinder, Platten, Sektorennummer, Pufferadresse, Länge)
Wie sieht die Struktur des Betriebssystems UNIX aus? Was bieten die Programmier-schnittstelle und Benutzerschnittstelle an?
Welche Formen „komplexerer Systeme“ kennen Sie?
Parallelrechner:
Mehrprozessor-Systeme: Mehrere Prozessoren arbeiten parallel an unterschiedlichen Aufgaben.
Parallelisierung: Aufgaben werden auf verschiedene Prozessoren verteilt, um die Rechenleistung zu erhöhen.
Kosteneinsparung: Durch Mehrkernprozessoren lassen sich Kosten senken, da mehrere Kerne gleichzeitig arbeiten können.
Fehlertolerante Systeme: Solche Systeme sind so aufgebaut, dass sie auch bei Ausfall einzelner Komponenten weiterarbeiten können.
Bus- oder Schalterwerkbasiert: Kommunikation zwischen Prozessoren erfolgt über Busse oder spezialisierte Schaltwerke wie Switches/Multiplexer.
Verteilte Systeme:
Hypercube: Ein spezielles Netzwerkdesign, bei dem Knoten auf einer mehrdimensionalen Struktur angeordnet sind, um schnelle Kommunikation zu ermöglichen.
Echtzeitsysteme:
Systeme, die Anforderungen an die zeitgerechte Ausführung von Aufgaben haben, wobei Verzögerungen die Funktionsfähigkeit beeinträchtigen können.
Mehrprozessor-Systeme arbeiten parallel, was Leistung steigert.
Kostensenkung durch Mehrkernprozessoren.
Fehlertolerante Systeme bleiben auch bei Ausfällen stabil.
Kommunikation über Busse oder Schalter.
Hypercube ist eine spezielle Struktur für schnelle Kommunikation.
Systeme, die sofort reagieren müssen, um korrekt zu arbeiten.
Wie können Nachrichten versendet/ausgetauscht werden?
Verbindungsloser Datenaustausch:
Beispiel: Shared Memory, BS-Signale, UDP
Eigenschaften:
Kein ständiger Kommunikationskanal wird aufrechterhalten.
Nachrichten werden einfach versendet, ohne sicherzustellen, dass sie beim Empfänger ankommen.
Vorteil: Schneller, da keine Verbindung aufgebaut werden muss.
Nachteil: Weniger zuverlässig, da es keine Garantie für die Zustellung gibt.
Verbindungsorientierter Datenaustausch:
Beispiel: Pipes, TCP/IP
Eine stabile Verbindung wird zwischen Sender und Empfänger aufgebaut.
Nachrichten werden in einem sicheren Kanal übertragen, der eine ordnungsgemäße Zustellung garantiert.
Vorteil: Zuverlässiger, da Zustellgarantie und Reihenfolge gesichert sind.
Nachteil: Langsame Kommunikation durch die Notwendigkeit, eine Verbindung herzustellen.
Keine feste Verbindung, z.B. bei UDP oder Shared Memory.
Schnell, aber weniger zuverlässig.
Stabile Verbindung wird aufgebaut, z.B. bei TCP/IP.
Zuverlässig, aber langsamer.
Last changed3 days ago