Webcam Diggs Cam


Betriebssysteme Tutorial - Holger Kreissl - www.kreissl.info

Kapitel 1 - Einleitung Betriebsysteme

Inhalt
  • Hauptaufgaben einen Betriebssystems
  • Unterschiede zwischen Betriebssystemen
  • Bestandteile von Betriebssystemen

Einleitung - BS Definition

Ein Betriebsystem stellt Dienste und Infrastrukturen (Metasteuerungen) bereit. Daten oder Virtuelle Maschinen sind kein Teil des Betriebssystems sondern des Dienstleistungssystems. Die Metasteuerungen sind entscheidend beim Entwurf. (z.B. in Bezug auf Uni- oder Mehrbenutzersystem)

Grob gesagt ist ein Betriebssystem eine erweiterte Maschine (Top-Down-Sicht), um durch Abstraktionen eine für den Menschen (Programmierer) überschaubare Form als Programmiergrundlage zu bieten.

Organisation eines Betriebssystem

Definieren Sie den Begriff Betriebsystem!

Das Betriebssystem ist die Gesamtheit der Programme eines Rechensystems, welche die Betriebssteuerung erledigen und die Benutzeraufträgen eine zugängliche Umgebung bereitstellen. Betriebsmittel sind Komponenten sowohl der Hardware als auch der Software (System und Anwendersoftware), wie z.B. Prozessor, Speicher, Ein-Ausgabe-Geräte, Dateien, Programme etc.

Das Betriebssystem ermöglicht es z.B. dem Anwender, Programme auf unterschiedlicher Hardware laufen zu lassen. D.h. das Betriebssystem bietet dem Anwender eine virtuelle Maschine, welche die reale Hardware "unsichtbar" für den Programmierer macht.


  • abstrahiert den Rechner auf eine für Menschen leichter durchschaubare virtuelle Maschine
  • Steuert und koordiniert Prozessabläufe und verwaltet die Ressourcen
Merktabelle: Definition Betriebssysteme

Wie sieht das Ebenen- oder Schichtenmodell eines Rechners aus?

  1. Gatter Ebene
  2. Mikroprogrammebene
  3. konventionelle Maschinenebene
  4. Betriebssystemebene API
  5. Assemblerebene
  6. Anwendungsebene

Worin Unterscheiden sich Betriebssysteme?

  • universal oder dezidiert (Multi-Task / Single-Task)
  • eine oder mehrere Sitzungen (Windows < XP, Linux)
  • Kommunikation mit der Umwelt (Batch, interaktiv oder in Echtzeit)

Was sind die drei Welten des Betriebsystems?

  • Betriebssystem selbst
  • Komplexe Werkzeuge, wie aufgesetzte Dienste oder Virtuelle Maschinen
  • Programmiersysteme zur Entwicklung von Erweiterungen

Welche Aufgaben hat ein Betriebsystem?

  1. Abstraktion der Hardware, d.h. Schließen der so genannten 'Semantischen Lücke' zwischen Mikroprogrammebene und der Anwendungsebene
  2. Betriebsmittelverwaltung
  3. Steuerung von Peripheriegeräten (I/O, Festplatten...)
  4. Steuerung des Betriebsablaufs durch Prozessverwaltung und -Kommunikation und Organisation des Mehrprogrammbetriebes
  5. Protokollierung, Schutz und Sicherheit
  6. Behandlung von Ausnahmesituationen, wie Page Faults, Division by Zero u.s.w.
  7. Bereitstellung einer Kommandosprache
  8. Unterstützung von Administrationsaufgaben (Datensicherung, Systemkonfigurierung, Benutzerrechte)

Was ist ein Modell?

Ein Modell eines Rechnersystems ist eine Abbildung eines realen Systems unter Abstrahierung bestimmter Kriterien, in dem eine formale Beschreibung durch eine Theorie in Gesetzen formuliert werden kann.

Welche drei Punkte sind bei der Realisierung eines BS grundlegend?

Prozessor-Modes (Betriebszustände)

