#LyX 1.2 created this file. For more info see http://www.lyx.org/ \lyxformat 220 \textclass article \begin_preamble \usepackage{hyperref} \hypersetup { pdftex=true, hyperindex=true, colorlinks=true, bookmarks=true, bookmarksnumbered=false, pdfpagemode=None, bookmarksopen=false, pdftitle=Vorlesungsmodul Betriebssysteme 1, pdfauthor=Matthias Ansorg, pdfcreator=pdfTeX (Web2C 7.3.1) 3.14159-0.13d, pdfstartview=FitBH } \end_preamble \language german \inputencoding auto \fontscheme helvet \graphics default \float_placement tbp \paperfontsize 10 \spacing single \papersize a4paper \paperpackage a4 \use_geometry 1 \use_amsmath 0 \use_natbib 0 \use_numerical_citations 0 \paperorientation portrait \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \defskip medskip \quotes_language danish \quotes_times 2 \papercolumns 1 \papersides 2 \paperpagestyle default \layout Title Vorlesungsmodul Betriebssysteme\SpecialChar ~ 1 \newline - VorlMod BetrSys1 - \layout Author Matthias Ansorg \layout Date 30. September 2002 bis \begin_inset ERT status Collapsed \layout Standard \backslash today \end_inset \layout Abstract Studentische Mitschrift zur Vorlesung Betriebssysteme\SpecialChar ~ 1 bei Prof. Jäger (Wintersemester 2002/2003) im Studiengang Informatik an der Fachhochschul e Gießen-Friedberg. \begin_deeper \layout Itemize \series bold Bezugsquelle: \series default Die vorliegende studentische Mitschrift steht im Internet zum Download bereit: \begin_inset LatexCommand \url{http://homepages.fh-giessen.de/~hg12117/index.html} \end_inset . Wenn sie vollständig ist, kann es auch über die \begin_inset LatexCommand \url[Skriptsammlung der Fachschaft Informatik der FH Gießen-Friedberg]{http://www.fh-giessen.de/FACHSCHAFT/Informatik/cgi-bin/navi01.cgi?skripte} \end_inset downgeloadet werden. \layout Itemize \series bold Lizenz: \series default Diese studentische Mitschrift ist public domain, darf also ohne Einschränkungen oder Quellenangabe für jeden beliebigen Zweck benutzt werden, kommerziell und nichtkommerziell; jedoch enthält sie keinerlei Garantien für Richtigkeit oder Eignung oder sonst irgendetwas, weder explizit noch implizit. Das Risiko der Nutzung dieser studentischen Mitschrift liegt allein beim Nutzer selbst. Einschränkend sind außerdem die Urheberrechte der verwendeten Quellen zu beachten. \layout Itemize \series bold Korrekturen: \series default Fehler zur Verbesserung in zukünftigen Versionen, sonstige Verbesserungsvorschl äge und Wünsche bitte dem Autor per e-mail mitteilen: Matthias Ansorg, ansis@gmx. de. \layout Itemize \series bold Format: \series default Die vorliegende studentische Mitschrift wurde mit dem Programm LyX (graphisches Frontend zu \begin_inset ERT status Collapsed \layout Standard \backslash LaTeX \end_inset ) unter Linux erstellt und als pdf-Datei exportiert. Grafiken wurden mit dem Programm xfig unter Linux erstellt und als eps-Datei exportiert. \layout Itemize \series bold Dozent: \series default Prof. Jäger. \layout Itemize \series bold Verwendete Quellen: \series default . \layout Itemize \series bold Klausur: \series default Hinweise zur Arbeitsweise in der Klausur: \begin_deeper \layout Itemize Die Klausur findet vor den Semesterferien statt. \layout Itemize Es sind keine Unterlagen erlaubt! \layout Itemize Gemäß Prüfungsordnung sind 2 Hausübungen Prüfungsvoraussetzung. Wer die Klausur wiederholt, muss keine Hausübungen mehr beibringen. Eine der Hausübungen wird die Implementierung eines Kommandointerpreters sein. \layout Itemize Zuerst alle Aufgaben lesen, mit Noten für ihre Schwierigkeit bewerten. Wichtig: Programmieraufgaben sind immer schwieriger als Wissensaufgaben, auch kann man sich hier leicht festbeißen, man sollte sie unter allen Umständen zum Schluss machen. \layout Itemize Einen groben Zeitplan machen und sich danach richten. Die Bearbeitungszeit richtet sich nach den Punkten pro Aufgabe, die Reihenfolge richtet sich nach ihrer Schwierigkeit entsprechend dem persönlichen Können. \layout Itemize Die Aufgaben von der leichtesten bis zur schwersten lösen. \layout Itemize Bei Programmieraufgaben sich zum systematischen Vorgehen zwingen: Verständnis durch Modelle und grafische Veranschaulichung verbessern, top-down Entwicklung des Programms, entspr. Platz lassen für einzufügenden Code. Gedankensprünge vermeiden, indem man das Problem in viele Teilprobleme gliedert. Algorithmus ggf. erst informal formulieren. Schleifen systematisch entwickeln. \layout Itemize 80/20-Regel beachten: 80% der Punkte für eine Aufgabe erhält man in 20% der Bearbeitunszeit. Es zahlt sich also aus, nicht alle Aufgaben bis zur Perfektion fertig zu machen, sondern halbfertig stehen zu lassen und zur nächsten Aufgabe überzugehe n. Zumindest sollte man unter allen Umständen vermeiden, sich an einer Aufgabe festzubeißen! \end_deeper \end_deeper \layout Standard \begin_inset LatexCommand \tableofcontents{} \end_inset \layout Part Lernstoff \layout Section Organisatorisches \layout Subsection Praktikum \layout Standard Es wird an UNIX-Rechnern gearbeitet, d.h. an den Terminals des Sun-Workgroup-Servers in F209, F211, C403. Es gibt BSD-Unix im Quellcode! Das im Praktikum verwendete Betriebssystem ist also Sun Solaris. Zu Hause kann man die Übungsaufgaben mit einem anderen Unix-System oder Linux bearbeiten. Die Aufgaben können auch unter Windows mit der kostenlosen Unix-Entwicklungsumg ebung Cygwin \begin_inset LatexCommand \url{http://www.cygwin.com} \end_inset bearbeitet werden. \layout Standard Die Aufgabenstellungen zum Praktikum werden im Internet auf der Homepage von Prof. Jäger veröffentlicht. \layout Standard Probleme nach Erfahrungen aus bisherigen Jahren: Die Grundkenntnisse zum Umgang mit dem Unix-System sollte man schnell beherrschen (Login, Quelltext editieren, Linken, Makefiles schreiben, Debugging). Die erste Übungsstunde beinhaltet lediglich dies als Stoff. Einige werden noch Nachholbedarf an Kenntnissen in C und C++ haben. Mit allen Problemen darf man die Tutoren nerven. Nur die wenigsten werden das Praktikum zu Hause alleine, ohne Hilfe, durchziehe n können - man sollte das Praktikum also besuchen. \layout Standard Man kann alle Probleme auch mit Prof. Jäger in der Sprechstunde oder per e-mail besprechen. \layout Subsection Lernziele und Inhalte \layout Subsubsection Motivation \layout Standard Betriebssysteme ist im Informatikstudium ein wichtiges Fach. Warum? Weil: \layout Itemize jeder Informatiker stets das Betriebssystem als Anwender benutzt. \layout Itemize er als Programmierer die Programmierschnittstelle des Betriebssystems (API \begin_inset Foot collapsed true \layout Standard application programming interface \end_inset ) benutzt. Dies geschieht über Systemaufrufe (system calls). \layout Itemize ein Informatiker das Betriebssystem als Administrator oder Netzwerkadministrator benutzt. Diese Aufgabe ist beliebig kompliziert. Im Informatikstudium erlernt man lediglich das Grundlagenwissen und ggf. eine Vertiefung im Hauptstudium (Vorlesung Systemtechnik). \layout Itemize er ggf. ein Betriebssystem implementiert. Dies ist auch für Informatiker von der FH nicht besonders unwahrscheinlich. Es gibt kaum einen Menschen, der ein Betriebssystem im Detail versteht - das geht nur im Team. \layout Subsubsection Inhalte allgemein \layout Itemize Konzepte von Betriebssystemen. Dies geschieht im Wesentlichen plattformunabhängig, d.h. es werden die Gemeinsamkeiten der Betriebssysteme herausgestellt. \begin_deeper \layout Itemize Architektur. Aus welchen Bestandteilen ist ein Betriebssystem aufgebaut? \layout Itemize Funktionen von Betriebssystemen. \layout Itemize Implementierungsstrategien. Wie programmiert man z.B. ein Dateisystem? Es gibt stets verschiedene technische Möglichkeiten zur Implementierung; als Informatiker sollte man die verschiedenen Techniken kennen und die beste auswählen können. Kriterien sind z.B. Dauer, Wiederverwendbarkeit. \end_deeper \layout Itemize C/C++ - API des Betriebssystems \begin_deeper \layout Itemize Prozesskontrollaufrufe. Dies wird sehr intensiv behandelt. \layout Itemize Dateisysteme. \layout Itemize Interprozesskommunikation. \begin_deeper \layout Itemize Pipes. \layout Itemize Socket-Schnittstelle zur Netzwerkkommunikation. \end_deeper \end_deeper \layout Itemize Kommandoschnittstelle. Es wird in der Hausübung ein Unix-Kommandointerpreter geschrieben. Vorteile gegenüber GUI: \begin_deeper \layout Itemize Es steht eine wesentlich größere Funktionsfülle zur Verfügung. Viele Systemdienste sind von der GUI aus nicht benutzbar. \layout Itemize Benutzt man als »Poweruser« einen Rechner für sehr verschiedene Aufgaben, muss man effizient arbeiten. Man sollte komplexe Funktionen schnell zur Verfügung haben. Diese Automatisierung von Arbeitsabläufen kann sehr gut über Shell-Skripte der Kommandoschnittstelle realisiert werden. In der Vorlesung Betriebssysteme\SpecialChar ~ 1 wird der Kommandointerpreter bash gelernt. \end_deeper \layout Subsubsection Stoffüberblick \layout Enumerate Einführung. Was ist ein Betriebssystem? Grundbegriffe. Arten von Betriebssystemen. Modelle zur Architektur von Betriebssystemen. \layout Enumerate Prozesse und Threads. Dies sind zwei verschiedene Konzepte zur Nebenläufigkeit (concurrency). \layout Enumerate Synchronisation nebenläufiger Aktivitäten. Notwendig, wenn nebenläufige Aktivitäten gekoppelt sind. Auch hinter Unix-Pipes sind solche Synchronisationsmechanismen zu finden! \layout Enumerate Verklemmungen (deadlocks) \layout Enumerate Speicherverwaltung. Ein komplexes Thema, weil viele verschiedene Programme gleichzeitig den Hauptspeicher benutzen. Diese Funktionalität ist schwierig, weil sehr stark auf Geschwindigkeitsanforde rungen geachtet werden muss (ansonsten wäre das Thema nur 25% so komplitziert ...). \layout Enumerate Prozessorvergabe (processor scheduling). Betrachtet werden Ein- und Mehrprozessorsysteme. \layout Enumerate Dateisysteme. Partitionierung; Nutzung der Partitionen; Organisationsmöglichkeiten für Dateisysteme. \layout Enumerate Ein- und Ausgabe. Gerätetreiber; wie organisiert das Betriebssystem Ein- und Ausgabe?; wie kapselt man hardwareabhängige Software in Treibern?. \layout Enumerate Kommunikation im Netz. Kurze Behandlung des OSI-Schichtenmodells; wie ist die Benutzung von Netzwerkpr otokollen im Betriebssystem verankert; Socket-API und ihre Programmierung. Die Socket-API ist eine Programmierschnittstelle, die unabhängig vom verwendete n Transportprotokoll (etwa TCP/IP, IPX/SPX, Pipes) ist. \layout Enumerate Einführung in verteilte Systeme (sofern noch Zeit zur Verfügung steht). Eine einfache Möglichkeit ist die Client/Server-Architektur, eine komplexere Möglichkeit Middleware-Software wie CORBA. \layout Section Stoffzusammenfassung \layout Standard Die folgende kurze Zusammenfassung des Lehrstoffs sollte man möglichst auswendig beherrschen, da in der Klausur keine Hilfsmittel benutzt werden dürfen. Die Zusammenfassung ist so aufbereitet, dass sie einfach auswendig gelernt werden kann. Hier sind nur Fakten enthalten, die man zum Lösen der (bisher verfügbaren) Aufgaben braucht; das außerdem notwendige Verständnis sollte man sich durch Lesen und Verstehen der Skripte aneignen. \layout Standard Syntax und Standardbibliothek von C und C++ werden hier nicht aufgeführt, sondern vorausgesetzt. Syntax und Sematik der benötigten Systemfunktionen werden hier allerdings behandelt. \layout Subsection \begin_inset LatexCommand \label{kap.ProzessDesk} \end_inset Prozessdeskriptor \layout Standard Nach \begin_inset LatexCommand \cite[S.18]{JaegerSkript} \end_inset . Der Eintrag zu einem Prozess in der Prozesstabelle. Er enthält: \layout Description PID Prozessidentifikationsnummer \layout Description Priorität \layout Description Zustand Hauptsächlich \begin_inset Quotes ald \end_inset ausführend \begin_inset Quotes ard \end_inset , \begin_inset Quotes ald \end_inset bereit \begin_inset Quotes ard \end_inset oder \begin_inset Quotes ald \end_inset blockiert \begin_inset Quotes ard \end_inset . \layout Description Zugriffsrechtsdeskriptor Rechte des Prozesses an Ressourcen. \layout Description Dateideskriptoren Bei UNIX Verweise auf Einträge in die globale Dateitabelle. \layout Description Maschinenzustand Gesichert während Unterbrechungen: Register, Programmzähler, Statuswort usw. \layout Description Hauptspeicherdeskriptor Finden und Zugreifen auf die Speichersegmente des Prozesses. \layout Description Ressourcenverbrauch Für Abrechnungs- und Kontrollzwecke. \layout Standard checksum: 8 P-P-Zu-Zu-Da-Ma-Ha-Re \layout Subsection Dateisystem \layout Subsection Include-Dateien \layout Standard \begin_inset Note collapsed true \layout Standard ToDo: Zusammenstellung aller relevanten Include-Dateien \layout Standard mit ihrem jeweiligen Inhalt. Auswendig zu lernen. Wenn ich \layout Standard dann nicht mehr weiß, welche Include-Dateien genau zu \layout Standard verwenden sind, kann ich einfach alle angeben. Denn besser \layout Standard zuviel als zuwenig ... \end_inset \layout Subsection Signalbehandlung \layout Standard Wichtige Signale (vgl. \begin_inset LatexCommand \cite{ManSignal} \end_inset ) in \family typewriter signal.h \family default : \layout Description SIGINT Prozessunterbrechung durch Tastatur. Standardaktion: Prozessterminierung. \layout Description SIGKILL Z.B. durch \family typewriter kill pid \family default . Standardaktion: Prozessterminierung. Kann nicht aufgefangen oder ignoriert werden. \layout Description SIGPIPE Nach Schreiben in eine Pipe ohne Leser. Standardaktion: Prozessterminierung. \layout Description SIGCHLD Subprozess stoppte oder terminierte. Standardaktion: ignorieren. \layout LyX-Code \size small #include //for sigaction, SIGCHLD, sigemptyset \layout LyX-Code \size small #include //for perror \layout LyX-Code \size small #include //for wait(int *status) \layout LyX-Code \layout LyX-Code \size small struct sigaction oldAction, newAction; \layout LyX-Code \layout LyX-Code \size small void chldHandler(int signum) { //SIGCHLD handler \layout LyX-Code \size small //we know that a child is now a zombie. By wait() \layout LyX-Code \size small //we make it terminate finally, without knowing the childs pid \layout LyX-Code \size small wait(0); \layout LyX-Code \size small //reset SIGCHLD handling, as the child terminated now: \layout LyX-Code \size small sigaction(SIGCHLD, &oldAction, NULL); \layout LyX-Code \size small } \layout LyX-Code \layout LyX-Code \size small int main() { \layout LyX-Code \size small newAction.sa_handler = &chldHandler; //signal handler function \layout LyX-Code \size small newAction.sa_flags = 0; \layout LyX-Code \size small sigemptyset(&newAction.sa_mask); //ignore no signals \layout LyX-Code \size small if (sigaction(SIGCHLD, &newAction, &oldAction) ==-1) \layout LyX-Code \size small perror("main: Fehler bei sigaction()"); \layout LyX-Code \size small } \layout Subsection Subprozesse mit \family typewriter fork() \layout Standard Das folgende Beispiel basiert auf \begin_inset LatexCommand \cite[S. 2-3]{JaegerProzesse} \end_inset . \layout LyX-Code \size small #include //for pid_t fork(), pid_t vfork(), getpid(), getppid \layout LyX-Code \size small #include //for perror() \layout LyX-Code \size small #include //for pid_t \layout LyX-Code \size small #include //for exit \layout LyX-Code \size small #include \layout LyX-Code \size small using namespace std; \layout LyX-Code \size small \layout LyX-Code \size small main(){ \layout LyX-Code \size small pid_t chldPid, myPid; //in normal case pid_t = "unsigned long" \layout LyX-Code \size small cout << "Before fork(), PID= " << (myPid = getpid()) << endl; \layout LyX-Code \size small switch (chldPid=fork()) { \layout LyX-Code \size small case -1: perror("fork() failure \backslash n"); exit(1); \layout LyX-Code \size small break; \layout LyX-Code \size small case 0: cout << "I'm child: PID= " << (myPid=getpid()) \layout LyX-Code \size small << ", parent PID= " << getppid() << endl; \layout LyX-Code \size small break; \layout LyX-Code \size small default: cout << "I'm parent: after fork, child PID= " \layout LyX-Code \size small << chldPid; \layout LyX-Code \size small break; \layout LyX-Code \size small } \layout LyX-Code \size small cout << "I'm child or parent: I finish work, my PID= " \layout LyX-Code \size small << myPid << endl; \layout LyX-Code \size small exit(0); \layout LyX-Code \size small } \layout Standard Ausgabe des Beispielprogramms etwa (vgl. \begin_inset LatexCommand \cite[S. 3]{JaegerProzesse} \end_inset ): \layout LyX-Code \size small Before fork(), PID= 453 \layout LyX-Code \size small I'm parent: after fork, child PID= 454 \layout LyX-Code \size small I'm child or parent: I finish work, my PID= 453 \layout LyX-Code \size small I'm child: PID= 454, parent PID= 1 \layout LyX-Code \size small I'm child or parent: I finish work, my PID= 454 \layout Subsection Prozessterminierung mit \family typewriter exit \layout LyX-Code \size small #include \layout LyX-Code \size small void exit(int status); //0: normal termination; 1: error \layout Standard Der Exitstatus eines Subprozesses kann der Elternprozess mit \family typewriter wait \family default oder \family typewriter waitpid \family default erfahren. \layout Subsection Warten auf Subprozesse mit \family typewriter wait \family default und \family typewriter waitpid \layout LyX-Code \size small #include \layout LyX-Code \size small #include \layout LyX-Code \size small \layout LyX-Code \size small pid_t wait(int *status) \layout LyX-Code \size small pid_t waitpid(pid_t pid, int *status, int options); \layout Standard Codebruchstück: Warten auf Subprozesterminierung, Art der Terminierung bestimmen (aus \begin_inset LatexCommand \cite[S. 9]{JaegerProzesse} \end_inset ): \layout LyX-Code \size small // Warten auf Subprozess-Ende \layout LyX-Code \size small waitpid(kind_pid, &kind_status, 0); \layout LyX-Code \size small // normale Terminierung mit exit ? \layout LyX-Code \size small if (WIFEXITED(kind_status)) \layout LyX-Code \size small // normale Terminierung, exit-Argument ausgeben \layout LyX-Code \size small cout << "Subprozess-Status:" << WEXITSTATUS(kind_status) << endl ; \layout LyX-Code \size small else if (WIFSIGNALED(kind_status)) // Terminierung durch Signal, welches ? \layout LyX-Code \size small cout << "Subprozess durch Signal abgebrochen, Signalnummer:" \layout LyX-Code \size small << WTERMSIG(kind_status) << endl; \layout Subsection Aufruf externer Programme mit \family typewriter exec \layout Standard Auszug aus \begin_inset LatexCommand \cite{ManExec} \end_inset , weitere Informationen dort. \layout LyX-Code \size small #include //for exec function family \layout LyX-Code \size small extern char **environ; \layout LyX-Code //exec with line \layout LyX-Code \size small int execl( const char *path, const char *arg, ...); \layout LyX-Code //exec with line, path \layout LyX-Code \size small int execlp( const char *file, const char *arg, ...); \layout LyX-Code //exec with line, path, environment \layout LyX-Code \size small int execle( const char *path, const char *arg , ..., char * const envp[]); \layout LyX-Code //exec with vector \layout LyX-Code \size small int execv( const char *path, char *const argv[]); \layout LyX-Code //ecev with vector, path \layout LyX-Code \size small int execvp( const char *file, char *const argv[]); \layout Subsection Dateibehandlung \layout Standard Verwende zum Lernen die Liste »Wichtige Systemaufrufe des Dateisystems« \begin_inset LatexCommand \cite[S. 16]{JaegerDateisystem} \end_inset . \layout Subsection Pipes und Ein-/Ausgabeumlenkung \layout Standard Verwende zum Lernen die Kapitel »7.4.13 pipe -- Öffnen einer unbenannten Pipe« und »7.4.14 dup -- Dateideskriptor duplizieren« in \begin_inset LatexCommand \cite[S. 19-22]{JaegerDateisystem} \end_inset . Kommentierter Code zur Verwendung von Pipes und Ein- Ausgabeumlenkung ist enthalten in der beiligenden Datei \family typewriter Aufg.Klausur.2000-03-09.03.cc \family default . \layout Subsection Shellprogrammierung \layout Part Lösungen \layout Section Übungsaufgaben \layout Standard Die Aufgaben stammen aus der Veranstaltung »Betriebssysteme\SpecialChar ~ 1« bei Prof. Dr. Michael Jäger (FH Gießen-Friedberg) aus dem Wintersemester 2002/2003. Es werden nur die Aufgabenstellungen und Lösungen der nichttrivialen Aufgaben angegeben. \layout Subsection Skript: Peterson-Algorithmus \layout Standard Es soll bewiesen werden, dass der Peterson-Algorithmus verklemmungsfrei ist \begin_inset LatexCommand \cite[S. 46]{JaegerSkript} \end_inset . Definition von \begin_inset Quotes ald \end_inset Verklemmung \begin_inset Quotes ard \end_inset in \begin_inset LatexCommand \cite[S. 63]{JaegerSkript} \end_inset , Kapitel \begin_inset Quotes ald \end_inset 5.2. Systemmodell \begin_inset Quotes ard \end_inset : \begin_inset Quotes ald \end_inset Eine Menge von Prozessen heißt verklemmt, wenn jeder Prozess in der Menge auf eine Ressource wartet, die von einem anderen Prozess in der Menge reservier t ist. \begin_inset Quotes ard \end_inset Der Peterson-Algorithmus wird hier nur zum gegenseitigen Ausschluss von 2 threads angewandt, auch der Beweis in \begin_inset LatexCommand \cite[S. 46]{JaegerSkript} \end_inset beschränkt sich auf 2 Threads. \layout Standard Beweis durch Widerspruchsbeweis. Dazu Annahme: der Peterson-Algorithmus ist nicht verklemmungsfrei, d.h. es kann einen Zeitpunkt geben, zu dem Thread \begin_inset Formula $P_{1}$ \end_inset in der busy-wait-Schleife auf \begin_inset Formula $P_{2}$ \end_inset wartet und gleichzeitig \begin_inset Formula $P_{2}$ \end_inset in der busy-wait-Schleife auf \begin_inset Formula $P_{1}$ \end_inset wartet. Dazu müssen nach dem Sourcecode folgende Bedigungen gleichzeitig erfüllt sein: \begin_inset Formula \begin{eqnarray} turn & = & 1\label{eq.turn1}\\ interested\left[1\right] & = & true\nonumber \\ turn & = & 2\label{eq.turn2}\\ interested\left[2\right] & = & true\nonumber \end{eqnarray} \end_inset Offensichtlich widerspricht Gleichung \begin_inset LatexCommand \ref{eq.turn1} \end_inset Gleichung \begin_inset LatexCommand \ref{eq.turn2} \end_inset . Die vier Bedingungen können also nicht gleichzeitig wahr sein, also muss die Annahme falsch sein, die zu dieser Forderug führte, nämlich dass der Peterson-Algorithmus nicht verklemmungsfrei ist. Also ist der Peterson-Algorithmus verklemmnungsfrei. \layout Subsection Übungsblatt 1, Aufgabe 1 (Umgang mit der Shell) \layout Description b) »Verwenden Sie den "ps"-Befehl, um herauszfinden, welche Prozesse unter ihrer Benutzeridentidentifikation existieren und welche Prozessnummern diese Prozesse haben. \begin_inset Quotes ard \end_inset Man verwende \family typewriter ps --User=my_username \family default und setze entsprechend seinen eigenen Benutzernamen ein. \layout Description c) »Verwenden Sie den "kill"-Befehl, um einen ihrer Prozesse zu terminieren.« Nachdem man mit \family typewriter ps \family default die PID \begin_inset Formula $n$ \end_inset des zu killenden Prozesses erfahren hat, verwendet man: \family typewriter kill \family default \begin_inset Formula $n$ \end_inset . \layout Subsection Übungsblatt 1, Aufgabe 2 \layout Subsection Übungsblatt 1, Aufgabe 3 \layout Subsection Übungsblatt 2, Aufgabe 1 \layout Itemize \begin_inset Quotes ald \end_inset Überlegen Sie zuhause: Kann es passieren, dass folgende Systemaufrufe fehlschlag en? Wenn ja, welche Gründe könnte es dafür geben? \begin_inset Quotes ard \end_inset \begin_deeper \layout Itemize \family typewriter fork \family default : \begin_deeper \layout Itemize nicht genügend Hauptspeicher frei zum Kopieren des Prozesses \layout Itemize maximale Anzahl der im Mutitasking parallel laufenden Prozesse erreicht \end_deeper \layout Itemize \family typewriter execlp \family default : \begin_deeper \layout Itemize angegebenes Programm \family typewriter file \family default kann in den Pfaden der Umgebungsvariable \family typewriter PATH \family default nicht gefunden werden \layout Itemize Datei \family typewriter file \family default existiert zwar, ist aber kein Programm oder sie ist ein Programm, das aber vom effektiven Benutzer nicht ausgeführt werden darf \layout Itemize Liste der Argumente ist nicht \family typewriter NULL \family default -terminiert \end_deeper \layout Itemize \family typewriter waitpid \family default : \begin_deeper \layout Itemize es existiert kein Prozess mit der übergebenen PID \layout Itemize Prozess mit der übergebenen PID terminiert nicht vor Terminierung des aufrufende n Prozesses, was z.B. für \family typewriter init \family default (PID 1) gilt \end_deeper \end_deeper \layout Itemize \begin_inset Quotes ald \end_inset In welcher Weise kann im Programm das Scheitern eines Systemaufrufs überprüft werden? Wie erfährt man die Fehlerursache? Schlagen Sie dazu im Online-Manual die Erklärung von execlp nach. \begin_inset Quotes ard \end_inset Bei Fehlern kehren die \family typewriter exec \family default -Funktionen mit einem Rückgabewert \family typewriter -1 \family default zurück (ansonsten kehrt keine der \family typewriter exec \family default -Funktionen jemals zurück). Die globale Variable \family typewriter errno \family default enthält dann die Nummer des aufgetretenen Fehlers; die Beschreibung des Fehlers gibt der Aufruf der Funktion \family typewriter perror \family default aus. \layout Itemize \begin_inset Quotes ald \end_inset Wieso ist es günstig, bei einem fehlgeschlagenen Systemaufruf die perror-Funktio n zur Ausgabe der Fehlermeldung zu verwenden, anstelle von \family typewriter cerr << ... \family default ? \begin_inset Quotes ard \end_inset Weil \family typewriter perror \family default zusätzlich zum übergebenen Text eine Beschreibung des aufgetretenen Fehlers ausgibt, durch Auswertung der Fehlernummer in der globalen Variable \family typewriter errno \family default . \layout Subsection \begin_inset LatexCommand \label{kap.Aufg2.2} \end_inset Übungsblatt 2, Aufgabe 2 \layout Standard »Schreiben Sie ein Programm \family typewriter aktiviere \family default , dass zwei neue Prozesse erzeugt, um nebenläufig 2 weitere Programme aufzurufen und diesen Parameter übergeben, nämlich \family typewriter xterm -e top \family default und \family typewriter netscape http://www.fh-giessen.de/WEB_MNI \family default . Ihr Programm \family typewriter aktiviere \family default gibt zuerst für beide Programme die Prozessnummern auf den Bildschirm aus. Dann wartet es die Terminierung beider Prozesse ab und zeigt auf dem Bildschirm an, ob \family typewriter xterm \family default oder \family typewriter netscape \family default zuerst beendet wurde. \begin_inset Quotes ard \end_inset \layout Standard Lösung enthalten in Kapitel \begin_inset LatexCommand \ref{kap.Aufg2.3} \end_inset . \layout Subsection \begin_inset LatexCommand \label{kap.Aufg2.3} \end_inset Übungsblatt 2, Aufgabe 3 \layout Standard \begin_inset Quotes ald \end_inset Das im \family typewriter xterm \family default -Fenster ablaufende Programm \family typewriter top \family default kann mit \family typewriter Ctrl-C \family default abgebrochen werden. Probieren Sie es aus. Erweitern Sie dann \family typewriter aktiviere \family default wie folgt: \family typewriter xterm \family default und damit auch dessen Kindprozess \family typewriter top \family default sollen das Signal \family typewriter SIGINT \family default ignorieren, das durch die \family typewriter Ctrl-C \family default -Taste generiert wird. Dazu muss in dem Prozess eine entsprechende Signalbehandlung für dieses Signal vereinbart werden. Wenn in einem Prozess ein Signal ignoriert wird, bleibt diese Einstellung auch bei einem Wechsel in ein anderes Programm (z.B. mit execlp) bestehen. Sie können also die Signalbehandlung vor dem Aufruf von \family typewriter xterm \family default in \family typewriter aktiviere \family default vornehmen. Benutzen Sie dazu \family typewriter sigaction \family default , das im Skript und im Onlinemanual erklärt ist. \begin_inset Quotes ard \end_inset \layout Standard Die Lösung ist in der beiligenden Datei \family typewriter Aufg.2.3.cc \family default enthalten. \layout Subsection Übungsblatt 3, Aufgabe 1 \layout Standard \begin_inset Quotes ald \end_inset Schreiben Sie ein Programm, in dem ein Subprozess erzeugt und eine Datei namens \family typewriter begruessung \family default erstellt wird, mit folgenden Varianten:« \layout Description a) \begin_inset Quotes ald \end_inset Der Subprozess erstellt die Datei mit dem Inhalt \begin_inset Quotes ald \end_inset Guten Morgen! \begin_inset Quotes ard \end_inset . Der Elternprozess wartet, bis der Subprozess fertig ist, öffnet und liest die Datei und gibt den Inhalt auf den Bildschirm aus. \begin_inset Quotes ard \end_inset \newline Auf dem Bildschirm steht \begin_inset Quotes ald \end_inset Guten Morgen! \begin_inset Quotes ard \end_inset Der Kontrollfluss ist hier äquivalent zu einer Sequenz, in der die Datei erstellt, geschlossen und wieder geöffnet wird, es findet also niemals gleichzeitiger Dateizugriff statt. \layout Description b) \begin_inset Quotes ald \end_inset Der Subprozess schreibt in die Datei \begin_inset Quotes ald \end_inset Guten « und terminiert. Der Elternprozess wartet, bis der Subprozess fertig ist, und schreibt in die Datei \begin_inset Quotes ald \end_inset Morgen! \begin_inset Quotes ard \end_inset . Überlegen Sie, was anschließend Ihrer Meinung nach in der Datei steht? Prüfen Sie es nach! \begin_inset Quotes ard \end_inset \newline Voraussetzung: der Elternprozess hat die Datei erstellt und zum Schreiben geöffnet. Danach wird der Subprozess mit \family typewriter fork() \family default erstellt, d.h. er erhält eine Kopie der Deskriptorentabelle des Elternprozesses, also mit den Verweisen auf die gleichen Einträge in der globalen Dateitabelle. Es wird also ein gemeinsames Offset verwendet \begin_inset LatexCommand \cite[S. 13]{JaegerDateisystem} \end_inset . Nach Ende des Subprozesses verwendet der Elternprozess also den aktuellen Wert des Offsets, er hängt »Morgen!« an. Auf dem Bildschirm steht am Ende also wieder »Guten Morgen!« (Lösung muss noch im Programm geprüft werden). \layout Description c) \begin_inset Quotes ald \end_inset Wie oben, aber der Subprozess setzt vor seiner Terminierung mit \family typewriter lseek \family default seine Lese-/Schreibposition auf \family typewriter 0 \family default . Was steht anschließend in der Datei? \begin_inset Quotes ard \end_inset Es wird ein gemeinsames Offset verwendet, der Elternprozess beginnt also ab Position 0 zu schreiben. In der Datei steht damit am Ende »Morgen!«. \layout Description d) \begin_inset Quotes ald \end_inset Wie oben, aber beide Prozesse öffnen erst nach dem \family typewriter fork() \family default die Datei. Welche Auswirkungen hat das auf den Dateiinhalt? \begin_inset Quotes ard \end_inset Es wird kein gemeinsames Offset mehr verwendet, d.h. das Setzen der Lese-/Schreibposition im Subprozess hat keinerlei Auswirkung auf den Elternprozess. Beide schreiben also ab Position 0, zuerst der Subprozess (»Guten «), danach der Elternprozess, der auf das Ende des Subprozesses gewartet hat (»Morgen!«). Der Inhalt der Datei ist am Ende wieder »Morgen!«. \layout Subsection Übungsblatt 3, Aufgabe 2 \layout Standard Es gibt zwei Ebenen von gegenseitigem Ausschluss bei Zugriff auf dieselben Dateien: \layout Itemize Der Kernel garantiert, dass ein einzelner Schreib- oder Lesezugriff nicht durch einen anderen Zugriff unterbrochen wird. Das geschieht unabhängig von Dateisperren automatisch bei jedem Schreib- oder Lesezugriff und lässt auch zu, dass eine Datei mehrmals gleichzeitig zum Schreiben geöffnet ist. So werden Wettbewerbsbedingen verhindert, die einzelne Datensätze einer Datei zerstören oder defekte einzelne Datensätze beim Lesen liefern würden. \lang english \lang german Diese Art der Synchronisation beim Dateizugriff ist in der Aufgabenstellung dieser Aufgabe nicht gemeint! \layout Itemize Der Benutzer muss durch Dateisperren (in \family typewriter fcntl \family default ) oder exklusives Öffnen \family typewriter O_EXCL \family default garantieren, dass mehrere hintereinanderfolgende Schreibzugriffe nicht unterbrochen werden und so eine unbeabsichtigte Reihenfolge der Datensätze entstehen würde. Diese Art der Synchronisation beim Dateizugriff ist in der Aufgabenstellung dieser Aufgabe gemeint! \layout Standard \begin_inset Quotes ald \end_inset Geben Sie für die möglichen Zugriffskombinationen an, ob blockiert wird:« \layout Itemize \begin_inset Quotes ald \end_inset Schreiber blockiert Schreiber: ja \begin_inset Quotes ard \end_inset \newline Der nun blockierte Schreiber hatte versucht, mit \family typewriter F_SETLKW \family default ein \family typewriter F_WRLK \family default zu setzen, während ein \family typewriter F_WRLK \family default gesetzt war. \layout Itemize \begin_inset Quotes ald \end_inset Schreiber blockiert Leser: ja \begin_inset Quotes ard \end_inset \newline Der nun blockierte Leser hatte versucht, mit \family typewriter F_SETLKW \family default ein \family typewriter F_RDLK \family default zu setzen, während ein \family typewriter F_WRLK \family default gesetzt war. \layout Itemize \begin_inset Quotes ald \end_inset Leser blockiert Schreiber: ja \begin_inset Quotes ard \end_inset \newline Der nun blockierte Schreiber hatte versucht, mit \family typewriter F_SETLKW \family default ein \family typewriter F_WRLK \family default zu setzen, während ein \family typewriter F_RDLK \family default gesetzt war. \layout Itemize \begin_inset Quotes ald \end_inset Leser blockiert Leser: nein \begin_inset Quotes ard \end_inset \newline Es ist dem Leser möglich, mit \family typewriter F_SETLKW \family default ein \family typewriter F_RDLK \family default zu setzen, während ein oder mehrere andere \family typewriter F_RDLK \family default gesetzt sind. \layout Subsection Übungsblatt 4, Aufgabe 1 \layout Standard Die Lösung ist in den Dateien im beiliegenden Verzeichnis \family typewriter Aufg.4.1 \family default enthalten. \layout Subsection Übungsblatt 5, Aufgabe 1 \layout Description a) Mit dem cat-Kommando soll in eine Datei der Text \begin_inset Quotes ald \end_inset hallo \begin_inset Quotes ard \end_inset geschrieben werden. \begin_deeper \layout LyX-Code echo hallo | cat - >hallo.txt \end_deeper \layout Description b) Falls im aktuellen Verzeichnis kein Unterverzeichnis namens \begin_inset Quotes ald \end_inset tmp \begin_inset Quotes ard \end_inset vorhanden ist, soll eines erzeugt werden. Die Zugriffsrechte: Lesen/Schreiben/Ausführen für den Eigentümer. \begin_deeper \layout LyX-Code test ! -d tmp && mkdir tmp && chmod 700 tmp \end_deeper \layout Description c) In allen normalen Dateien ihres Heimatverzeichnisses, deren Namen mit \begin_inset Quotes ald \end_inset c \begin_inset Quotes ard \end_inset , \begin_inset Quotes ald \end_inset C \begin_inset Quotes ard \end_inset , \begin_inset Quotes ald \end_inset cpp \begin_inset Quotes ard \end_inset oder \begin_inset Quotes ald \end_inset CPP \begin_inset Quotes ard \end_inset enden, soll nach dem Wort \begin_inset Quotes ald \end_inset class \begin_inset Quotes ard \end_inset gesucht werden. \begin_deeper \layout LyX-Code find ~ -type f -a \backslash ( -iname *c -or -iname *cpp \backslash ) | xargs grep -F "class" \end_deeper \layout Subsection Übungsblatt 5, Aufgabe 2 \layout Standard Die Lösung ist in der beiligenden Datei \family typewriter Aufg.5.2.bash \family default enthalten. \layout Section Klausur 2000-03-09 \layout Standard Da es sich um eine studentische, ungeprüfte Lösung handelt, können natürlich Fehler enthalten sein. \layout Subsection Aufgabe 1 (Prozesse - 4 Punkte) \begin_inset Note collapsed true \layout Standard Erreicht: 4 Punkte \end_inset \layout Standard Antwort siehe Kapitel \begin_inset LatexCommand \ref{kap.ProzessDesk} \end_inset . \layout Subsection Aufgabe 2 (Prozesse - 4 Punkte) \begin_inset Note collapsed true \layout Standard Erreicht: 4 Punkte \end_inset \layout Standard Verdrängung eines Prozesses durch einen anderen: das Betriebssystem speichert den Zustand des zu verdrängenden Prozesses im Prozessdeskriptor ab (Inhalt der Register, u.a. des Befehlszählers), so dass der momentane Zustand des Prozesses später wiederhergestellt werden kann, und stellt den (abgespeicherten) Zustand des vorher blockierten Prozesses wieder her: Inhalt der Prozessorregister setzen, Zustand auf »aktiv«, Befehlszähler auf gespeicherten Wert setzen. Das Betriebssystem »merkt« den Zustandswechsel, weil es ihn selbst durchführt: der Zustand eines Prozesses wird im Prozessdeskriptor gespeichert und geändert, der vom Betriebssystem verwaltet wird. Auch ein aktiver Prozess hat nicht ununterbrochen den Prozessor, denn der regelmäßige CLOCK-Interrupt übergibt die Kontrolle an das Betriebssystem, das dann den bisher aktiven Prozess verdrängen oder fortführen kann. \layout Subsection \begin_inset Note collapsed true \layout Standard 3:42h Dauer. Die letzten 2:42h mit Hilfsmitteln! \end_inset Aufgabe 3 (Prozesskontrolle, Pipes, E-/A-Umlenkung - 10 Punkte ) \begin_inset Note collapsed true \layout Standard Erreicht: 10 Punkte \end_inset \layout Standard Weil an der FH Gießen-Friederg nun C++ statt C gelehrt wird, würde die Aufgabens tellung in einer aktuellen Klausur sein: \begin_inset Quotes ald \end_inset Schreiben Sie ein C++-Programm, das die Anzahl der Zeilen in der Ausgabe des Kommandos " \family typewriter ls -l \family default " ausgibt. Dazu soll das \family typewriter ls \family default -Programm als Subprozess ausgeführt werden, der seine Ausgabe durch eine Pipe an den Vaterprozess leitet. \begin_inset Quotes ard \end_inset \layout Standard Die Lösung ist enthalten in der beiligenden Datei \family typewriter Aufg.Klausur.2000-03-09.03.cc \family default enthalten. \layout Subsection \begin_inset Note collapsed true \layout Standard Dauer: 0:45h inkl. Nachlesen im Skript \end_inset Aufgabe 4 (Synchronisation - 8 Punkte) \layout LyX-Code \size small class semaphor { \layout LyX-Code \size small public: \layout LyX-Code \size small semaphor(void); \layout LyX-Code \size small init(int anfangswert); // Initialisierung \layout LyX-Code \size small up(void); \layout LyX-Code \size small down(void); \layout LyX-Code \size small }; \layout LyX-Code \size small class pipe { \layout LyX-Code \size small private: \layout LyX-Code \size small int puffergroesse; \layout LyX-Code \size small char *puffer; \layout LyX-Code \size small int frei, naechsteszeichen; \layout LyX-Code \size small semaphor kritisch, belegt, //Korrektur der Aufgabenstellung \layout LyX-Code \size small vorhanden; \layout LyX-Code \size small public: \layout LyX-Code \size small pipe(int groesse); \layout LyX-Code \size small void put(char c); \layout LyX-Code \size small char get(void); \layout LyX-Code \size small }; \layout LyX-Code \size small pipe::pipe(int groesse) { \layout LyX-Code \size small puffergroesse=groesse; \layout LyX-Code \size small puffer=new char[groesse]; //Korrektur der Aufgabenstellung \layout LyX-Code \size small frei=0; \layout LyX-Code \size small naechsteszeichen=0; \layout LyX-Code \size small kritisch.init(1); \layout LyX-Code \size small belegt.init(0); \layout LyX-Code \size small vorhanden.init(groesse); \layout LyX-Code \size small } \layout LyX-Code \size small void pipe::put(char c) { \layout LyX-Code \size small vorhanden.down(); //freie Plaetze sind Ressourcen; eine fuer mich! \layout LyX-Code \size small kritisch.down(); //kritischer Bereich ist eine Ressource \layout LyX-Code \size small puffer[frei]=c; \layout LyX-Code \size small frei = (frei+1) % groesse; \layout LyX-Code \size small kritisch.up(); \layout LyX-Code \size small belegt.up(); //Zeichen sind Ressourcen \layout LyX-Code \size small } \layout LyX-Code \size small char pipe::get() { \layout LyX-Code \size small belegt.down(); \layout LyX-Code \size small kritisch.down(); \layout LyX-Code \size small int c=puffer[naechsteszeichen]; \layout LyX-Code \size small naechsteszeichen = (naechsteszeichen+1) % groesse; \layout LyX-Code \size small return c; \layout LyX-Code \size small kritisch.up(); \layout LyX-Code \size small vorhanden.up(); \layout LyX-Code \size small } \layout Subsection \begin_inset Note collapsed true \layout Standard Dauer: 1:27h inkl. Nachlesen im Skript \end_inset Aufgabe 5 (Shellskript - 6 Punkte) \layout Standard Die Lösung ist enthalten in der beiligenden Datei \family typewriter Aufg.Klausur.2000-03-09.05.bash \family default enthalten. Testdateien sind in den beiliegenden Dateien \family typewriter Aufg.Klausur.2000-03-09.05.test1.txt.gz \family default und \family typewriter Aufg.Klausur.2000-03-09.05.test2.txt \family default enthalten. \layout Subsection Aufgabe 6 (Verklemmungen - 4 Punkte) \layout Standard Siehe \begin_inset LatexCommand \cite[S. 68-70]{JaegerSkript} \end_inset . Zum besseren Verständnis kann man Kanten, die zu später benötigten Ressourcen zeigen, mit »anforderbar« bezeichnen, die anderen beiden Kantenarten mit »angefordert« bzw. »erhalten«. Da das Beispiel in der Aufgabenstellung fehlt, kann sie hier nicht gelöst werden. \layout Subsection Aufgabe 7 (Hauptspeicher - 2+2 Punkte) \layout Description a) \begin_inset Quotes ald \end_inset Welche Möglichkeiten der Verwaltung freier Speicherblöcke (Platte oder Hauptspei cher) kennen Sie? \begin_inset Quotes ard \end_inset Siehe \begin_inset LatexCommand \cite[S. 79-81]{JaegerSkript} \end_inset : \begin_deeper \layout Itemize Partitionsverwaltung mit verketteten Listen. Das Betriebssystem verwaltet die freien Hauptspeicherbereiche in einer Freiliste (doppelt verkettete Liste, jedes Element enthält Anfangsadresse und Größe der Partition). Strategien zur Auswahl eines freien Bereichs bei Aufruf eines Programms, sowohl bei fester als auch bei variabler Partitionierung: \begin_deeper \layout Itemize first fit \layout Itemize best fit \layout Itemize worst fit \layout Itemize quick fit \end_deeper \layout Itemize Buddy-System. Vergibt Speicherplatz in Blockgrößen, die Zweierpotenzen sind. Dadurch schnelle Verschmelzung benachbarter freier Blöcke, aber starke interne Fragmentierung. \layout Itemize Bitmap-basierte Verwaltung. Vielfache von Blöcken fester Größe als Zuteilungseinheit, verwaltet in Bitmaps. \layout Itemize Speicherkompaktierung. Zusammenschieben der belegten Bereiche, so dass stets ein einziger großer freier Bereich am Speicherende zur Verfügung steht. \layout Itemize Paging. Seiten als einzige Zuteilungseinheit, freie Seiten in der Seitenrahmentabelle verwaltet. \layout Itemize Liste freier Blöcke im Dateisystem, kombiniert aus direkter Liste, einfach indirekter Liste und doppelt indirekter Liste. \end_deeper \layout Description b) \begin_inset Quotes ald \end_inset Erläutern Sie, wie das Betriebssystem in einem System mit Paging und Segmentieru ng die Seiten-Seitenrahmenzuordnung eines \emph on segmentierten \emph default Prozesses verwaltet. \begin_inset Quotes ard \end_inset Siehe \begin_inset LatexCommand \cite[S. 93]{JaegerSkript} \end_inset . \layout Subsection \begin_inset Note collapsed true \layout Standard Dauer: 0:20h \end_inset Aufgabe 8 (Hauptspeicher - 4 Punkte) \begin_inset Note collapsed true \layout Standard Erreicht: 2 Punkte \end_inset \layout Description FIFO Tritt ein Seitenfehler auf (angeforderte Seite in keinem der drei Rahmen enthalten), so wird derjenige Rahmeninhalt ersetzt, der schon am längsten konstant ist. Man prüft also, beginnend bei Rahmen 1, welcher Rahmen in den meisten unmittelb ar vorhergehenden Spalten unveränderten Inhalt hatte. \newline \begin_inset Tabular \begin_inset Text \layout Standard angeforderte Seite \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard danach Rahmen 1: \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard danach Rahmen 2: \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard danach Rahmen 3: \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \end_inset \newline Seitenfehler: 12 \layout Description OPT Tritt ein Seitenfehler auf, so wird derjenige Rahmeninhalt ersetzt, der in Zukunft für die längste Zeit nicht mehr benötigt wird (also am besten gar nicht mehr, dann tritt bei Auslegerung auch kein Seitenfehler auf). \newline \begin_inset Tabular \begin_inset Text \layout Standard angeforderte Seite \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard danach Rahmen 1: \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $2$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $5$ \end_inset \end_inset \begin_inset Text \layout Standard danach Rahmen 2: \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $7$ \end_inset \end_inset \begin_inset Text \layout Standard danach Rahmen 3: \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $1$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $6$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \begin_inset Text \layout Standard \begin_inset Formula $4$ \end_inset \end_inset \end_inset \newline Seitenfehler: 9 \layout Subsection \begin_inset Note collapsed true \layout Standard Dauer: 0:17h \end_inset Aufgabe 9 (CPU-Scheduling - 3 Punkte) \layout Description Aufgabenstellung: \begin_inset Quotes ald \end_inset Zur Berücksichtigung von Prioritäten verwalten viele Scheduler separate Prozesswarteschlangen für jede Prioritätsstufe. Wie könnte man mit nur einer Warteschlange für alle nicht blockierten Prozesse und einer einfachen \begin_inset Quotes ald \end_inset round robin \begin_inset Quotes ard \end_inset -Strategie dafür sorgen, dass Prozesse mit hoher Priorität begünstigt werden? \begin_inset Quotes ard \end_inset \layout Description Lösung: Indem man einen Prozess bei Verdrängung nicht ans Ende der Warteschlange anreiht, sondern an der Position (vom Kopf der Warteschlange an, beginnend mit 1) einfügt, die seine Priorität angibt. Jede Priorität darf dabei nur einmal vorkommen. Das bedeutet: \begin_deeper \layout Itemize Der Prozess mit Priorität 1 wird, sofern er existiert, immer wieder an den Kopf der Warteschlange gestellt, bis er blockiert. So entsteht eine Art Echtzeitbetrieb. \layout Itemize Der Prozess mit Priorität 2 kommt jedes 2. mal dran. \layout Itemize Der Prozess mit Priorität 3 kommt jedes 3. mal dran. \layout Itemize \begin_inset Formula $\vdots $ \end_inset \layout Itemize Der Prozess mit Priorität \begin_inset Formula $n$ \end_inset kommt jedes \begin_inset Formula $n$ \end_inset . mal dran. \layout Standard Eine einfachere Lösung besteht darin, einem Prozess entsprechend seiner Priorität mehr oder weniger Prozessorzeit zuzuteilen und ihn nach Ablauf dieser Zeit wieder ans Ende der Warteschlange anzureihen. \end_deeper \layout Subsection Aufgabe 10 (Dateisystem - 4 Punkte) \layout Description Aufgabenstellung: \begin_inset Quotes ald \end_inset Wozu enthält bei einem UNIX-Dateisystem jeder Inode einen Referenzzähler? \begin_inset Quotes ard \end_inset \layout Description Lösung: Weil Inodes nur die Daten der Datei enthalten, nicht jedoch ihren Dateinamen definieren. Ein Indode kann mehrere Dateinamen haben (sog. Hardlinks), in solchen Fällen hat der Referenzzähler einen Wert größer \begin_inset Formula $1$ \end_inset . Nur wenn keine Referenz mehr auf einen Indode verweist (die »Datei keinen Namen mehr hat«), kann sie gelöscht weden. Dies kann daran erkannt werden, dass der Referenzzähler \begin_inset Formula $0$ \end_inset ist. \layout Description Aufgabenstellung: \begin_inset Quotes ald \end_inset Wenn ein Prozess in einem Mehrbenutzersystem, z.B. UNIX oder Windows NT, eine Datei öffnet, führt das Betriebssystem eine Zugriffsrechtsprüfung durch. Beschreiben Sie kurz, wie diese Prüfung typischerweise stattfindet, insbesonder e auch, welche Datenstrukturen das Betriebssystem zur Prüfung der Rechte braucht. \begin_inset Quotes ard \end_inset \layout Description Lösung: Bei Windows NT: die Kontrollinformationen einer Datei verwaltet das Betriebssystem in einer Datenstruktur »Dateikontrollblock«, in der u.a. auch der Dateideskriptor repräsentiert ist. Zu jedem Objekt, also auch zu jeder Datei, gehört eine ACL (Zugriffskontrolllis te), die ebenfalls im Dateikntrollblock gespeichert ist. Verfahren der Zugriffsrechtsprüfung: ein Prozess hat ein Zugriffsrecht, wenn dieses der Domäne, der der Prozess angehört, in der ACL zugestanden wird, etwa durch einen Eintrag der Form: erlaube . \layout Subsection Aufgabe 11 (Netzwerkprotokolle - 4 Punkte) \layout Standard (Dieser Stoff wurde im Wintersemester 2002 / 2003 nicht behandelt.) \layout Subsection Aufgabe 12 (Serverarchitekturen - 3 Punkte) \layout Description Aufgabenstellung: \begin_inset Quotes ald \end_inset Was ist ein nebenläufiger Server (concurrent server)? \begin_inset Quotes ard \end_inset \layout Description Lösung: Ein Programm, das auf Aufträge von Client-Programmen über eine Schnittst elle wartet. Es zeichnet sich gegenüber iterativen Servern dadurch aus, dass jeder Auftrag durch einen separaten Thread (oder Subprozess) abgearbeitet wird, so dass mehrere Aufträge (quasi-)gleichzeitig bearbeitet werden können und der Server nahzu immer bereit ist, Aufträge anzunehmen. \layout Subsection Aufgabe 13 (Socket-Schnittstelle - 2+1+3 Punkte) \layout Description a) \begin_inset Quotes ald \end_inset Erläutern Sie die Begriffe \emph on verbindungsorientierte \emph default und \emph on paketorientierte \emph default Kommunikation. \begin_inset Quotes ard \end_inset Paketorientierte Kommunikation wird auch verbindungslose Kommunikation genannt, ebenso hier. Während bei verbindungsloser Kommunikation jede Nachricht mit der vollständigen Zieladresse versehen sein muss, ist bei verbindungsorientierter Kommunikation bei geöffneter Verbindung der Verbindungsendpunkt (z.B. Socket) von Client bzw. Server eineindeutig mit der Adresse des Kommunikationspartners gekoppelt und muss nicht mehr wiederholt werden. Bei geöffneter Verbindung kommen am Verbindungsendpunkt nur Nachrichten des Kommunikationspartners an und keine anderen. \layout Description b) \begin_inset Quotes ald \end_inset Welches der beiden Kommunikationsschemata wird durch die Socket-Schnittstelle unterstützt? \begin_inset Quotes ard \end_inset Beide. Verbindungsorientierte Kommunikation wird durch den Sockettyp SOCK_STREAM realisiert, verbindungslose Kommunikation durch den Sockettyp SOCK_DGRAM (Datagramm-Kommunikation). \layout Description c) \begin_inset Quotes ald \end_inset Nennen Sie einige Socket-Systemaufrufe mit kurzer Erläuterung ihrer Funktionalit ät. \begin_inset Quotes ard \end_inset Siehe \begin_inset LatexCommand \cite[S. 5-9]{JaegerSockets} \end_inset . \layout Subsection Aufgabe 14 (Internetadressen - 2+2 Punkte) \layout Description a) \begin_inset Quotes ald \end_inset Wie ist eine Internet-Adresse ( \family typewriter struct inet_addr \family default ) aufgebaut? \begin_inset Quotes ard \end_inset \begin_deeper \layout LyX-Code struct inet_addr { \layout LyX-Code unsigned long int s_addr; \layout LyX-Code }; \layout Standard Diese einzige Komponente ist die IP-Adresse (eindeutige Identifikationsnummer) einer Netzwerkschnittstelle eines Hosts im Internet bzw. irgendeinem anderen TCP/IP basierten Netzwerk. Sie kann aufgeteilt werden in eine führende Netzwerkadresse und eine Rechneradr esse in diesem Netzwerk. Im Internet gibt es Netzwerke in 3 Größen (Klassen A, B, C) und dafür reservier te Adressbereiche. \end_deeper \layout Description b) \begin_inset Quotes ald \end_inset Wozu dient eine TCP-Port-Nummer? \begin_inset Quotes ard \end_inset Es ist eine eindeutige Zieladresse für Nachrichten innerhalb eines Rechners (der durch eine oder mehrere IP-Adressen angesprochen werden kann). Es ist nicht praktikabel, jedem Prozess eine weltweit eindeutige Identifikation zu geben, also hat man Ports einerichtet: an einer solchen »Anlegestelle für Nachrichten« wartet ein Prozess auf für ihn bestimmte Nachrichten, nachdem er sich an diesen Port gekoppelt hat. Somit bieten TCP-Ports eine Möglichkeit zur Interprozesskommunikation über Systemgrenzen hinweg. \layout Section \start_of_appendix Errata \layout Standard Errata, Anmerkungen und Ergänzungen zu \begin_inset LatexCommand \cite{JaegerSkript} \end_inset . \layout Description Seitenzahlen Die Seitenzahlen der Kapitel im Inhaltsverzeichnis sind konsequent um 3 zu niedrig, weil das Inhaltsverzeichnis die Seiten 2, 3, 4 belegt und somit alle anderen Seiten um 3 nach hinten verschiebt. Fehlender \begin_inset ERT status Collapsed \layout Standard \backslash LaTeX \end_inset -Lauf zur Aktualisierung der Referenzen? \layout Description S.15: \begin_inset Quotes ald \end_inset Speicherverwaltungseinheit (MMU) \begin_inset Quotes ard \end_inset , auch S. 28 \begin_inset Quotes ald \end_inset MMU \begin_inset Quotes ard \end_inset . Es wäre hilfreich zum Verständnis, bereits an dieser Stelle kurz zu erklären, was die MMU ist, inkl. der Bedeutung der Abkürzung. Oder ein Verweis auf S. 75 unten, wo die MMU behandelt wird. \layout Description S.22,\SpecialChar ~ Grafik: Die Beschriftung \begin_inset Quotes ald \end_inset CPU-Zuteilung \begin_inset Quotes ard \end_inset muss am Zustandsübergang zwischen \begin_inset Quotes ald \end_inset bereit \begin_inset Quotes ard \end_inset und \begin_inset Quotes ald \end_inset ausführend \begin_inset Quotes ard \end_inset stehen. \layout Description S.22: \begin_inset Quotes ald \end_inset Ereignissklassen \begin_inset Quotes ard \end_inset \layout Description S.24: \begin_inset Quotes ald \end_inset Ereignissklassen \begin_inset Quotes ard \end_inset \layout Description S.36: \begin_inset Quotes ald \end_inset \family typewriter pthread_create(&f_thread, NULL, (void* (*)(void *)) f, NULL); \family default \begin_inset Quotes ard \end_inset Vielleicht ein Kommentar mit Hinweis, dass hier ein C-Style Cast in einen Funktionszeigertyp verwendet wird? Doch ein recht seltenes Konstrukt\SpecialChar \ldots{} \layout Description S.39: Ersetze \begin_inset Quotes ald \end_inset zwei nebenläaufige neu-Aufrufe sind aktiv. \begin_inset Quotes ard \end_inset durch \begin_inset Quotes ald \end_inset zwei nebenläaufige lies-Aufrufe sind aktiv. \begin_inset Quotes ard \end_inset . \layout Description S.40: Ersetze \begin_inset Quotes ald \end_inset C-Anweisungen anzahl-- in lies und anzahl++ in neu sind atomar, \begin_inset Quotes ard \end_inset durch \begin_inset Quotes ald \end_inset C-Anweisungen anzahl-- in lies und anzahl++ in neu sind nicht atomar, \begin_inset Quotes ard \end_inset . \layout Description S.41: \begin_inset Quotes ald \end_inset sich gerade im kritische Abschnitt befindet \begin_inset Quotes ard \end_inset \layout Description S.65: nach \begin_inset Quotes ald \end_inset anfordern (,,alles \begin_inset Quotes ard \end_inset ist der untere Seitenrand erreicht, einige Wörter fehlen. Vielleicht ein Poblem mit der im PDF-Dokument verwendeten Papiergröße Letter (215,9mm \begin_inset Formula $\cdot $ \end_inset 279,4mm) statt A4 (210mm \begin_inset Formula $\cdot $ \end_inset 297mm)? (verwendete Betrachter: Acrobat Reader 5.0.5 für Linux; kghostview 0.11 für Linux). \layout Description S.68: Ersetze \begin_inset Quotes ald \end_inset Philosoph 4 greift zuerst nach dem rechten Stäbchen (Nummer 0), dann nach dem linken (Nummer 1). \begin_inset Quotes ard \end_inset durch \begin_inset Quotes ald \end_inset Philosoph 4 greift zuerst nach dem rechten Stäbchen (Nummer 0), dann nach dem linken (Nummer 4). \begin_inset Quotes ard \end_inset \layout Description S.70: Dasselbe Problem mit fehlendem Text wie auf S.65. \layout Description S.75: \begin_inset Quotes ald \end_inset Ladezeit-Bindung \begin_inset Quotes ard \end_inset in Kap. \begin_inset Quotes ald \end_inset logischer und physikalischer Adressraum \begin_inset Quotes ard \end_inset : klarer mit »Adressbindung zur Ladezeit \begin_inset Quotes ard \end_inset ? \layout Description S.83: \begin_inset Quotes ald \end_inset Hauptspeichersverwaltung \begin_inset Quotes ard \end_inset \layout Description S.85: \begin_inset Quotes ald \end_inset typischerweise 2 KB oder und 4 KB. \begin_inset Quotes ard \end_inset \layout Description S.96: \begin_inset Quotes ald \end_inset Zum besseren Verständnis vergleichen wir das Verhalten für einen 3 Rahmen großen Hauptspeicher. \begin_inset Quotes ard \end_inset Dieser Abschnitt ist ohne einen erläuternden Text recht schwer verständlich. Vorschlag: die Zugriffe in der Zugriffsreihenfolge als Spaltentitel der Tabellen für die verschiedenen Auslagerungsverfahren verwenden; erklärender Text: \begin_inset Quotes ald \end_inset Der Hauptspeicher sei 3 Rahmen groß, es ist jedoch ein Zugriff auf bis zu 10 Seiten, nummeriert mit 0-9, möglich. Eine Spalte gibt an, welche Seiten zu einem Zeitpunkt im Hauptspeicher stehen, darunter muss natürlich die durch den Zugriff angeforderte Seite sein. Die Hauptspeicherbelegung nach dem nächsten Zugriff steht immer eine Spalte weiter rechts. \begin_inset Quotes ard \end_inset \layout Description S.97: \begin_inset Quotes ald \end_inset verknüpfen diese Modell \begin_inset Quotes ard \end_inset \layout Description S.104: \begin_inset Quotes ald \end_inset Platen-E/A \begin_inset Quotes ard \end_inset \layout Description S.118,\SpecialChar ~ Tabelle: \begin_inset Quotes ald \end_inset B+-Baum \begin_inset Quotes ard \end_inset Was ist das? \layout Description S.119: \begin_inset Quotes ald \end_inset Sicherheit ist ein allerdings ein facettenreicher Begriff \begin_inset Quotes ard \end_inset \layout Description S.121: \begin_inset Quotes ald \end_inset Bei viele modernen UNIX-Varianten \begin_inset Quotes ard \end_inset \layout Description S.121: \begin_inset Quotes ald \end_inset wird auf die weiterführende Literatur verweisen:« \layout Description S.125: \begin_inset Quotes ald \end_inset Fließkommanfehler \begin_inset Quotes ard \end_inset \layout Description S.125: Setze Punkt in \begin_inset Quotes ald \end_inset hat eine bestimmte Priorität p Eine Service-Routine \begin_inset Quotes ard \end_inset \layout Bibliography \bibitem {Tanenbaum} \begin_inset Quotes ald \end_inset Tanenbaum: »Moderne Betriebssysteme«; 2. Auflage 2002. Dies ist die Empfehlung für die Vorlesung Betriebssysteme bei Prof. Jäger, bes. wenn man etwas über die Vorlesung heraus nachlesen will. Preis ca. 50-55 EUR. Dieses Werk gehört zur Einführungsliteratur. \layout Bibliography \bibitem {JaegerHomepage} \begin_inset LatexCommand \url[Homepage von Prof. Dr. Michael Jäger]{http://homepages.fh-giessen.de/~hg52/lv/bs1/root.html} \end_inset . Hier steht das Skript und alles andere zur Verfügung, was man für dieses Modul und seine Klausur benötigt. \layout Bibliography \bibitem {JaegerSkript} Prof. Dr. Michael Jäger: \begin_inset Quotes ald \end_inset Betriebssysteme\SpecialChar ~ 1 - Eine Einführung \begin_inset Quotes ard \end_inset ; WS 2000 / 2001; Version 1.1.0 vom 2000-10-04. Quelle: \begin_inset LatexCommand \url[Homepage von Prof. Dr. Michael Jaeger]{http://homepages.fh-giessen.de/~hg52/lv/bs1/root.html} \end_inset . \layout Bibliography \bibitem {JaegerProzesse} Prof. Dr. Michael Jäger: \begin_inset Quotes ald \end_inset Unix-Prozesskonzept \begin_inset Quotes ard \end_inset ; Version vom 2000-10-10. Quelle: \begin_inset LatexCommand \url[Homepage von Prof. Dr. Michael Jäger]{http://homepages.fh-giessen.de/~hg52/lv/bs1/root.html} \end_inset . \layout Bibliography \bibitem {JaegerDateisystem} Prof. Dr. Michael Jäger: \begin_inset Quotes ald \end_inset UNIX-Dateisystem -- Eine Einführung«; FH Gießen-Friedberg Version vom 2000-10-10. Quelle: \begin_inset LatexCommand \url[Homepage von Prof. Dr. Michael Jäger]{http://homepages.fh-giessen.de/~hg52/lv/bs1/root.html} \end_inset . \layout Bibliography \bibitem {JaegerSockets} Prof. Dr. Michael Jäger: \begin_inset Quotes ald \end_inset Sockets -- eine Programmierschnittstelle für Kommunikation im Netz \begin_inset Quotes ard \end_inset ; Fachbereich MNI; FH Gießen-Friedberg; Version vom 2000-10-10. Quelle: \begin_inset LatexCommand \url[Homepage von Prof. Dr. Michael Jäger]{http://homepages.fh-giessen.de/~hg52/lv/bs1/root.html} \end_inset . \layout Bibliography \bibitem {JaegerUebungen} Prof. Dr. Michael Jäger: Übungsaufgaben zu Betriebssysteme\SpecialChar ~ 1. \begin_inset LatexCommand \url[Homepage von Prof. Dr. Michael Jäger]{http://homepages.fh-giessen.de/~hg52/lv/bs1/root.html} \end_inset \layout Bibliography \bibitem {JaegerKlausuren} Prof. Dr. Michael Jäger: Alte Klausuren zu Betriebssysteme\SpecialChar ~ 1. \begin_inset LatexCommand \url[Homepage von Prof. Dr. Michael Jäger]{http://homepages.fh-giessen.de/~hg52/lv/bs1/root.html} \end_inset \layout Bibliography \bibitem {LetschertVertSys} Prof. Dr. Thomas Letschert: Skript zu Betriebssysteme\SpecialChar ~ 1. FH Gießen-Friedberg. \begin_inset LatexCommand \url[Homepage von Prof. Dr. Thomas Letschert]{http://homepages.fh-giessen.de/~hg51/BS-I/Skript/bsI.pdf} \end_inset . \layout Bibliography \bibitem {LetschertUebungen} Prof. Dr. Thomas Letschert: Übungen zu Betriebssysteme\SpecialChar ~ 1 im Sommersemester 2002. Die ursprüngliche Quelle \begin_inset LatexCommand \url{http://homepages.fh-giessen.de/~hg51/BS-I} \end_inset erfuhr ein Update, deshalb werden die alten Dokumente hier zur Verfügung gestellt: \begin_inset LatexCommand \url[Matthias Ansorg: Persönliche Homepage :: OpenTools :: InformatikDiplom]{http://matthias.ansorgs.de/InformatikDiplom/Modul.BetrSys1.Letschert/index.html} \end_inset . Zwei Lösungen zur Bonusaufgabe des vierten Übungsblatts: \begin_inset LatexCommand \url{http://homepages.fh-giessen.de/~hg51/BS-I/Src/VM-Triv/} \end_inset und \begin_inset LatexCommand \url{http://homepages.fh-giessen.de/~hg51/BS-I/Src/VM-Einfach/} \end_inset . \layout Bibliography \bibitem {LetschertVert} Prof. Dr. Thomas Letschert: \begin_inset Quotes ald \end_inset Nebenläufige und Verteilte Programme \begin_inset Quotes ard \end_inset ; Logos Verlag, Berlin, 1998. Synchronisations- und Verteilungsmechanismen für den fortgeschrittenen Programmierer. Mit vielen Beispielen, sehr empfehlenswert ! Freier Download unter \begin_inset LatexCommand \url[Homepage von Prof. Dr. Thomas Letschert]{http://homepages.fh-giessen.de/~hg51/Verteilt/nlvs.pdf} \end_inset . \layout Bibliography \bibitem {ManSignal} Manpage signal(7) \begin_inset Quotes ald \end_inset signal - list of available signals \begin_inset Quotes ard \end_inset . Auf jedem Unix-artigen System einzusehen mit \family typewriter man 7 signal \family default . \layout Bibliography \bibitem {ManExec} Manpage exec(3) \begin_inset Quotes ald \end_inset execl, execlp, execle, execv, execvp - execute a file \begin_inset Quotes ard \end_inset . Auf jedem Unix-artigen System einzusehen mit \family typewriter man \family default \family typewriter 3 exec \family default . \the_end