3.2.4.1 Fork

[gesichtete Version][gesichtete Version]
Keine Bearbeitungszusammenfassung
(LOOP2 Upgrade)
Zeile 2: Zeile 2:


<p>
<p>
<loop_index>Prozess erzeugen, fork|erzeugen, Prozess, fork|fork|Elternprozess|Kindprozess</loop_index>
<loop_index id="5fa9785c29aa6">Prozess erzeugen, fork|erzeugen, Prozess, fork|fork|Elternprozess|Kindprozess</loop_index>
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.
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>
Zeile 45: Zeile 45:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Vater- und Sohn-Variable">
<loop_task title="Vater- und Sohn-Variable" id="5fa9785c29ab4">
<p>
<p>
[http://www.nt.fh-koeln.de/vogt/ Prof. Dr. Carsten Vogt von der FH Köln] zeigt und erläutert unter
[http://www.nt.fh-koeln.de/vogt/ Prof. Dr. Carsten Vogt von der FH Köln] zeigt und erläutert unter
Zeile 66: Zeile 66:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="fork gleich mehrmals">
<loop_task title="fork gleich mehrmals" id="5fa9785c29abf">
<p>
<p>
Was passiert eigentlich bei mehrmaligem Aufruf von ''fork''?
Was passiert eigentlich bei mehrmaligem Aufruf von ''fork''?
Zeile 127: Zeile 127:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Fork und DMA?">
<loop_task title="Fork und DMA?" id="5fa9785c29ac9">
<p>
<p>
Könnte bei Ausführung des Systemaufrufs fork auch der [[DMA-Controller]] zum Einsatz kommen? Erläutere warum das Sinn macht!
Könnte bei Ausführung des Systemaufrufs fork auch der [[DMA-Controller]] zum Einsatz kommen? Erläutere warum das Sinn macht!
Zeile 140: Zeile 140:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Ein anderes Programm mittels fork starten">
<loop_task title="Ein anderes Programm mittels fork starten" id="5fa9785c29ad2">
<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.
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.
Zeile 150: Zeile 150:
<small>
<small>
<p>
<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.]])
<cite id="5fa9785c29adb">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>
</p>
</small>
</small>

Version vom 9. November 2020, 19:11 Uhr

Fork

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.


Beispiel

Prof. Dr. Carsten Vogt von der FH Köln hat online ein kleines Analogbeispiel zum fork-Systemaufruf bereitgestellt. Klon-Schaf Dolly lässt grüßen.

http://www.nt.fh-koeln.de/vogt/bs/animationen/ForkAnalogbeispielAnimation.pdf


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.


Beispiel

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.

  • Rückgabewert von fork > 0: Elternprozess (Der Wert ist die PID des Kindprozesses.)

  • Rückgabewert von fork = 0: Kindprozess

  • Rückgabewert von fork < 0: Es ist ein Fehler aufgetreten.


Aufgabe 1

Aufgabe

Prof. Dr. Carsten Vogt von der FH Köln zeigt und erläutert unter

http://www.nt.fh-koeln.de/vogt/bs/animationen/ForkSpeicherAnimation.pdf

wie eine Variable durch ein fork sowohl im Vater-, als auch im Sohn-Prozess existiert und unabhängig voneinander mit Werten belegt sein kann.

Schau es dir an!


Aufgabe 2

Aufgabe

Was passiert eigentlich bei mehrmaligem Aufruf von fork?

Betrachte den C-Quelltext aus Listing 1 unten. Was denkst Du: Wieviele Prozesse werden durch die Ausführung des Programms insgesamt erzeugt?

Falls du vorhast den Quelltext auf einem Unix-/Linux-System 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.

Code

#include <stdio.h>
#include <stdlib.h>

int main ()
{
    int pid;

    pid = fork();
    pid = fork();
    pid = fork();
    pid = fork();

    printf("Hier ist ein Prozess mit ID %d!\n", getpid());
    return 0;
}


Listing 1: fork mehrmals nacheinander


Aufgabe 3

Aufgabe

Könnte bei Ausführung des Systemaufrufs fork auch der DMA-Controller zum Einsatz kommen? Erläutere warum das Sinn macht!


Aufgabe 4

Aufgabe

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.

Wie kann mittels fork ein anderes Programm gestartet werden?
Erläutere mit deinen eigenen Worten die Vorgehensweise dabei!

Achilles 2006 gibt Hinweise dazu in Kapitel 3.2.1 und 3.2.2. (Studierende sind oftmals berechtigt, eine PDF-Version dieses Buches ohne entstehende Kosten über ihre Hochschulen von Springerlink zu beziehen.)



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