3.2.4 Prozesse erzeugen

[gesichtete Version][gesichtete Version]
Keine Bearbeitungszusammenfassung
 
(25 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
<p>
<loop_index id="5fa9786ef4096">Prozess|Prozess-ID|PID</loop_index>
{{#index:Prozess|Prozess-ID|PID}}
Während der Laufzeit eines Betriebssystems werden ständig Prozesse erzeugt, abgearbeitet, unterbrochen, weiter abgearbeitet und irgendwann schließlich beendet.
Während der Laufzeit eines Betriebssystems werden ständig Prozesse erzeugt, abgearbeitet, unterbrochen, weiter abgearbeitet und irgendwann schließlich beendet. Jeder Prozess erhält dabei zur Unterscheidung und Verwaltung eine eindeutige Prozess-ID (kurz: PID). Diese PID ist üblicherweise eine ganze Zahl, größergleich Null.
</p>
</p>


<br />
<br />
==== Erzeugen des ersten Prozesses ====
== Prozess-ID ==
<p>
{{#index:Prozess erzeugen|erzeugen, Prozess}}
Wird der Rechner eingeschaltet, so startet üblicherweise das Betriebssystem. Dabei muss es ganz zu Beginn einen Mechanismus geben, welcher den ersten Prozess des Betriebssystems erzeugt. Dieser erhält die Prozess-ID 0 (Null).
</p>
<p>
Ausgehend vom ersten Prozess starten dann i.d.R. weitere Prozesse, die zum Betriebssystem gehören, und zur Erfüllung der [[Zentrale Aufgabe eines Betriebssystems|Zentralen Aufgabe eines Betriebssystems]] benötigt werden.
</p>
<p>
<p>
Später kann der Anwender oder Administrator weitere Anwendungsprogramme starten, die jeweils als eigener Prozess vom Betriebssystem verwaltet werden.
<loop_index id="5fa9786ef409c">Prozess-ID|Process-ID|process identifier|PID</loop_index>Jeder Prozess erhält zur Unterscheidung und Verwaltung direkt bei seiner Erzeugung eine eindeutige Prozess-ID (engl.: process identifier, kurz: PID).<br />
Diese PID ist üblicherweise eine ganze Zahl, größergleich Null.
</p>
</p>


<br />
<br />


==== Allgemeine Erzeugung eines Prozesses ====
== Erzeugen des ersten Prozesses ==
<p>
<p>
{{#index:Systemaufruf}}
<loop_index id="5fa9786ef40a0">Prozess erzeugen|erzeugen, Prozess</loop_index>
Ganz allgemein hängt es vom Betriebssystem ab, wie genau die Erzeugung eines Prozesses erfolgt. Unter Unix/Linux gibt es dazu einen Systemaufruf ''fork'', unter Windows heißt dieser Systemaufruf ''CreateProcess''. Beide Varianten arbeiten sehr unterschiedlich.
Wird der Rechner eingeschaltet, so startet üblicherweise das Betriebssystem. Dabei muss es ganz zu Beginn einen Mechanismus geben, welcher den ersten Prozess des Betriebssystems erzeugt. Dieser erhält (zumindest in der Theorie) die Prozess-ID 0 (Null).
</p>
</p>
<br />
==== fork ====
<p>
<p>
{{#index:Prozess erzeugen, fork|erzeugen, Prozess, fork|fork|Elternprozess|Kindprozess}}
Ausgehend vom ersten Prozess starten dann i.d.R. weitere Prozesse, die zum Betriebssystem gehören, und zur Erfüllung der [[Zentrale Aufgabe eines Betriebssystems|Zentralen Aufgabe eines Betriebssystems]] benötigt werden.
Der Systemaufruf ''fork'' sorgt dafür, dass vom aufrufenden Prozess (Elternprozess) eine exakte Kopie (Kindprozess) erzeugt wird. Der Kindprozess erhält eine eigene Prozess-ID, übernimmt sonst aber alle Informationen des Elternprozesses: Programmtext, Datensegment, Befehlszähler, etc.
</p>
</p>
<p>
<p>
<loop_area type="example">
Später kann der Anwender oder Administrator weitere Anwendungsprogramme starten, die jeweils als eigener Prozess vom Betriebssystem verwaltet werden.
<p>
[http://www.nt.fh-koeln.de/vogt/ Prof. Dr. Carsten Vogt von der FH Köln] hat online ein kleines Analogbeispiel zum ''fork''-Systemaufruf bereitgestellt. [http://de.wikipedia.org/wiki/Dolly_%28Schaf%29 Klon-Schaf Dolly] lässt grüßen.
</p>
<p>
http://www.nt.fh-koeln.de/vogt/bs/animationen/ForkAnalogbeispielAnimation.pdf
</p>
</loop_area>
</p>
</p>


<p>
<br />
Der Kindprozess wird direkt nach dem ''fork'' unabhängig vom Elternprozess als eigenständige Instanz auf dem System verwaltet und ausgeführt. Sowohl Eltern- als auch Kindprozess laufen nach dem "klonen" an gleicher Stelle weiter: Der Rückgabewert von ''fork'' wird geliefert und die direkt auf das ''fork'' folgende Anweisung wird ausgeführt.
</p>
<p>
<p>
<loop_area type="example">
<loop_area type="example">
<p>
<p>
Unter http://de.wikipedia.org/wiki/Fork_%28Unix%29 findet sich ein Beispiel, welches den Aufruf der fork-Funktion zeigt, und bei dem anhand des Rückgabewertes entschieden wird, ob man sich im Elternprozess, oder im Kindprozess befindet.
<loop_index id="5fa9786ef40a4">init-Prozess, Linux</loop_index>
* Rückgabewert von ''fork'' > 0: Elternprozess (Der Wert ist die PID des Kindprozesses.)
Unter Unix-orientierten Betriebssystemen (wie z.B. Linux) ist der erste Prozess üblicherweise der ''init''-Prozess. Dieser erhält die PID 1. Die PID 0 wird hier nicht vergeben.
* Rückgabewert von ''fork'' = 0: Kindprozess
* Rückgabewert von ''fork'' < 0: Es ist ein Fehler aufgetreten.
</p>
</loop_area>
</p>
 
<br />
 
==== CreateProcess ====
<p>
{{#index:Prozess erzeugen, CreateProcess|erzeugen, Prozess, CreateProcess|CreateProcess}}
Der Systemaufruf ''CreateProcess'' unter Windows läuft sehr viel komplexer ab, als ein ''fork'' unter Unix/Linux. <cite>Solomon+et.al.+2006</cite> beschreiben sechs Hauptphasen bei der Prozesserzeugung.
* Phase 1 beginnt mit dem Öffnen der EXE-Datei.
* Die Phasen 2 und 3 erstellen notwenige Verwaltungsobjekte.
* Phase 4 informiert das Windows-Subsystem über den hier neu erstellten Prozess.
* Phase 5 leitet die Ausführung des neu erstellten Prozesses ein.
* Phase 6 nimmt alle abschließenden Initialisierungen vor.
Anschließend ist der neue Prozess komplett erstellt und wartet auf die Zuteilung der CPU.
</p>
<p>
<loop_area type="notice">
<p>
Eine detailliertere Beschreibung der einzelnen Phasen findet sich bei <cite>Solomon+et.al.+2006</cite>. Der geneigte Leser erhält dort weitere Informationen.
</p>
<p>
Microsoft stellt unter <br />
<small>http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx</small> <br />
Informationen zum Funktionsaufruf von ''CreateProcess'' bereit und erläutert die zahlreichen Übergabeparameter.
</p>
<p>
Weiterhin gibt Microsoft unter <br />
<small>http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx</small> <br />
ein sehr einfach gehaltenes Beispielprogramm an, welches den Systemaufruf ''CreateProcess'' durchführt. Ein Anwender mit Windows-Erfahrung kann sich so sicher leicht vorstellen, wie ein Doppelklick auf ein Programmsymbol (oder alternativ auf eine EXE-Datei) zum Aufruf der ''CreateProcess''-Funktion führt.
</p>
 
</loop_area>
</p>
 
<p>
<br />
==== Aufgabe 1 ====
<loop_area type="task">
<loop_task title="Vater- und Sohn-Variable">
<p>
[http://www.nt.fh-koeln.de/vogt/ Prof. Dr. Carsten Vogt von der FH Köln] zeigt und erläutert unter
</p>
</p>
<p>
<p>
http://www.nt.fh-koeln.de/vogt/bs/animationen/ForkSpeicherAnimation.pdf
<loop_index id="5fa9786ef40a8">System-Idle-Prozess, Windows</loop_index><loop_index id="5fa978ba26bb5">Leerlaufprozess, Windows</loop_index>
Unter Windows gibt es einen ''System-Idle''-Prozess mit der PID 0. In deutschen Windows-Versionen heißt dieser ''Leerlaufprozess''. Dieser Prozess hat einen speziellen Hintergrund: Wenn kein anderer Prozess im Betriebssytem zur Ausführung bereit ist, wird der Leerlaufprozess ausgeführt. Er nutzt damit ungenutze Rechenzeit auf der CPU.
</p>
</p>
<p>
wie eine Variable durch ein ''fork'' sowohl im Vater-, als auch im Sohn-Prozess existiert und unabhängig voneinander mit Werten belegt sein kann.
</p>
<p>
Schau es dir an!
</p>
</loop_task>
</loop_area>
</loop_area>
</p>
</p>
Zeile 113: Zeile 40:
<br />
<br />


==== Aufgabe 2 ====
== Allgemeine Erzeugung eines Prozesses ==
<loop_area type="task">
<loop_task title="fork gleich mehrmals">
<p>
<p>
Was passiert eigentlich bei mehrmaligem Aufruf von ''fork''?
<loop_index id="5fa9786ef40ac">Systemaufruf</loop_index><loop_index id="5fa9786f2e15e">fork</loop_index><loop_index id="5fa9786f2e167">CreateProcess, Windows</loop_index>
</p>
Ganz allgemein hängt es vom Betriebssystem ab, wie genau die Erzeugung eines Prozesses erfolgt. Unter Unix/Linux gibt es dazu einen Systemaufruf ''fork'', unter Windows heißt dieser Systemaufruf ''CreateProcess''. Beide Varianten arbeiten sehr unterschiedlich.
<p>
Betrachte den C-Quelltext des kleinen Beispielprogramms direkt unter dieser Aufgabe. Was denkst Du: Wieviele Prozesse werden durch die Ausführung des Programms insgesamt erzeugt?
</p>
<p>
<small>
Falls du vorhast den Quelltext zu compillieren und auszuführen:
* Erst nachdenken und eine Prognose notieren!
* Dann die Prognosen innerhalb deiner Lerngruppe vergleichen und diskutieren.
* Am Ende schließlich compillieren, ausführen und die Prognose überprüfen.
</small>
</p>
</p>


</loop_task>
</loop_area>
</p>
<p>
<loop_area type="sourcecode">
<span style="font-family:Courier">
<p>
&#35;include <stdio.h> <br />
&#35;include <stdlib.h>
</p>
<p>
int main () <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;int pid;
</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;pid = fork(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;pid = fork(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;pid = fork(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;pid = fork();
</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;printf("Hier ist ein Prozess mit ID %d!\n", getpid()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0; <br />
}
</p>
</span>
</loop_area>
</p>
<p>
<br />
<br />
==== Aufgabe 3 ====
<loop_area type="task">
<loop_task title="Ein anderes Programm mittels fork starten">
<p>
<p>
Schaust du dir die Unterschiede zwischen ''fork'' und ''CreateProcess'' genauer an, so fällt auf, dass bei ''CreateProcess'' eine andere Anwendung gestartet wird, während ''fork'' lediglich eine Kopie eines bereits existierenden Prozesses erzeugt.
== So geht es weiter: ==
</p>
</p>
<p>
<p>
Wie kann mittels ''fork'' ein anderes Programm gestartet werden? <br />
<loop_area type="arrangement"><loop_toc> </loop_toc></loop_area>
Erläutere mit deinen eigenen Worten die Vorgehensweise dabei!
</p>
<small>
<p>
<cite>Achilles+2006</cite> gibt Hinweise dazu in Kapitel 3.2.1 und 3.2.2. (Studierende sind oftmals berechtigt, eine PDF-Version dieses Buches ohne entstehende Kosten [[Hinweise für Studierende#Downloadbare Bücher von Springerlink|über ihre Hochschulen von Springerlink zu beziehen.]])
</p>
</small>
</loop_task>
</loop_area>
</p>
</p>



Aktuelle Version vom 10. November 2020, 13:39 Uhr

Während der Laufzeit eines Betriebssystems werden ständig Prozesse erzeugt, abgearbeitet, unterbrochen, weiter abgearbeitet und irgendwann schließlich beendet.


Prozess-ID

Jeder Prozess erhält zur Unterscheidung und Verwaltung direkt bei seiner Erzeugung eine eindeutige Prozess-ID (engl.: process identifier, kurz: PID).
Diese PID ist üblicherweise eine ganze Zahl, größergleich Null.


Erzeugen des ersten Prozesses

Wird der Rechner eingeschaltet, so startet üblicherweise das Betriebssystem. Dabei muss es ganz zu Beginn einen Mechanismus geben, welcher den ersten Prozess des Betriebssystems erzeugt. Dieser erhält (zumindest in der Theorie) die Prozess-ID 0 (Null).

Ausgehend vom ersten Prozess starten dann i.d.R. weitere Prozesse, die zum Betriebssystem gehören, und zur Erfüllung der Zentralen Aufgabe eines Betriebssystems benötigt werden.

Später kann der Anwender oder Administrator weitere Anwendungsprogramme starten, die jeweils als eigener Prozess vom Betriebssystem verwaltet werden.


Beispiel

Unter Unix-orientierten Betriebssystemen (wie z.B. Linux) ist der erste Prozess üblicherweise der init-Prozess. Dieser erhält die PID 1. Die PID 0 wird hier nicht vergeben.

Unter Windows gibt es einen System-Idle-Prozess mit der PID 0. In deutschen Windows-Versionen heißt dieser Leerlaufprozess. Dieser Prozess hat einen speziellen Hintergrund: Wenn kein anderer Prozess im Betriebssytem zur Ausführung bereit ist, wird der Leerlaufprozess ausgeführt. Er nutzt damit ungenutze Rechenzeit auf der CPU.


Allgemeine Erzeugung eines Prozesses

Ganz allgemein hängt es vom Betriebssystem ab, wie genau die Erzeugung eines Prozesses erfolgt. Unter Unix/Linux gibt es dazu einen Systemaufruf fork, unter Windows heißt dieser Systemaufruf CreateProcess. Beide Varianten arbeiten sehr unterschiedlich.


So geht es weiter:



Diese Seite steht unter der Creative Commons Namensnennung 3.0 Unported Lizenz http://i.creativecommons.org/l/by/3.0/80x15.png