18
GTI (Fach) / Prozess-Verwaltung (Lektion)
Prozess-Verwaltung
Diese Lektion wurde von linbu erstellt.
Diese Lektion ist leider nicht zum lernen freigegeben.
Anzeige
- Welche Speicherbereiche und Datenstrukturen sind einem Prozess (a) im Nutzer-Raum (user space) und (b) im Kernel-Raum (kernel space) zugeordnet? (a) Nutzer-Programm und -Daten User-Stack (b) Prozessdeskriptor Kernel-Stack
- In welcher Situation wird vom User- in den Kernel-Mode umgeschaltet? Der Nutzer-Prozess fuhrt einen Systemruf durch. Der Prozess erzeugt im User-Mode eine Exception (z.B. Speicher-Seite ausgelagert). Ein Peripherie-Baustein meldet einen Interrupt an (z.B. Daten von E/AOperation vorhanden).
- Moderne Betriebssysteme erfordern Prozessoren, bei denen Befehle in mindestens 2 Privilegstufen, dem User- oder dem Kernel-Mode, ausgeführt werden können. In welcher Hinsicht beeinflusst diese Unterscheidung die Bearbeitung eines Programms? Bestimmte Kommandos werdem von der CPU nur im Kernel-Mode ausgeführt. Deshalb müssen Prozesse, die im User-Mode laufen, über Systemrufe(Traps) in den Kernel-Mode übergehen. Dabei können sie nur über die Systemrufe definierten (und kontrollierten) Funktionen ausführen, ohne Schaden anzurichten.
- Definieren Sie den Begriff \wiedereintrittsfeste (re-entrante) Funktion". Eine Funktion heißt \reentrant", wenn sie ohne wechselseitige Beeinflussung gleichzeitig von mehreren Prozessen/Threads benutzt werden kann und dabei tatsächlich auch gleichzeitig ausgeführt wird.
- Wie muss eine Kernel-Funktion entworfen sein, welche die Forderung der Wiedereintrittsfestigkeit erfüllt? globale Ressourcen durch Synchronisationsmechanismen schützen (globale Variablen werden soweit wie möglich vermieden)
- Wie gelangt ein Prozess bei einem Systemruf aus dem User-Mode in den Kernel-Mode und zurück? Mit Hardware-Unterstützung wird auf den Kernel-Mode umgeschaltet. Dies beinhaltet auch die Umschaltung auf Code-, Daten- und Stack-Segment des Kernels sowie die Zuweisung eines neuen Stack-Pointers im Stack-Segment des Kernels. Ab dieser Stelle wird der Kernel-Stack des Prozesses benutzt. Auf dem Kernel-Stack wird dann der alte Stack-Pointer, das Prozessor-Status-Register und der alte Befehlszeiger abgespeichert. Anschließend wird softwaremäßig der gesamte Hardware-Kontext des User-Modes (User-Kontext) auf dem Kernel-Stack abgespeichert (Kernel kann alle CPU-Register ohne Einschränkungen nutzen). Vor der Rückkehr aus dem Kernel-Mode werden zunächst softwaremäßig alle CPU-Register restauriert. Bei Rückkehr mit 'iret' werden mit Hardware-Unterstützung der User-Stack-Pointer, des Prozessor-Status-Register und der alte Befehlszeiger restauriert.
- Warum braucht ein Prozess jeweils einen separaten Stack für den User- und den Kernel-Mode, warum genügt nicht ein einziger Stack für beide Modi? Userprozess könnte Stack-Pointer beliebig verändern = Herr übers System, bei Stack- Überlauf könnte es zum Überschreiben anderer Datenbereiche kommen Bei Beendigung des Prozesses wird der Datenbereich des Prozesses (und damit auch der Stack) freigegeben. Würde der User-Stack benutzt, so würde sich das Programm den noch benutzten Stack-Speicher selbst entziehen.
- Ein Nutzer startet aus einer Unix-Shell ein Anwenderprogramm. Welche Systemrufe werden dabei für den Start des Programms benutzt? Beschreiben Sie die Wirkung der Systemrufe. fork() startet einen neuen Prozess, der eine exakte Kopie des Elternprozesses ist (abgesehen von PID). execve() das neue Programm wird geladen und ausgeführt.
- Warum ist der "Copy-on-Write"-Mechanismus effizienter als das Kopieren aller Seiten des Elternprozesses auf den Kind-Prozess? Speicher-Verwaltung: beim Duplizieren des Adressraums müssen neue Seiten und neue Seitentabellen angefordert und initialisiert werden. Die Seiten des Eltern-Prozesses müssen in die Seiten des Kind-Prozesses kopiert werden. Es sind eine Vielzahl von Speicherzugriffen und CPU-Zyklen erforderlich, wodurch unter Umständen die Inhalte der Cache-Speicher \verdorben" werden. Der Vorgang ist in den meisten Fällen unnötig, da das Kind häufig ohnehin ein neues Programm lädt, wobei der mühsam angelegte und initialisierte ererbte Adressraum verworfen wird. Auch wenn kein neues Programm geladen wird, wird der Kind-Prozess selten alle Speicherinhalte (alle Seiten) des Prozesses modizieren; eine Kopie aller Seiten würde also Speicher verschwenden.
- Erläutern Sie den Copy-on-Write-Mechanismus. Der Eltern-Prozess wird nicht komplett kopiert: die Seiten des Elternprozesses werden nun von Eltern und Kind gemeinsam benutzen, sind nun allerdings schreibgeschützt. Bei lesendem Zugriff also kein Problem, will aber ein Prozess eine Seiten beschreiben, wird ein Kopie dieser Seite angelegt. Diese darf nun beschrieben werden. Erst wenn es nur noch einen Prozess gibt, der auf die Seite zugreift, wird auch beim original der Schreibschutz aufgehoben.Im Seiten-Deskriptor wird die Anzahl der Prozesse, die eine Seite gemeinsam nutzen gespeichert (Prozesserzeugung counter inkrementieren, Copy-On-Write und Prozessbeendigung dekrementieren).
- Anzeige
- Das "Copy-on-Write" Verfahren benötigt Hardwareunterstützung durch die Speicherverwaltungseinheit. Warum ist es nicht rein softwaretechnisch realisierbar? Die Seiten-Verwaltung ist mit hardwareseitiger Unterstützung so organisiert, dass die Seiten schreibgeschützt angelegt und eine Exception ausgelöst wird, sobald ein Prozess versucht, eine schreibgeschützte Seite zu beschreiben.Ohne Hardwareunterstützung wäre der Schreibschutz nicht möglich.
- In Unix/Linux werden die Kernel-Ressourcen eines Prozesses bei Beendigung von dessen Elternprozess freigegeben. Was geschieht, wenn erst der Elternprozess und dann der Kindprozess endet? Wie wird verhindert, dass der Kernelspeicher für die Ressource Der Init-Prozess (Prozess 1) "adoptiert" alle "verwaisten" Prozesse und überprüft regelmäßig mit wait(), ob der Prozess schon beendet wurde und gibt den Speicher in diesem Fall frei.
- Welche Informationen sind in einem Prozess-Deskriptor gespeichert? Prozess-Kontext Prozess-Zustand Informationen zur Prozess-Hierarchie Prozess-Listen-Information Prozess-ID Speicher-Ressourcen Weitere Ressourcen Scheduling-Informationen
- Wann blockiert ein Prozess? Wie kommt es in diesem Fall zum Prozesswechsel? Grund:Wenn er auf eine Ressource warten muss Prozesswechsel:Die Funktion schedule() wird im Kernel-Pfad direkt aufgerufen. Der Prozess fügt seinem Deskriptor in die passende Warteliste ein, setzt seinen Zustand auf "blockiert" und taucht in die Funktion schedule() ab. Diese Funktion verlässt der Prozess erst wieder, wenn die Ressource wieder verfügbar ist.
- Durch welche Vorgänge kann ein blockierter Prozess geweckt werden? Was geschieht beim Wecken? Grund:Wenn die angeforderte Ressource des blockierten Prozesses verfügbar ist. Wecken:Der Prozess kehrt aus schedule() wieder zurück. Danach wird die Bedingung "Daten vorhanden" überprüft, ist Bedingung enfüllt, so wird die Schleife verlassen, der Prozess wird auf den Zustand "laufend" gesetzt und aus der Warteliste ausgekoppelt. (Ist die Bedingung hingegen noch nicht oder nicht mehr erfüllt, so taucht der Prozess wieder in den Scheduler ab.)
- Ein Prozess kann (a) von der CPU verdrängt werden, wenn seine Zeitscheibe abgelaufen ist oder ein höherpriorisierter Prozess lauffähig geworden ist, oder er kann (b) die CPU aufgeben, entweder indem er bei Nichtverfügbarkeit einer Ressource blockiert oder indem er die CPU freiwillig aufgibt. Wie unterscheiden sich die beiden Fälle bzgl. des Scheduleraufrufes? (a) indirekter Aufruf:Der Scheduler-Aufruf erfolgt aus einem Interrupt heraus (z.B. E/A-Interrupt, Timer-Interrupt). Der Eintrag need_resched (nur nicht-praemptiver Kernel) im Prozess-Deskriptor wird gesetzt. Dieser wird unmittelbar vor Rückkehr in den User-Mode uberprüft und schedule() aufgerufen. (b) direkten Aufruf:Blockiert ein Prozess wird die Funktion schedule() im Kernel-Pfad direkt aufgerufen.
- Beim Scheduling-Verfahren von Linux wird jedem Prozess am Anfang einer Epoche ein initialer Zählerwert zugewiesen, welcher die dynamische Priorität und das dem Prozess zustehende Zeitquantum beinhaltet. Warum ist das Verfahren so gestaltet, dass der initiale Zählerwert von Epoche zu Epoche anwächst, solange der Prozess blockiert ist? Das Verfahren ist so gestaltet, damit I/O-lastige Prozesse nicht benachteiligt werden. Durch die Erhöhung der dynamischen Prioritat von Epoche zu Epoche, erhält der Prozess in der nächsten Epoche eine größere Zeitscheibe. Zudem sorgt die hohe dynamische Prioritat dafür, dass I/O-lastige Prozesse beim Aufwecken den aktuellen Prozess verdrängenkönnen.
- Durch welche Vorgänge kann ein laufender Prozess von der CPU verdrängt werden? Zeitscheibe abgelaufen durch höher priorisierten Prozess Prozess endet wegen Fehler Ressource nicht verfügbar, der Prozess blockiert