Ü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