Klausur „Softwaresysteme I“ März 2007 MUSTERLÖSUNG Friedrich-Alexander-Universität Erlangen-Nürnberg Schriftliche Prüfung zur Lehrveranstaltung „Softwaresysteme I“ erreichbare Punkte Aufgabe 1 Aufgabe 2 erhaltene Punkte 30 A D T K a b c d a b U M 60 Aufgabe 3 20 Aufgabe 4 10 Summe 120 Note (Name) (Vorname) (Matrikel-Nr.) (Studiengang) (Semester) Durch meine Unterschrift bestätige ich - den Empfang der vollständigen Klausurunterlagen (18 Seiten inkl. Deckblatt), - den Empfang der Manualseiten (4 Blätter mit 12 Manualseiten: connect, opendir/readdir, fopen/fdopen, gets, ip, malloc, pthread_cond, pthread_create/pthread_exit, pthread_detach, pthread_mutex, socket, unlink) - die Kenntnisnahme der Hinweise auf Seite 2. Ich bin damit einverstanden, dass mein Prüfungsergebnis unter Angabe der Matrikel-Nr. veröffentlicht wird. ja Erlangen, 15.03.2007 (Unterschrift) - 1 von 18 - nein Klausur „Softwaresysteme I“ März 2007 Hinweise Die folgenden Informationen bitte aufmerksam lesen und die Erklärung am Ende dieser Hinweise unterschreiben. • Die Bearbeitungszeit beträgt 120 Minuten. • Es sind keine eigenen Hilfsmittel zugelassen mit Ausnahme eines einzelnen, mit blauem Stift handbeschriebenen, karierten Notizblatts. • Die Lösung einer Aufgabe soll auf das Aufgabenblatt in den dafür vorgesehenen Raum geschrieben werden. Beachten Sie bitte, dass der freigelassene Platz großzügig bemessen ist und nicht unbedingt der erwarteten Antwortlänge entspricht. Sollte der Platz nicht ausreichen, können Sie die Rückseiten der Aufgabenblätter mitverwenden. Kennzeichnen Sie dabei die Zugehörigkeit Ihrer Lösung zu einer Aufgabe. Bei Bedarf können zusätzliche Lösungsblätter (weiß) ausgeteilt werden. Vermerken Sie vor deren Verwendung unbedingt Ihren Namen und Ihre Matrikelnummer darauf! • Schmierpapier und Manualseiten dürfen nicht abgegeben werden. Bei Bedarf ist von der Aufsicht weiteres Schmierpapier (farbig) erhältlich. • Das mitgebrachte handgeschriebene Notizblatt muss mit der Klausur am Ende abgegeben werden. • Fragen zu den Prüfungsaufgaben können grundsätzlich nicht beantwortet werden. • Tragen Sie Ihren Namen und Vornamen, Ihre Matrikelnummer, Studiengang und Fachsemesterzahl auf dem Deckblatt der Klausur ein. • Bitte legen Sie Ihren Studenten- und einen Lichtbildausweis zur Kontrolle bereit. • Sie dürfen den Raum nicht verlassen bevor Ihre Personalien überprüft wurden und Sie die Klausurunterlagen der Aufsicht zurückgegeben haben. • In den letzten 15 Minuten der Bearbeitungszeit können Sie den Raum nicht mehr verlassen. Bleiben Sie an Ihrem Platz sitzen, bis schließlich alle Klausurunterlagen eingesammelt sind und die Aufsicht das Zeichen zum Gehen gibt. Die Klausurergebnisse werden in ca. einer Wochen am schwarzen Brett vor dem Sekretariat des Lehrstuhls für Verteilte Systeme und Betriebssysteme (vor Raum 0.047 RRZE Erdgeschoss) und im WWW unter der Seite der Vorlesung im SS 2006, Unterpunkt "Ergebnisse" veröffentlicht (Benutzername: i4sos, Passwort: s0s2k4). - 2 von 18 - Klausur „Softwaresysteme I“ März 2007 Aufgabe 1: (30 Punkte) Bei den Multiple-Choice-Fragen ist jeweils nur eine richtige Antwort eindeutig anzukreuzen. Auf die richtige Antwort gibt es die angegebene Punktzahl. Wollen Sie eine Multiple-Choice-Antwort korrigieren, kreisen sie bitte die falsche Antwort ein und kreuzen die richtige an. Lesen Sie die Frage genau, bevor Sie antworten. a) Was versteht man unter einem Translation Lookaside Buffer (TLB)? 2 Punkte ❏ Einen speziellen Cache der MMU, der den Inhalt der zuletzt angesprochenen Speicherzellen vorhält. ❏ X Einen speziellen Cache der MMU, der Informationen aus den zuletzt genutzten Seitendeskriptoren vorhält. ❏ Einen Pufferspeicher des Compilers um den Übersetzungsvorgang zu beschleunigen (es werden die Codes der zuletzt übersetzten Statements vorgehalten). ❏ Einen speziellen Cache der CPU, der die zuletzt ausgeführten Maschinenbefehle zwischenspeichert (beschleunigt vor allem den Ablauf von Schleifen). b) Welche Aussage zu Speicherzuteilungsverfahren ist richtig? 2 Punkte ❏ die worst-fit-Strategie ist lediglich theoretisch interessant, da es in der Praxis nie sinnvoll ist, den am schlechtesten passenden Speicherplatz zuzuweisen. ❏ best-fit ist in jedem Fall das beste Verfahren ❏ X bei buddy-Verfahren gibt es keinen externen Verschnitt ❏ buddy-Verfahren sind nur bei sehr leistungsfähigen Rechnern und großem Speicher einsetzbar, weil sie aufwändig in der Berechnung sind und viel Verschnitt verursachen. c) Es gibt verschiedene Ursachen, wie Nebenläufigkeit in einem System entstehen kann (gewollt oder auch ungewollt). Was gehört nicht dazu? ❏ durch Interrupts ❏ X durch die MMU ❏ durch preemptives Scheduling ❏ durch Threads auf einem Monoprozessorsystem - 3 von 18 - 2 Punkte Klausur „Softwaresysteme I“ März 2007 d) Im regulären Ablauf eines Anwendungsprogramms und einer Signalbehandlungsfunktion (bzw. im Ablauf eines Betriebssystems und einer Unterbrechungsbehandlungsfunktion) wird auf gemeinsame Daten modifizierend zugegriffen. Welche Aussage ist falsch? 3 Punkte ❏ Falscher Einsatz von Schlossvariablen (lock/unlock-Operationen) kann zu Verklemmungen führen ❏ Der Aufruf von P-Operationen im Anwendungsprogramm und dazu korrespondierenden V-Operationen in der Signalbehandlung führt nicht zu Verklemmungen ❏ X Alle Verfahren der mehrseitigen Synchronisation können eingesetzt werden ❏ Alle Verfahren nicht-blockierender Synchronisation sind einsetzbar e) Gegeben sei folgendes Szenario: zwei Threads werden auf einem Monoprozessorsystem mit der Strategie "First Come First Served" verwaltet. In jedem Faden wird die Anweisung "i++;" auf die gemeinsame, globale Variable i ausgeführt. Welche der folgenden Aussagen ist richtig: 2 Punkte ❏ Während der Inkrementoperation müssen Interrupts vorübergehend unterbunden werden. ❏ Die Inkrementoperation muss mit einer CAS-Anweisung nicht-blockierend synchronisiert werden. ❏ Die Operation i++ ist auf einem Monoprozessorsystem immer atomar. ❏ X In einem Monoprozessorsystem ohne Verdrängung ist keinerlei Synchronisation erforderlich. f) Welche der folgenden Aussagen zu statischem bzw. dynamischem Binden ist falsch? 2 Punkte ❏ beim statischen Binden werden alle Adressen zum Bindezeitpunkt aufgelöst ❏ statisch gebundene Programme können zum Ladezeitpunkt an beliebige Speicheradressen platziert werden ❏ bei dynamischem Binden können auch zum Übersetzungszeitpunkt alle bekannten Adressbezüge bereits vollständig aufgelöst werden ❏ X bei dynamischem Binden werden alle Adressen bis zum Zeitpunkt des Programmstarts aufgelöst - 4 von 18 - Klausur „Softwaresysteme I“ März 2007 g) Was passiert, wenn Sie in einem C-Programm über einen ungültigen Zeiger versuchen auf Speicher zuzugreifen 2 Punkte ❏ Der Compiler erkennt die problematische Code-Stelle und generiert Code, der zur Laufzeit bei dem Zugriff einen entsprechenden Fehler auslöst. ❏ Der Speicher schickt an die CPU einen Interrupt. Hierdurch wird das Betriebssystem angesprungen, das den gerade laufenden Prozess mit einem "Segmentation fault"-Signal unterbricht. ❏ X Beim Zugriff über den Zeiger muss die MMU die erforderliche Adressumsetzung vornehmen, erkennt die ungültige Adresse und löst einen Trap aus. ❏ Das Betriebssystem erkennt die ungültige Adresse bei der Weitergabe des Befehls an die CPU (partielle Interpretation) und leitet eine Ausnahmebehandlung ein. h) Man unterscheidet zwischen privilegierten und nicht-privilegierten Maschinenbefehlen. Welche Aussage ist richtig? 2 Punkte ❏ Privilegierte Maschinenbefehle dürfen in Anwendungsprogrammen grundsätzlich nicht verwendet werden. ❏ Die Benutzung eines privilegierten Maschinenbefehls in einem Anwendungsprogramm führt zu einer asynchronen Programmunterbrechung. ❏ X Privilegierte Maschinenbefehle können durch Betriebssystemprogramme (partielle Interpretation) implementiert werden. ❏ Privilegierte Befehle sind die einzige Möglichkeit, auf Geräteregister zuzugreifen. i) In einem Seitendeskriptor werden verschiedene Informationen über eine Seite eines virtuellen Adressraums gehalten. Was gehört sicher nicht dazu? ❏ Die Adresse der Seite im physikalischen Hauptspeicher ❏ X Die Position der Seite im logischen Adressraum ❏ Zugriffsrechte (z. B. lesen, schreiben, ausführen) ❏ Ein Zähler, der ein Maß für das Alter der Seite enthält - 5 von 18 - 2 Punkte Klausur „Softwaresysteme I“ März 2007 j) Beim Blockieren in einem Monitor muss der Monitor freigegeben werden. Warum? 2 Punkte ❏ weil sonst die Monitordaten inkonsistent sind. ❏ X weil ein anderer Thread die Blockierungsbedingung nur aufheben kann, wenn er den Monitor betreten darf. ❏ weil kritische Abschnitte immer nur kurz belegt sein dürfen. ❏ weil der Thread sonst aktiv warten würde. k) Ein Betriebssystem setzt logische Adressräume auf der Basis von Segmentierung ein. Welche Aussage ist falsch? 2 Punkte ❏ Die Segmentierung schränkt den logischen Adressraum derart ein, dass nur auf gültige Speicheradressen erfolgreich zugegriffen werden kann. ❏ Über gemeinsame Segmente kann innerhalb von zwei verschiedenen logischen Adressräumen auf die selben Speicherzellen zugegriffen werden. ❏ X Mit der Segmentierung kann einem Prozess mehr Speicher zugeordnet werden als physikalisch vorhanden ist, da ein Segment teilweise ausgelagert werden kann. ❏ Segmente können verschiedene Länge haben. Eine Längenbegrenzung wird üblicherweise bei der Speicherabbildung geprüft. l) Welches der folgenden Verfahren ist nicht zur Verklemmungsvorbeugung in dem am Beispiel der "speisenden Philosophen" beschriebenen Verklemmungsszenario geeignet? 2 Punkte ❏ Einer der Philosophen nimmt immer nur beide Stäbchen (oder Gabeln) gleichzeitig. ❏ X Jeder Philosoph nimmt grundsätzlich immer zuerst das rechte und dann das linke Stäbchen. Dadurch wird eine Ordnung im System hergestellt, durch die keine Verklemmungen auftreten können. ❏ Alle Philosophen nehmen immer nur beide Stäbchen gleichzeitig. ❏ Ein Philosoph kann von seinem Nachbarn die Rückgabe eines Stäbchens fordern. - 6 von 18 - Klausur „Softwaresysteme I“ März 2007 m) Welche Aussage zum Thema "Aktives Warten" ist richtig? 2 Punkte ❏ Aktives Warten vergeudet gegenüber passivem Warten immer CPUZeit ❏ Auf Mehrprozessorsystemen ist aktives Warten unproblematisch und deshalb dem passiven Warten immer vorzuziehen ❏ X Aktives Warten darf bei nicht-verdrängenden Scheduling-Strategien auf einem Monoprozessorsystem nicht verwendet werden ❏ Bei verdrängenden Scheduling-Strategien verzögert aktives Warten nur den betroffenen Prozess, behindert aber nicht andere n) Für lokale Variablen, Aufrufparameter, etc. einer Funktion wird bei vielen Prozessoren ein sog. Aktivierungsblock (activation record oder stack frame) auf dem Stack angelegt. Welche Aussage ist richtig? 3 Punkte ❏ X Über Zeiger kann man alle Daten des Aktivierungsblocks der aufrufenden Funktion verändern. ❏ Nach dem Rücksprung aus einer Funktion sind Zeiger auf die Speicherzellen ihres Aktivierungsblocks nicht mehr gültig. Ein Zugriff über solch einen Zeiger führt dann zu einem Segmentation fault. ❏ Bei rekursiven Funktionsaufrufen kann der Aktivierungsblock in jedem Fall wiederverwendet werden, weil die gleiche Funktion aufgerufen wird. ❏ Der Compiler legt zur Übersetzungszeit fest, an welcher Position im Aktivierungsblock der main-Funktion die globalen Variablen angelegt werden. - 7 von 18 - Klausur „Softwaresysteme I“ März 2007 Aufgabe 2: (60 Punkte) Sie dürfen diese Seite zur besseren Übersicht bei der Programmierung heraustrennen! a) Schreiben Sie ein Programm mailq (Mail-Queue-Bearbeiter), das Mail aus einem Warteschlangendirectory an entfernte Rechner zustellt. Wird mailq ohne Parameter aufgerufen, werden maximal 5 Aufträge gleichzeitig bearbeitet. Bei Aufruf mailq n werden bis zu n Aufträge durch Threads gleichzeitig bearbeitet. Das Programm soll folgendermaßen arbeiten: – mailq sucht in dem Directory /var/spool/mailq nach Dateien, deren Name mit dem Zeichen m beginnt und bearbeitet den Auftrag durch Aufruf der Funktion void pjob(char *mfile). Andere Dateien werden ignoriert. – Funktion pjob: Falls die maximale Zahl gleichzeitig zu bearbeitender Aufträge bereits erreicht ist, wird gewartet, bis ein laufender Auftrag fertig wird. Sonst wird für den Auftrag ein Thread (Arbeits-Thread) erzeugt. Die ThreadStartfunktion tstart führt zur eigentlichen Auftragsbearbeitung die Funktion void send_mail(char *mfile) aus. – Zur Koordinierung der maximalen Threadzahl müssen Sie die Anzahl der erzeugten Threads in einer normalen Variablen mitzählen. Das Inkrementieren erfolgt bei der Threaderzeugung, das Dekrementieren führt der Thread vor dem Terminieren aus. Beachten Sie die Nebenläufigkeit dieser Operationen! Wenn die maximale Threadzahl erreicht ist, wartet der Haupt-Thread mit pthread_cond_wait (und nicht mit pthread_join!) auf das Terminieren eines Arbeits-Threads. – Funktion send_mail: In einer mfile-Datei steht in der ersten Zeile der Empfänger in der Form user@hostname und ab der zweiten Zeile bis zum Dateiende der Inhalt der Mail. Es wird eine Verbindung zu hostname, Port 25, aufgebaut und Folgendes übertragen: RCPT TO: user@hostname DATA Mailinhalt . Abschliessend wird die mfile-Datei gelöscht. – Sie können davon ausgehen, dass alle benutzten Dateinamen sowie die Zeilen im Mailinhalt jeweils nie länger als 1024 Zeichen sein werden und dass der Inhalt der mfile-Datei in jedem Fall korrekt aufgebaut ist. Auf den folgenden Seiten finden Sie ein Gerüst für das beschriebene Programm. In den Kommentaren sind nur die wesentlichen Aufgaben der einzelnen, zu ergänzenden Programmteile beschrieben, um Ihnen eine gewisse Leitlinie zu geben. Es ist überall sehr großzügig Platz gelassen, damit Sie auch weitere notwendige Programmanweisungen entsprechend Ihrer Programmierung einfügen können. Einige wichtige Manual-Seiten liegen bei - Sie können aber nicht davon ausgehen, dass Sie ausschließlich nur diese Funktionen benötigen. - 8 von 18 - Klausur „Softwaresysteme I“ März 2007 /* includes */ #include <sys/types.h> #include <stdlib.h> #include <errno.h> #include <dirent.h> #include <pthread.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> #include <netdb.h> /* Funktionsdeklarationen, globale Variablen */ void pjob(char *); void *tstart(void *); void *send_mail(char *); 1,5A static int threadsavailable = 5; /* Punkt bei Arg. prüfen */ static pthread_mutex_t mtx; /* Punkte bei Initialisierung */ static pthread_cond_t cdt; /* Funktion main */ int main (int argc, char **argv) /* Funktionsdeklaration: 1/2A, return aus main 1/2A */ { /* Argumente prüfen */ /* Def. von threadsavailable 0,5P */ if (argc == 1) { /* 0,5 P */ threadsavailable = 5; /* 0,5 P */ } else if (argc == 2) { /* 0,5 P */ threadsavailable = atoi(argv[1]); /* 0,5 P */ } else { /* 0,5 P */ fprintf(stderr, "usage: mailq [n]\n"); exit(EXIT_FAILURE); } - 9 von 18 - 1A 2,5A A:5 Klausur „Softwaresysteme I“ März 2007 /* Initialisierungen */ { /* Punkte jew. auf Initialisierung und globale Def.*/ pthread_mutex_init(&mtx, NULL); pthread_cond_init(&cdt, NULL); 2T } /* Auftraege suchen und bearbeiten */ { DIR *mailq; struct dirent *direntry; /* (1P bei opendir) */ /* (1P bei readdir) */ /* opendir 2 P */ if ((mailq = opendir("/var/spool/mailq")) == NULL) { perror("open mailq"); /* 1 P */ exit(EXIT_FAILURE); } /* readdir 2 P */ while (errno=0, (direntry=readdir(mailq)) != NULL) { if (direntry->d_name[0] == ’m’) { /* 1 P */ pjob(direntry->d_name); /* 1 P */ } } if ( errno != 0 ) { /* 1 P */ perror("readdir"); exit(EXIT_FAILURE); } closedir(mailq); /* 1P */ return(0);/* 1/2 A -> Seite 9 */ } 3D 6D T: 2 D: 9 } /* Ende Funktion main */ - 10 von 18 - Klausur „Softwaresysteme I“ März 2007 /* Auftragsbearbeitung: Funktion pjob */ void pjob(char *mfile) { /* Variablendefinitionen, Vorbereitungen */ pthread_t worker; /* Dateiname vor Uebergabe an Thread in eigenen Speicher duplizieren */ char *mfile2; /* malloc mit Fehlerabfr. 2P */ mfile2 = malloc(sizeof(char) * (strlen(mfile) + 1)); if(mfile2 == NULL) { perror("malloc"); exit(EXIT_FAILURE); } strcpy(mfile2, mfile); 3T /* 1P */ /* Regelung der Threadzahl. Koordinierung mit Threads */ pthread_mutex_lock(&mtx); while(threadsavailable == 0) { pthread_cond_wait(&cdt, &mtx); } threadsavailable--; pthread_mutex_unlock(&mtx); /* 1P */ /* 1P */ /* 2P */ 6K /* 1P */ /* 1P */ T: 3 K: 6 - 11 von 18 - Klausur „Softwaresysteme I“ /* Thread erzeugen März 2007 */ /*worker richtig def. 1P, Aufruf+richtige Par.+Fehler 2P*/ if (pthread_create(&worker, NULL, tstart, mfile2) != 0) { perror("pthread_create"); exit(EXIT_FAILURE); }; if(pthread_detach(worker) != 0) /* 1P */ perror("detach"); 4T } /* Ende Funktion pjob */ /* Thread-Startfunktion: Funktion tstart */ void *tstart(void *mfile) { /* Mail zustellen */ send_mail((char *)mfile); /* /* Aufruf 1P, cast 1P */ 2T Ressourcen freigeben, Thread beenden */ free(mfile); /* 1P */ pthread_mutex_lock(&mtx); threadsavailable++; pthread_cond_broadcast(&cdt); pthread_mutex_unlock(&mtx); pthread_exit(NULL); /* /* /* /* /* 1P 1P 1P 1P 1P */ */ */ */ */ 1T 5K T: 7 K: 5 } /* Ende Funktion tstart */ - 12 von 18 - Klausur „Softwaresysteme I“ März 2007 /* Mailuebertragung: Funktion send_mail */ void send_mail(char *mfile) { /* Variablendefinitionen */ FILE *mf, *sfd; char filename[1024]; char user[1024], hostname[1024]; char buffer[1024]; char *p; int s; /* m-Datei oeffnen */ sprintf(filename, "/var/spool/mailq/%s", mfile); /* 1 P */ if ((mf=fopen(filename, "r")) == NULL) { /* 2 P */ perror(filename); /* 1 P */ return; } 4U /* Empfaenger ermitteln */ fscanf(mf, "%s@%s\n", user, hostname); /* Adress-Struktur fuer hostname aufbauen */ { struct sockaddr_in addr; struct hostent *h; if ((h=gethostbyname(hostname)) == NULL) { perror(hostname); return; } memcpy(&addr.sin_addr, h->h_addr_list[0], sizeof(addr.sin_addr)); addr.sin_port = htons(25); addr.sin_family = AF_INET; - 13 von 18 - -> Klausur „Softwaresysteme I“ März 2007 /* Verbindung aufbauen */ if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1){ /*2 P*/ perror("create socket"); return; } if (connect(s, (const struct sockaddr *)&addr, sizeof(addr)) == -1) { /* 2 P */ perror("connect failed"); /* 1 P */ return; } 2U 3U } /* Mailinhalt uebertragen */ sfd = fdopen(s, "w"); /* wenn fdopen noetig, 1 P */ /* sonst 1P auf korrekten Output-Zusammenbau, */ fprintf(sfd, "RCPT TO: %s@%s\n", user, hostname);/* 1 P */ fprintf(sfd, "DATA\n"); /* 0,5 P */ while(fgets(buffer, 1024, mf) ) fputs(buffer, sfd);/* 3 P */ fprintf(sfd, ".\n"); /* 0,5 P */ 6U /* Auftrag abschliessen */ fclose(sfd); fclose(mf); /* 2P */ if (unlink(filename)==-1) perror("unlink"); /* 2 P */ return; /* 1 P */ } /* Ende Funktion send_mail */ - 14 von 18 - 5U <U:4+ 11+5 =20 Klausur „Softwaresysteme I“ März 2007 b) Schreiben Sie ein Makefile zum Erzeugen des mailq-Programms. Ein Aufruf von make mailq soll das Programm erzeugen, ein Aufruf von make clean soll das mailq-Programm und evtl. bei vorherigen make-Läufen erzeugte .o-Dateien entfernen. mailq: mailq.c ${CC} -o mailq mailq.c clean: rm -f mailq /* Abhängigk.: 1M */ /* Kommando: 1M */ 3M /* 1M */ M: 3 - 15 von 18 - Klausur „Softwaresysteme I“ März 2007 Aufgabe 3: (20 Punkte) Man kann Schedulingverfahren nach verschiedenen Kriterien in Kategorien einteilen. Beschreiben Sie für die folgenden Kategorisierungen jeweils die Eigenschaften entsprechender Schedulingstrategien, nennen Sie konkrete Beispiele für solche Strategien und geben Sie an, in welchen Anwendungssituationen entsprechende Strategien sinnvoll eingesetzt werden. a) Kooperatives bzw. präemptives Scheduling 5 Punkte Kooperativ: Anwendung entscheidet über Umschaltungen, (1) z.B. für Batch-Aufgaben oder systeminterne sehr kurzlaufende Threads (1), Beispiel FCFS (1) Präemptiv: Betriebsystem entzieht Prozessen die CPU (1) Typisch bei Mehrbenutzer/Timesharing-Systemen, (1) Beispiel RR, MLFB (1) b) Deterministisches bzw. probabilistisches Scheduling 6 Punkte Deterministisches S.: Vorberechnetes Scheduling, (1) Stoßlängen/Termine sind bekannt (1), genaue Vorhersage der CPU-Auslastung möglich (1), Zeitgarantien möglich (1), Einsatz vor allem bei Echtzeitsystemen, (1) kein Beispiel in Vorlesung direkt genannt -Prioritäten (1) (nicht doppelt bepunkten, wenn bei nur das Gegenteil genannt wird!) Probabilistisches S.: Stoßlängen/Termine unbekannt (1), Auslastung nur abschätzbar (1), keine Zeitgarantien möglich (1), Beispiele: SPN, SRTF, HRRN (1) - 16 von 18 - Klausur „Softwaresysteme I“ März 2007 c) Statisches bzw. dynamisches Scheduling 5 Punkte statisch: Berechnung des Plans vor der Programmausführ.(1) vollständiger Ablaufplan (1), u.a. durch Quelltextanalyse (1), Einsatz vor allem bei strikten Echtzeitsystemen (1) dynamisch: online während der Programmausführung (1), auf Basis von Rechenzeit, E/A-Zeiten, (1) Einsatz bei den meisten Systemen (interaktiv, Stapel, schwache/feste Echtzeit), (1) Beispiele: RR, MLFBQ, ... (1) d) Asymmetrisches bzw. symmetrisches Scheduling 4 Punkte asymmetrisch: Prozesse werden nicht gleichmäßig auf die CPUs verteilt (1) bei asymmetrischen MPS / ungleiche Prozessoren (1) bei symmetrischen MPS optional (BS hat freie Hand) (1) symmetrisch: Prozesse werden gleich auf die Prozessoren verteilt (1), identische Prozessoren (1), Lastausgleich (1) - 17 von 18 - Klausur „Softwaresysteme I“ März 2007 Aufgabe 4: (10 Punkte) Bei virtuellen Adressräumen können Teile des Speichers auf Hintergrundspeicher ausgelagert sein. a) Wie wird im System bei einem Speicherzugriff erkannt, dass der entsprechende Speicher ausgelagert ist? MMU erkennt beim Versuch der Adressumsetzung von der logischen in die physikalische Adresse, dass das Anwesenheitsbit im Seitendeskriptor nicht gesetzt ist (2 Punkte) b) Was läuft im System nach dieser Erkennung ab? Beschreiben Sie die einzelnen Schritte, die im Betriebssystem abgewickelt werden, um den Speicher verfügbar zu machen und geben Sie an, welche Prozesszustände der auslösende Prozess dabei jeweils einnimmt. 8 Punkte 1. Die MMU löst einen Trap aus -> Aktivierung des Betriebssystems (page fault handling) 2. Prozess wird in Zustand blockiert überführt 3. BS sucht einen freien Seitenrahmen, ggf muss eine andere Seite ausgelagert werden 4. Einlagerung der Seite von der Platte wird angestossen 5. Erfolgte Einlagerung wird per Interrupt gemeldet 6. Seitendeskriptor wird aktualisiert 7. Prozess wird in Zustand bereit überführt 8. Wenn Prozess wieder die CPU zugeteilt bekommt, wird der fehlgeschlagene Befehl wiederholt - 18 von 18 -