Christian Kruse: Prozessverwaltung

Beitrag lesen

Hallo Andreas,

Kennt vielleicht jemand eine gute und vor allem
_einfach_zu_verstehende_ Quelle um mal ein paar
Grundlagen zur Thread-/Prozessverwaltung von
Linux zu lernen?

Unix-Linux-Systemprogrammierung (Herold, ADW-Verlag)
Advanced Programming In The Unix(TM) Environment (Stevens, ADW-Verlag, Professional Computing Series)

<?php

$pid = pcntl_fork();
if ($pid == -1) {
     die("could not fork");
} else if ($pid) {
     // we are the parent
} else {
     // we are the child
}

?>

Was ich daran nicht verstehe, das eine Script
hat erstmal nur einen Thread und einen Prozess.

Jups.

Dann wird durch fork ein Kinderprozess
gestartet.

Jups.

Was ich nicht verstehe - wenn man mal den
Fehler (-1) außen vorläßt - steht da eine
Weiche, entweder $PID ist 0 oder hat eine
Nummer > 0.

Jups.

Aber beides ist wahr,

Nein. Im einen Prozess ist das eine wahr, im
anderen das andere.

es gibt ja jetzt 2 Threads bzw. Prozesse,

Zwei Prozesse. Ein sehr, sehr wichtiger
Unterschied.

laufen dann beide Prozesse durch diese Weiche,

Ja.

der eine in die eine Richtung, der andere in
die andere Richtung?

Ja.

Laufen dann also 2 Prozesse in ein und
demselben Script?

fork() erstellt eine komplette Kopie des laufenden
Prozesses.

Da steht immer "gibt XY dem einen oder dem
anderen Thread zurück",

Hae?
Man, verwechsele nicht Thread und Prozess. Das
ist ein himmelweiter(!) Unterschied.

aber das Script gehört doch ausschließlich dem
Vater-Thread, oder?

Hae?
fork() macht folgendes: es erstellt eine
*komplette* Kopie des aktuellen Prozesses.
Einziger Unterschied: der PID-Variablen wird in
der einen Kopie die PID des neuen Prozesses
zugewiesen, der PID-Variablen in der anderen Kopie
0. Danach wird ganz normal weitergemacht, als
sei nichts geschehen.

Und anhand der PID kann man im Script drauf
reagieren?

Korrekt.

Einmal geht das innderhalb der Weiche, klar,
aber wenn ich danach auf einen speziellen
Prozess zugreifen will, kann ich ja nicht mehr
PID=0 verwenden, denn das gilt ja für alle
Kinderprozesse, oder?

Im *Kindprozess* ist die PID 0. Dort kann man sie
mit getpid(2) herausfinden. Im Vaterprozess ist
sie eine (mehr oder weniger) zufaellige
Integer-Zahl.

Könnte man so auch später im Script alle
Kinderprozesse gleichzeitig ansprechen?

Nein, nur nacheinander.

Über die PID kann man die Kinderprozesse ja
nachdem ob die IF-Weiche zu Ende ist ja nur
noch beenden, oder?

Du kannst ueber kill(2) beliebige Signale (siehe
signal(3)) schicken.

Oder könnte ich auch später im Script einen
speziellen Kinderprozess dazu veranlassen
einen bestimmten PHP-Code auszuführen?

Wenn du mit Pipes arbeitest oder mit Signalen,
klar, warum nicht?

Und was ist der Unterschied zwischen einem
Prozess und einem Thread?

Ein Prozess hat einen komplett eigenen Adressraum,
also eigene Variablen, eigenen Speicher, etc.
Ein Thread ist nur ein etwas im selben Programm,
hat denselben Adressraum. Einfachste Auswirkung:
ein Thread hat z. B. keine PID. Es ist kein
eigener Prozess. Deshalb verbraucht er auch viel
weniger Ressourcen.

Ja, ich weiss, unter Linux sieht man (noch)
Threads in den Prozess-Listen. Das liegt daran,
dass Threads unter Linux keine Kernelthreads sind,
sondern abgespeckte (lightweight) Prozesse, die
ueber das memory filesystem miteinander
kommunizieren. Ist natuerlich sehr langsam, das
ganze.

Vorab, was ist hier eigentlich der Vorteil
vieler Prozesse, im Gegensatz zu einer
Schleife in einem Prozess?

Ehm, denk doch mal nach :) Ein einziger Prozess
ist synchron. Mehrere Prozesse sind asynchron.
Ein einziger Prozess kann nur einen Request nach
dem anderen machen. Mehrere Prozesse koennen
jeweils einen Request (fast) simultan mit den
anderen machen.

PHP kann doch sowieso nur eine begrenzte Anzahl
von Befehlern bearbeiten und wird die Prozesse
doch auch in einer Warteschlange-schieben und
nacheinander abarbeiten, oder?

Was hat das mit PHP zu tun?

Oder muß man hierbei nicht jedesmal auf den
Response des HTTP-Request warten?

Hae?

for($i=1;$i<10;$i++) {
    $pid = pcntl_fork();
    if ($pid == -1) {
         die("could not fork");
    } else if (!$pid) {
         for($j=1;$j<100;$j++) {
             fsockopen(...);
             fputs(...);
         }
    }
}

Würde das schon reichen, oder ist das Quatsch?

Prinzipiell reicht das.

Wieviele Prozesse verwendet man für so etwas
erfahrungsgemäß?

Was hast du vor?

Gruesse,
 CK