Vorlesung Betriebssysteme 3. ?· Unter Linux werden alle lauffähigen Prozesses in einer runqueue ...…

  • Published on
    05-Jun-2018

  • View
    212

  • Download
    0

Embed Size (px)

Transcript

<ul><li><p>1Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>Vorlesung Betriebssysteme3. Prozesse</p></li><li><p>2Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>bersicht</p><p>1. Ziel diese Kapitels2. Prozessmodell3. Systemaufrufe fr Prozesse4. Threads5. Scheduling6. Scheduling mit besonderen Zielen</p></li><li><p>3Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>1. Ziel dieses KapitelsEin Prozess kann als die Abstraktion eines Programms, das von einem Prozessor ausgefhrt wird, angesehen werden. Hier wird behandelt, was Prozesse sind und wie sie in Betriebssystemen implementiert werden, inklusive Scheduling.</p><p>Relevante Abschnitte im Buch [1] Abschnitte 1.5.1 und 1.6 Abschnitte 2.1, 2.2 und 2.5 Abschnitt 8.1.4</p><p>Zustzlich: Real-Time Scheduling </p><p>Literatur-Hinweise:[2] Albrecht Achilles: Betriebssysteme, Springer[3] Wolfgang Mauerer: LINUX Kernelarchitektur - Konzepte, Strukturen und </p><p>Algorithmen von Kernel 2.6, Hanser</p></li><li><p>4Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. ProzessmodellUm zu verstehen, wie unterschiedliche Aktivitten scheinbar gleichzeitig ablaufen, braucht man ein Modell eines ablaufenden Programms.Ein (sequentieller) Prozess ist ein sich in Ausfhrung befindendes (sequentielles) Programm zusammen mit:</p><p> dem aktuellen Wert des Programmzhler, den Registerinhalten, den Werten der Variablen, dem Stack und dem Zustand der geffneten Dateien und Netzverbindungen. den Programmdaten Speicherinformationen</p><p>Konzeptionell besitzt jeder Prozess seinen eigenen Prozessor - in der Praxis wird aber immer der reale Prozessor zwischen den Prozessen hin- und hergeschaltet. Da dies die Illusion erweckt, dass die Prozesse gleichzeitig ablaufen, spricht man auch von Quasi-Parallelitt.</p></li><li><p>5Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. ProzessmodellBeim Mehrprogrammbetrieb mit 4 Programmen (A,B,C,D) ergeben sich damit folgende Sichtweisen:</p><p>Ein Scheduling-Algorithmus entscheidet, wann die Arbeit eines Prozesses unterbrochen und ein anderer Prozess bedient wird.</p><p>real ist zu jedem Zeitpunkt nur ein sequentielles </p><p>Programm aktivD</p><p>C</p><p>B</p><p>A</p><p>DCA</p><p>ein HW Programm-zhler A</p><p>C B</p><p>Konzeptionell4 Programmzhler:</p><p>4 unabhngige Prozesse</p><p>B</p><p>Arbeitsspeicher mit 4 Programmen</p><p>D</p></li><li><p>6Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. Prozessmodell2.1 Erzeugen &amp; Beenden</p><p>Es gibt vier Mglichkeiten, einen Prozess zu erzeugen:1. Beim Systemstart (Initialisierung)2. Durch einen anderen Prozess (Systemaufruf z.B. fork)3. Interaktiv durch den Benutzer4. Per Stapelverarbeitung (Batch Job)</p><p> Analog dazu knnen Prozesse beendet werden durch:5. Normales Beenden (freiwillig)6. Aufgrund eines Fehlers (freiwillig)7. Aufgrund eines schweren Fehlers (unfreiwillig)8. Durch einen anderen Prozess (unfreiwillig)</p></li><li><p>7Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. ProzessmodellProzess-Hierarchie Durch das Erzeugen von neuen Prozessen (Kindern), ausgehend von einem </p><p>Erzeuger-Prozess (Vater), entsteht eine Baumstruktur von Prozessen. Dabei ist es in vielen Fllen nicht erforderlich, dass der Vater auf das Terminieren der Kinder wartet, z.B. wenn eine Suchanfrage ber das Internet gestellt wird und die Antwort lange auf sich warten lsst.</p><p> Beispiel fr einen Baum:</p><p>a</p><p>b c</p><p>d e f g</p><p>h i j</p></li><li><p>8Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. Prozessmodell2.3 ProzesszustndeEine Aufgabe des Betriebssystems ist das Multiplexen des physischen Prozessors. Diese Aufgabe bernimmt der Scheduler zusammen mit dem Dispatcher.</p><p>Prozesse knnen sich in verschiedenen Zustnden befinden. Diese Zustnde bilden eine Entscheidungsgrundlage fr die Auswahl eines geeigneten Kandidaten bei einem Prozesswechsel:</p><p>1. rechnend (running)der Prozessor ist dem Prozess zugeteilt</p><p>2. bereit (ready)der Prozess ist ausfhrbar, aber ein anderer Prozess ist gerade rechnend</p><p>3. blockiert (waiting)der Prozess kann nicht ausgefhrt werden, da er auf ein externes Ereignis wartet (z.B. liegen bestimmte Eingabedaten noch nicht vor).</p></li><li><p>9Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. ProzessmodellDabei knnen folgende Zustandsbergnge auftreten:</p><p>rechnend</p><p>blockiert bereit</p><p>1: Prozess wartet auf externes Ereignis2: Scheduler whlt anderen Prozess aus, da die Zeitscheibe des Prozesses abgelaufen ist3: Scheduler whlt diesen Prozess aus4: externes Ereignis ist eingetreten5: ein neuer Prozess wird erzeugt6: der Prozess terminiert</p><p>12</p><p>3</p><p>4</p><p>6</p><p>5</p></li><li><p>10Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. ProzessmodellIn der Praxis jedoch werden die Zustnde feiner unterteilt, so dass auch durchaus zwischen mehr Zustnden unterschieden wird (z.B. der theoretische Zustand blockiert (Wartezustand) kann in einem realen Betriebssystem durch zwei Zustnde, nmlich warten_auf_ein_Zeitereignis und warten_auf_Ein/Ausgabe abgebildet sein).Linux kennt insgesamt 5 Prozesszustnde:1. TASK_RUNNING</p><p>Unter Linux werden alle lauffhigen Prozesses in einer runqueue genannten Liste eingehngt. Aus dieser Liste whlt der Scheduler den nchsten aktiven Rechenprozess aus (damit entspricht der Zustand TASK_RUNNING dem oben erwhnten Zustand bereit). </p><p>2. TASK_INTERRUPTIBLEIn diesem Wartezustand kann der Prozess durch Signale oder durch das Ablaufen eines Timers unterbrochen und wieder in den Zustand TASK_RUNNING berfhrt werden. </p></li><li><p>11Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. Prozessmodell3. TASK_UNINTERRUPTIBLE</p><p>Dies ist ebenfalls ein Wartezustand. Im Unterschied zu TASK_INTERRUPTIBLE kann der Task jedoch nur durch ein wake_up wieder in den Zustand TASK_RUNNING berfhrt werden. </p><p>4. TASK_ZOMBIEDer Task mit diesem Zustand gilt zwar als beendet, aber der zugehrige Vater-Prozess hat bisher noch nicht den Prozess-Status abgeholt. </p><p>5. TASK_STOPPEDDer Task wurde angehalten, entweder durch ein entsprechendes Signal oder durch ptrace. Der Systemcall ptrace ermglicht einem Vater-Prozess das Debugging des Kind-Prozesses. </p></li><li><p>12Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. ProzessmodellUnter Linux existiert der Zustand rechnend nicht explizit. Der Zustand </p><p> bereit ist unter Linux der Zustand RUNNING, der Zustand blockiert wird ber INTERRUPTIBLE und </p><p>UNINTERRUPTIBLE abgebildet. Die Zustnde ZOMBIE und STOPPED beschreiben, dass ein Prozess </p><p>nicht (mehr) aktiv ist.Folgende Prozessbergnge sind mglich:</p><p>running</p><p>uninterruptibleinterruptiblestopped zombie</p><p>current</p><p>fork/clone</p><p>exitexit</p><p>wait</p><p>sleepsleep</p><p>wakeupwakeupsignal</p><p>scheduler</p></li><li><p>13Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. Prozessmodell2.4 Implementierung von Prozessen</p><p>Das o.g. Prozessmodell wird in einem Betriebssystem durch eine Prozesstabelle realisiert, die fr jeden Prozess einen Eintrag (Process Control Block (PCB)) enthlt. Der PCB stellt alle Informationen bereit, die fr den Ablauf eines Prozesses notwendig sind.</p><p>Je nach Betriebssystem variieren diese Felder. In Unix kann man sich einige der Felder der Prozesstabelle mit dem Shell-Kommando ps ansehen:</p><p>$ ps -o "%p %r %c %x %t %G %P %U %z" PID PGID COMMAND TIME ELAPSED GROUP PPID USER VSZ 4334 4334 bash 00:00:00 05:59:24 users 4325 peter 401214103 14103 ps 00:00:00 49710-06:28:08 users 4334 peter 2160$</p></li><li><p>14Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. ProzessmodellBeispiel: Unter Linux werden Prozesse mithilfe der Struktur task_struct verwaltet (definiert in /usr/src/linux-headers-/include/linux/sched.h). Die ca. 80 Eintrge beinhalten Information ber [2, 3]:</p><p> Identitt (PID), Zeiger auf Eltern und andere verwandte Prozesse Priorittskennzahlen, Zeit (z.B. Rechenzeit) den belegten Speicher den Prozess-Status Benutzer- und Gruppenkennzahlen, Ausfhrungsrechte verwendete Dateien anstehende Signale verwendetes Binrformat enthaltene Threads Beschrnkung bzgl. Ressourcen-Verbrauch (struct rlimit)</p></li><li><p>15Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>2. ProzessmodellBei einem Prozesswechsel (Context Switch) muss vorbereitet werden, einen Prozess spter wieder anlaufen lassen zu knnen, wenn er einmal suspendiert wurde. Dabei werden in der Regel recht komplexe Vorgnge in Gang gesetzt, die dafr zu sorgen haben,</p><p> dass alle bentigten Laufzeit-Daten (Register inkl. PC und Stack) des laufenden Prozesses gesichert werden und</p><p> dass der neue Prozess an exakt an der Stelle weiter machen kann, an der er zuvor unterbrochen wurde (durch das Laden eben dieser Daten).</p><p>Beispiel: Unter Linux wird dies in der Quelldatei kernel/sched.c umgesetzt: eine Funktion schedule()ruft eine Funktion context_switch auf.</p></li><li><p>16Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>3. Systemaufrufe fr Prozesse3.1 Prozessverwaltung Ein Prozess besitzt einen Adressraum, in dem er abluft. Der Prozessraum ist </p><p>in mehrere Teile (Segmente) aufgeteilt.</p><p>Heap</p><p>Daten</p><p>Text-segment 0000</p><p>FFFF Der Programmcode befindet sich im Textsegment.Im Datensegment sind globale Objekte abgelegt, dann folgt der Heap fr dynamische Objekte.Der Stack ist zur Speicherung lokaler Objekte und fr Rcksprungadressen bei Rekursionen ntig.</p><p>Stack</p></li><li><p>17Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>3. Systemaufrufe fr Prozesse Ein neuer Prozess wird erzeugt, indem ein Eltern-Prozess durch den </p><p>Systemaufruf fork einen Kind-Prozess erzeugt: Der Aufruf erzeugt eine exakte Kopie des Originalprozesses (Kind=Clone </p><p>des Vaters) einschlielich aller Dateideskriptoren, Register usw. Nach dem fork werden beide Prozesse unterschiedliche Aktivitten </p><p>bernehmen. Zum Zeitpunkt des fork haben alle Variablen die gleichen Werte. Nach dem fork wirken sich nderungen der Variablen nur noch im </p><p>jeweiligen Prozess aus. </p><p>Daten</p><p>StackFFFF</p><p>0000</p><p>...pid=fork()</p><p>...</p><p>Daten</p><p>StackFFFF</p><p>0000</p><p>...pid=fork()</p><p>...</p><p>Vater Kind</p></li><li><p>18Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>3. Systemaufrufe fr Prozesse Vater- und Kind-Prozess unterscheiden sich allerdings anhand ihrer </p><p>Prozessnummer. Auerdem gibt der fork-Aufruf einen Wert zurck, durch den im Programm unterschieden werden kann, ob der Code des Kindes oder des Vaters gemeint ist: </p><p> = 0 ist der Kindprozess, &gt; 0 ist die Prozessidentifikation (pid) des Kindprozesses fr den Vater-</p><p>Prozess. &lt; 0 ist, zeigt an, dass kein neuer Prozess erzeugt werden konnte (Fehler).</p></li><li><p>19Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>#include main(){</p><p>int childPid;if ((childPid = fork()) == -1) {</p><p>fprintf(stderr,"can't fork\n");exit(1);</p><p>} else if (childPid == 0) { /* child process */fprintf(stdout, "child: child pid = %d, parent pid = %d\n",</p><p>getpid(), getppid());exit(0);</p><p>} else { /* parent process */fprintf(stdout, "parent: child pid = %d, parent pid = %d\n",</p><p> childPid, getpid());exit(0);</p><p>}}</p><p>Ausgabe parent: child pid = 28891, parent pid = 28890</p><p>Ausgabe child: child pid = 28891, parent pid = 28890</p><p>3. Systemaufrufe fr Prozesse Beispiel:</p><p> exit beendet die Prozessausfhrung &amp; gibt Status zurck. getpid und getppid liefern die PID von einem Prozess bzw. die PID des eigenen Erzeugers.</p></li><li><p>20Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>3. Systemaufrufe fr Prozesse Ein reales Beispiel, bei dem ein Prozess mit fork erzeugt wird, ist die Shell:</p><p> Fr jedes Kommando, das aus der Shell heraus ausgefhrt wird, wird von der Shell ein eigener Prozess erzeugt. </p><p> Dabei dupliziert sich die Shell, berlagert den eigenen Code mit dem Code des auszufhrenden Kommandos und wartet, bis der so erzeugte Prozess terminiert.</p><p> Dazu werden die Systemaufrufe exec und wait, verwendet. (Es existieren mehrere Varianten der exec/wait-Systemaufrufe.) </p><p> Im nachfolgenden Schaubild wird dies anhand des Kommandos echo verdeutlicht.</p></li><li><p>21Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>3. Systemaufrufe fr Prozesse </p><p> Die Shell erzeugt durch fork einen Prozess und fhrt den Systemaufruf wait aus.</p><p> Dadurch wartet sie, bis sie ein Signal erhlt. Dieses Signal wird vom exit-Aufruf des Kindprozesses erzeugt. </p><p> Der Kindprozess benutzt den Systemaufruf exec. Dieser nimmt den Code des ersten Parameters (hier das echo-Kommando) und berlagert den eigenen Code damit.</p><p>shell subshell</p><p>wait()</p><p>shellluftweiter</p><p>exec(echo,..)</p><p>exit()</p><p>fork()</p></li><li><p>22Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>3. Systemaufrufe fr Prozesse Das folgende Programm ist Minishell und funktioniert nach dem o.g. Prinzip. void read_command(char *com, char **par){ fprintf(stdout, "$ "); ..... return; } int main(){ </p><p>int childPid, status;char command[20];char *parameters[60];while (1) {</p><p>read_command(command, parameters);</p><p>if ((childPid = fork()) == -1) {fprintf(stderr,"can't fork\n");exit(1); </p><p>} else if (childPid == 0) { /* child */execv(command, parameters);</p><p> exit(1); /* something wrong */}else</p><p>wait(&amp;status); /* parent process */ }</p><p>}</p></li><li><p>23Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>3. Systemaufrufe fr Prozesse exit hat einen Parameter, den so genannten Exitstatus; dies ist ein Integerwert </p><p>zwischen 0 und 255. Konvention in Unix ist, dass ein Exitstatus von Null bedeutet, dass die Aktion erfolgreich </p><p>ausgefhrt werden konnte. Jeder andere Wert wird als Fehler angesehen. </p><p> Dieser Status wird dem Elternprozess in der Variablen status des wait-Aufrufs mitgegeben. Der Returncode von wait ist die PID des Kindes.</p><p> Soll z.B. eine Kommunikation zwischen Kind und Eltern stattfinden, so kann das Kind z.B. durchexit(4); </p><p> dem Elternprozess die Nachricht 4 bergeben. Der Elternprozess wird durch n = wait(&amp;status);</p><p> dann die Information in der Variablen status sehen.</p></li><li><p>24Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>3. Systemaufrufe fr Prozesse3.2 SignaleWenn ein angeschlossenes Gert eine ihm bertragene Aufgabe erledigt hat, erzeugt es eine Benachrichtigung, die Interrupt genannt wird.Signale sind das quivalent im Bereich Software zu Interrupts im Bereich Hardware. Programme, die als Prozess innerhalb des Betriebssystems ablaufen, mssen unterbrechbar sein, damit z.B. ungewollte Aktionen nicht ausgefhrt werden. </p><p> So kann die Ausgabe (durch das Kommando cat) einer groen Datei mit CTR-C abgebrochen werden. Dadurch wird dem Ausgabeprozess ein Signal gesendet. Als Reaktion beendet der Prozess die Ausgabe.</p><p>Wenn ein Signal zu einem Prozess gesendet wird und der Prozess das Signal nicht annimmt, dann wird der Prozess vom Betriebssystem automatisch entfernt. Um sich vor diesem Automatismus schtzen zu knnen, kann sich ein Prozess durch den Systemaufruf signal auf das Eintreffen von Signalen vorbereiten. Dazu muss er eine Signalbehandlungroutine bereitstellen</p></li><li><p>25Peter Altenbernd Prozesse Betriebssysteme WS 2010/11 Hochschule Darmstadt</p><p>3. Systemaufrufe fr Prozesse</p><p>Ein Prozess, der eine Signalbehandlungroutine bereitgestellt hat, wird bei Eintreffen eines Signals angehalten,...</p></li></ul>

Recommended

View more >