Supervisor Mode
(Kernel Mode)
Ist ein privilegierter Modus für Betriebssystemfunktionen im Kern des Systems, welches Sicherheit des Systems erhöht, da diese geschützt von Andwenderprogrammen laufen.
User Mode
(Anwendungsmodus)
Die Betriebsart wird über ein "Mode"-Bit angezeigt. Privilegierte Funktionen (wie I/O Funktionen) sind aber nur im Kernelmode ausführbar. Diese können über bestimmte Methoden gerufen werden.

Kernel

Im Kern laufen die Systemkritischen Funktionen, wie z.B. I/O-Aktionen ab. Der Kern muss korrekt, sicher und geschützt vor Anwendungen sein.

Methoden des Aufrufs von Betriebssystemsdiensten

System Calls Durch System Calls können BS-Funktionen gerufen werden. Die Schnittstelle zwischen Usermode und Kernel sind sogenannte Traps (Einstiegspunkte). Geräte können Traps nicht nutzen, sondern können die BS-Dienste durch spezielle Interruptsmechanismen erreichen.
Nachrichtenversand Über eine Send/Receive-Schnittstelle können sich User-Mode und Kernel-Mode Nachrichten zuschicken.

Sinn und zweck ist eine Entkopplung von System und Anwendung! Windows NT bietet eine API mit mehr als 10.000 Systemaufrufen, Unix dagegen ca. 300.

System-Call am Beispiel Windows NT

Kapitel 2 - Modelle

Inhalt
  • Modelle für Betriebssysteme
  • Hierarchiche Schichtenmodell
  • Betriebsmittel und Instanzen
  • Schalenmodell
  • Modulmodell (Monolithisches Modell)
  • Hierarchisches Schichtenmodell
  • Client Server Modelle

Vor- und Nachteile von Schalen- und Modulmodellen

Schalenmodell:
  • Relationen der einzelnen Schalen sind zur Umwelt nicht sichtbar
  • System ist aber gut strukturiert
  • Innere Schalen sind sehr gut abgeschirmt von den Äußeren
Modulmodell:
  • Das Modell wird in Modulen durch Programmcode beschrieben
  • die Relationen werden daher extrem komplex (quatradisch)
  • Daher ist es nur bei kleinen Modellen umsetzbar

Wie ist das hierarchische Schichtenmodell aufgebaut?

Jede Schicht stellt Betriebsmittel und Dienste für den Zugriff auf die jeweilige übergeordnete Schicht bereit. Somit kann jede Schicht auch die Betriebsmittel und Dienste darunterliegender Schichten nutzen. Eine Schicht steuert die unmittelbare Schicht über ihr. (Steuerungshierarchie)

Bestandteile:
  • Schichten
  • Iterative Ordnungsrelation der Schichten (Dienste, Steuerungen bzw. Instanzen)
  • Betriebsmittel
  • Funktionen zum Erzeugen von Betriebsmitteln und Steuerungen

Welche Vorteile hat das hierarchisch Schichtenmodell?

  • obwohl modularisiert, ist die Zahl der Relationen gering
  • Kommunikation mit der Umwelt ist möglich
  • Es bietet eine Infrastruktur für Instanzen (Steuerung, BM-Transformationen)

Was ist ein Betriebsmittel?

Ein Betriebsmittel ist eine abstrakte Ressource, welche über eine Adresse und einen Wert verfügt. Sie wird definiert über
  • ID (eindeutiger Identifikator)
  • Adressbereich (für alle möglichen Adressen des Betriebsmittels)
  • Wertebereicht (aller möglichen Werte für einen Wert des BM)
  • Funktion (verknüpft die abstrakten Elemente miteinander)
Der Zustand eines Betriebsmittels ergibt sich aus Wert x Adresse.

Welche Klassen von Betriebsmitteln gibt es?

  • Entziehbarkeit (entziehbar wie Prozessor oder nicht wie Dateideskriptor)
  • Zuteilbarkeit (gleichzeitig wie Speicher oder exklusiv wie Prozessor oder Drucker)
  • Wiederverwendbarkeit (einmalig Nutzbar wie Interrupt oder mehrfach wie Prozessor oder Speicher)
  • Hardware / Software (logisches oder physikalisches Betriebsmittel)

