Andreas Korthaus: Prozessverwaltung

Beitrag lesen

Hi Christian!

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

Gibts da nichts online? Ist das Thema denn soooo komplex?

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.

Also kann man dann auch innerhalb eines Prozesses mehrere Threads starten? Bezogen auf mein Beispiel unten, könnte ich anstatt neue Prozesse zu starten genauso neue Threads innerhalb des einen Prozesses starten, mit selbigem Ergebnis, also dass die HTTP-Requests parallel versendet werden, bei niedrigerer Hardware-Auslastung? Geht das überhaupt bzw. geht das mit PHP?

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.

Heißt das man sollte das bei Linux doch lieber lassen?

Ehm, denk doch mal nach :) Ein einziger Prozess
ist synchron. Mehrere Prozesse sind asynchron.

Ja, aber das ändert ja erstmal nicht daran das die CPU damit auch nicht schneller wird. Wird da also irgendwo was gespart.

Ein einziger Prozess kann nur einen Request nach
dem anderen machen. Mehrere Prozesse koennen
jeweils einen Request (fast) simultan mit den
anderen machen.

Was meinst Du hier mit Request? Einen HTTP-Request wie unten beschreiben?

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?

Ich kenne mich da jetzt wirklich nicht aus, nur, wenn ich jetzt PHP verwende, also ich erstelle 10 Kinderprozesse, greifen diese Prozesse dann alle über die gegebenen Schnittstellen direkt auf OS-Funkionene zu, z.B. um einen HTTP-Request abzusenden? ich hatte jetzt gedacht das da der PHP Interpreter oder sowas noc dazwischen hängt, aber das Script ist ja, wenn es bereits ausgeführt wird schon interpretiert, oder?

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

Hae?

Wenn ich in einem Script in einer schleife fsockopen, fputs("GET..."), fclose verwende, läuft die Schleife erst weiter, wenn die Antwort vom Server gekommen ist, wenn ich das auf mehrere Prozesse verteile, können alle (fast) gleichzeitig anfangen, ohne auf andere Prozesse Rücksicht nehmen zu müssen.

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(...);
         }
    }
}

Was hast du vor?

Ich würde gerne mal ein paar möglichst realistische Performance-Vergleiche machen. Hierzu habe ich einige Server in verschiedenen voneinander getrennten Netzen, von denen aus ich je ein Script starten möchte, welches möglichst viele HTTP-Requests an den zu testenden Server sendet. Mit der Schleife alleine, ohne fork, komme ich nicht sehr weit, daher hoffe ich das ich das ganze mit fork beschleunigen kann. Ich weiß noch nicht wo jetzt genau die Engpässe liegen, ich vermute aber das durch das Warten auf die Antwort des HTTP-Requests die meiste Zeit verschwendet wird.

Viele Grüße
Andreas