Ãbungsblatt 4 - Professur Betriebssysteme
Transcription
Ãbungsblatt 4 - Professur Betriebssysteme
Professur Betriebssysteme 4. Übung Betriebssysteme Dr. Peter Tröger Aufgabe 1 Mit den Systemrufen read() und write() kann auf Dateien zugegriffen werden. a) Es soll mit read() auf eine Datei zugegriffen werden, die seit dem Start des Systems noch nicht gelesen wurde. Die Datei befindet sich auf einer Festplatte. Löst der read()-Systemruf einen Zustandswechsel im Prozess aus? Wenn ja, welchen und warum? Wenn nein, wieso nicht? b) Nun soll mit write() auf eine Festplatte geschrieben werden. Treten bei diesem Systemruf Zustandswechsel auf? Wenn ja, unter welchen Umständen? Wenn nein, wieso nicht? Aufgabe 2 Gegeben sei folgende Codesequenz. Erstellen Sie für dieses Programm ein Ablaufdiagramm! Welche Prozesse befinden sich zu den Zeitpunkten 1s, 3s . . . 11s in einem sleep()-Funktionsruf? # include < unistd .h > # include < stdlib .h > i n t main () { sleep (2) ; fork () ; sleep (2) ; fork () ; wait ( NULL ) ; sleep (2) ; fork () ; sleep (2) ; exit (0) ; r e t u r n 0; } Finden sie drei semantische Fehler im Code ! 1 Aufgabe 3 a) Sie kennen bereits die Systemrufe fork(), waitpid(), exit() und kill(), die zur Realisierung von Multitasking genutzt werden. Nebenläufigkeit ist aber auch im selben Adressraum möglich. Hierzu dient die pthreads-Bibliothek. Stellen Sie den oben genannten Systemrufen die entsprechenden Funktionen der pthreadsBibliothek in einer Tabelle gegenüber. b) Gegeben sei folgender Programmcode: #i n c l u d e < stdlib .h > #i n c l u d e < stdio .h > #i n c l u d e < pthread .h > static i n t x = 0; s t a t i c v o i d * a ( v o i d * arg ) { unsigned i n t i; f o r ( i = 0; i < 50; i ++) { printf ( " A : ␣ % d " , x ) ; x ++; printf ( " ␣ ->␣ % d \ n " , x ) ; } r e t u r n NULL ; } s t a t i c v o i d * b ( v o i d * arg ) { unsigned i n t i; f o r ( i = 0; i < 50; i ++) { printf ( " B : ␣ % d " , x ) ; x ++; printf ( " ␣ ->␣ % d \ n " , x ) ; } r e t u r n NULL ; } i n t main () { pthread_t tid_a , tid_b ; pthr ead_crea te (& tid_a , NULL , a , NULL ) ; pthr ead_crea te (& tid_b , NULL , b , NULL ) ; pthread_join ( tid_a , NULL ) ; pthread_join ( tid_b , NULL ) ; r e t u r n 0; } Welche Ausgabe könnte erscheinen, wenn dieser Code ausgeführt wird? Führen sie mehrere Tests durch. c) Ersetzen Sie alle pthread-Aufrufe durch die in Teilaufgabe a) aufgeführten Systemrufe. Welche Ausgabe kommt nun zu Stande? 2 Aufgabe 4 Wieviele Aktivitäten entstehen bei Abarbeitung des folgenden Codes? Wo landet die durch scanf() eingelesene Eingabe? # include # include # include # include < stdlib .h > < stdio .h > < pthread .h > < unistd .h > void * thread ( void * arg ) { int x ; sleep (3) ; printf (" Eingabe bitte : ") ; scanf ("% d " , & x ) ; printf ("% d \ n " , x ) ; return NULL ; } int main () { pthread_t tid ; pthr ead_crea te (& tid , NULL , thread , NULL ) ; sleep (2) ; printf (" fork () \ n ") ; fork () ; pthread_join ( tid , NULL ) ; return 0; } Im Code befinden sich zwei Fehler. Wo? 3