Vorgehensweise beim Erstellen eines Betriebsmittels

  1. ID bestimmen
  2. abstrakte Elemente bestimmen, welche einen Wert und eine Adresse besitzen
  3. Wert und Adresse festlegen
  4. Funktionen definieren, welche Zugriff auf alle Elemente ermöglichen

Erläutern sie die Betriebsmittelerstellung am Bsp. Hauptspeicher!

  1. Eine ID ist hier nicht sinnvoll, da ein von-Neumann Rechner nur einen Hauptspeicher hat.
  2. die abstrakten Elemente sind die ansprechbaren Speicherzellen mit Adresse und Wert.
  3. Der Wertebereich beträgt 0 bist 255 bei einem Byte-Orientierten Speicher
  4. Funktionen sind Read und Write eines Elementes zum Speicher

Was ist eine Instanz?

Eine Instanz ist ein Tupel aus id (Betriebsmittel) und einem Aktivitätstoken, welches die einzelnen Dienste ruft. Zwischen Betriebsmitteln untereinander und zwischen Instanzen untereinander bestehen Relationen.

Wechle Klassen von Instanzen kennen Sie?

  • Applikationen
  • Betriebsmittel-Transformatoren
  • Metasteuerungen wie PUM

Wie können Relationen zwischen Instanzen technisch hergestellt werden?

Protokolle und Schnittstellen verbinden sich Instanzen. Dabei treten beide immer zusammen auf. Eine Schnittstelle kennzeichnet das statische Verhalten einer Relation und ein Protokoll das dynamische, d.h. die Semantik der Relation.

Als Beispiel nehmen wir einen Spooler. Hier ist die Schnittstelle ein Betriebsmittel (Speicherbuffer) und das Protokoll (Verhalten) ist als Dienst implementiert.

Spool = Simultanously Periphal Output On Line

Es gibt datenorientierte und steuerungsorientierte Schnittstellen. Datenorientierte Schnittstellen arbeiten ohne Synchronisation und verbrauchen viel Ressourcen (Busy Waiting). Steurerungsorientierte Schnittstellen sind z.B. Systemcalls und Interrupts.

Kapitel 3 - Aktivitäten

Inhalt
  • Was sind Aktivitätstoken?
  • Welche Arten von Token gibt es?
  • Was sind Prozesse?
  • Unix Prozesserzeugung
  • Zustände von Prozessen

Was ist ein Aktivitätstoken?

  • Ist sehr abstrakt zu sehen
  • Ein Aktivitätstoken haucht dem Programm erst "Leben" ein
  • Beschreibt ein aktiven oder wartenden Prozess
  • Es muss eine Art virtuellen Programmcounter im eigenen virtuellen Steuerwerk des Prozesses geben

Was ist Multitasking?

Ist die Fähigkeit Prozesse parallel laufen zu lassen. Bei Einprozessormaschinen (kooperativ oder preemtiv) wird die Leistungsfähigkeit damit optimal ausgenutzt. Die verschiedenen Betriebsmittel können von mehreren Prozessen mehrfach bzw. parallel genutzt werden.

Welche Aktivitäten gibt es und worin unterscheiden sie sich?

Token Verteilung Protokoll BM-Zuteilung
Prozedur Eins für alle - Call Return Exclusiv
Coroutine Eins für alle - Resume, aber dynamischer Eintrittspunkt (kooperatives Multitasking) Exclusiv
Prozess Pro Prozess Pro Prozess Keine Übergabe, da Prozess Token behält Exclusiv
Thread Pro Prozess Pro Thread Eins Keine Übergabe, da Prozess Token behält Threads sind in Prozessen gruppiert und teilen sich dort die Betriebsmittel

Welche Betriebsmittel benötigt eine Aktivität mindestens?

  • Programmcode
  • Hauptspeicher
  • Steuerwerk

Wodurch wird ein Prozess beschrieben?

  • ein im System eindeutiger Identifikator (PID)
  • Liste mit Betriebsmittel-Forderungen
  • Liste mit zugeteilten Betriebsmitteln
  • Ein Folge der bisherigen Anweisungen
  • Die Anfangswertbelegungen der zugeteilten Betriebsmittel

Welche Probleme treten mit Prozessen auf?

  • Determiniertheit (Durch Mehrfachverwendung von Betriebsmitteln ist diese so nicht mehr gegeben und Synchronisation wird notwendig)
  • Mutual Exclusion
  • Synchronisation (Abstimmung zwischen Threads)
  • Kommunikation (Synchronisation und Austausch von Daten zwischen Prozessen)
  • Lebendigkeit

Welche Zustände kann ein Prozess einnehmen?

  • nicht existent (Prozess noch nicht definiert)
  • bereit (besitzt alle angeforderten Betriebsmittel außer den Prozessor)
  • aktiv (besitzt mindestens die angeforderten Betriebsmittel)
  • wartend (wartet noch auf noch nicht zugeteilte Betriebsmittel)


Prozess

Wie wird ein Prozess im Unix erstellt?

  • mit Systemaufruf fork() wird ein komplettes Speicherabbild eines schon bestehenden Prozesses erzeugt (bei NT wird Prozess mit einem Initialzustand erstellt)
  • Deshalb erben neue Prozesse eventuelle Variablen des Vaterprozesses
Deshalb terminiert folgende Schleife nicht unter NT aber unter Unix:

For ( i=1; i<3; i++) fork();

Einige Unix-Systembefehle zur Prozesserzeugung:

  • fork(), vfork() zum Prozesserstellen mit Speicherabbild des Vaters
  • clone() erstellt einen Prozess der der den Speicher und Deskriptoren mit Vater teilt
  • execl(), execv(), execle(), execlp(), execvp() zum Kopieren eines Programms in den Speicher
  • wait(), waitpid() zum Warten auf Ende des Sohnprozesses
  • exit() zum Beenden eines Prozesses
http://unixhelp.ed.ac.uk/CGI/man-cgi

Ein Beispielcode für eine Einfache Unix-Shell


#include sys/types.h
#include sys/wait.h
#include unistd.h
#include stdlib.h
#include stdio.h
#include string.h

using namespace std;


int main(void){

pid_t pid; //für PID des Sohnes 
char str1[1000]; //Befehlsbuffer

while(1)
{

	printf("\nDiggs mini bash. (PID=%d)\n\n",getpid());
	printf("> ");

	scanf("%s",str1); //Befehl lesen

	if (strcmp(str1,"exit")==0) break; //exit beendet

	if ((pid=fork())<0) //Prozess kopieren
	{
		printf("EXEC Operation failed!\n\n");
		exit(0);
	}

	if (pid==0) //im Sohnprozess exec
	{	    			
		char *cmd=strtok(str1," ");
		execlp (cmd,cmd,0); //Speicher überschreiben
		
		printf("command not found!\n");
		exit(0); //manuell terminieren

	} //Vaterprozess muss warten
	else waitpid(pid,0,0);	
	}

return 0; 
}

Der Vaterprozess liest einen Befehl (hier nur ohne Parameter) und startet danach einen Sohnprozess mit fork() in welchem mit dem Befehl exec das aufzurufende Programm in den Speicher kopiert wird. Schlägt exec fehl muss mit exit der Sohnprozess manuell beendet werden, da dieser sonst nicht terminieren würde.

Am Besten einfach ausprobieren. Den Quellcode eingeben oder kopieren und mit dem gcc compilieren:
gcc minishell.cc -o minishell 
Aufruf: ./minishell

Wie werden Prozesse verwaltet?

Das Betriebssystem verwaltet alle Prozesse. Die Prozesse besitzen einen PCB (Process Controll Block, in welchem alle zum Prozess gehörigen Informationen gespeichert werden. Das Betriebssystem hat nun die Aufgabe alle n Prozesse auf einen oder mehr Prozessoren abzubilden.

Was ist Timesharing?

Timesharing ist die gemeinsame Benutzung des Betriebsmittels Prozessor von mehreren Prozessen. Dabei ermittelt ein Scheduler den nächst auszuführenden Prozess. Ein Task-Switch bzw. Context-Switch bezeichnet eine solche Umschaltung zwischen den Prozessen.

Was sind virtuelle Geräte bzw. Betriebsmittel?

Virtuelle Geräte stellen durch das Betriebssystem simulierte Geräte mit idealisierten Eigenschaften dar. Bewerkstelligt wird damit die Abstraktion von den Eigenschaften realer Geräte mit dem Ziel der Geräteunabhängigkeit. In der Regel stellen virtuelle Geräte jedem Prozeß eine synchrone Operation zur Verfügung. Dabei kann es erheblich mehr virtuelle als reale Geräte geben. Beispiele für virtuelle Betriebsmittel sind Druckerspooler oder Dateien.

Kapitel 4 - Kritischer Abschnitt

Inhalt
  • Kritischer Abschnitt und Mutual Exclusion
  • Dezentrale und Zentrale Steuerungen
  • Semaphore und ihre Impementierung
  • Verschiedenen Synchronisationsprobleme

Was ist ein Kritischer Abschnitt?

Ein Kritischer Abschnitt ist ein zeitlicher Bereich, in welchem mindestens zwei Prozesse auf das gleiche Betriebsmittel zugreifen und mindestens eines davon schreibt. (Zeitkritischer Ablauf)

Erklären sie am Bsp. Druckerspooler den kritischen Abschnitt!

  1. in Spooler ist der Platz 4 frei
  2. Prozess A will drucken und liest die Platznummer
  3. PUM aktiviert Prozess B, welcher ebenfalls diese Platznummer liest
  4. Prozess B schreibt den Auftrag nach Platz 4
  5. PUM schaltet zu A zurück und A überschreibt nun den Druckauftrag von B!
Deshalb notwendig: Wechselseitiger Ausschluss!

Warum werden keine Interrupt Unterbrechungen zur Synchronisation verwendet?

Ein Prozeß der auf gemeinsame Daten und Ressourcen zugreift, kann nicht einfach alle Interrupts abschalten. Dies würde zu keinem optimalen Scheduling führen, weil dann jeder Prozeß solange die Kontrolle behalten darf wie er will. D.h. die wartenden Prozesse sind auf die Kooperation des gerade laufenden Prozesses angewiesen (kooperatives Multitasking wie Win 3.11)

Was ist wechselseitiger Ausschluss?

Es muss gewährleistet werden, daß niemals sich mehr als ein Prozess in einem kritischen Abschnitt befinden darf. Die Anwendung einer einfachen Sperrvariable ist hier nicht möglich, da der Zugriff und das Setzen dieser, selbst einen kritischen Abschnitt darstellt. Es müssen Algorithmen gefunden werden, welche die Funktionalität gefahrlos implementieren.

Welche Anforderungen muss eine Steuerung für kritische Abschnitte erfüllen?

  1. exklusive Nutzung durch verschiedene Teilprozesse über mutual exclusion
  2. Ein Prozess darf einen anderen nur behindern, wenn beide im kritischen Abschnitt
  3. Der Eintritt in einen kritischen Abschnitt darf nicht lang dauern
  4. Alle Prozesse müssen in endlicher Zeit ihre Betriebsmittel zugewiesen bekommen
  5. globale Unabhängigkeit von allgemeinen Fortschreiten der Prozesse

Welche dezentralen Steuerungen kennen Sie? (aktives Warten)

  • Test and Set Lock
  • Ping-Pong (Striktes Alternieren)
  • Decker Algorithmus
  • Peterson Algorithmus

Wie arbeitet Striktes Alternieren? (Ping Pong)

Prozess A Prozess B
While (1)
{
	while (turn!=FALSE);
	criticalsection();
	turn = TRUE;
	notcriticalstuff();
}
While (1)
{
	while (turn!=TRUE);
	criticalsection();
	turn = FALSE;
	notcriticalstuff();
}
Hier wird nur mit einer TURN Variable zwischen den Prozessen hin und her geschalten. Nachteil ist das die Abläufe nur abwechselnd in die kritischen Abschnitte eintreten können und das ein nicht im kritischen Abschnitt arbeitender Prozess trotzdem warten muss, bis der andere diesen wieder verlassen hat.

Wie schaut Peterson's Algorithmus aus?