Hallo MichaelB,
Ich vermute mal, daß der Programmcode zwischen den Prozessen eh geshared wird und es nur
ein eigener Stackframe/Dataframe pro Prozess gibt,Nein. Der Code muss für jeden Prozess ein weiteres mal in den Speicher geladen werden.
Das finde ich aber ungeschickt und ist aus meiner Sicht auch unnötig (es sei denn, man hat
selbstmodifizierenden Code; wäre wenngleich auch ein schmutziger aber gangbarer Weg, um
Informationen zwischen Child-Prozessen auszutauschen *lächel*).
Selbst Windows benutzt ja code-sharing (mindestens seit Version 3.0). Ich bezweifel
deshalb mal stark, daß dies so ist.
Tut mir leid, hier habe ich Quark erzählt. Ich war wohl etwas verwürrt.
Wie auch immer, es lohnt sich trotzdem, den Apachen abzuspecken, da auch der Speicher der
Module mitkopiert werden muss. Auch wenn das on demand passiert, es muss geschehen.
Moment ... wozu hat man denn die Sourcen für Linux *nachles*
Mein Verdacht scheint sich zu bestätigen.
In linux/kernel/fork.c gibt es eine Funktion do_fork die das forking ausführt. Die enthält
(soweit ich das überblicken kann) kein reload oder duplizieren von Programmcode.
Nein, das tut sie in der Tat nicht.
Es wird eine neue Task-Struktur (task_struct; im wesentlichen interne
Verwaltungsinformationen über den Task) angelegt sowie das Datensegment und das
Stacksegment kopiert (bis auf den Rückgabewert des fork()-Aufrufes, anscheinend damit der
Prozess erkennen kann ob er der Orginalprozess oder der geklonte Prozess ist oder weiß
der Geier warum).
Korrekt. fork() gibt für den Kind-Prozess 0 zurück und die PID für den Eltern-Prozess.
so dass ein schlank konfigurierter httpd erstmal nicht soviel bringt. Richtig?
Doch, der bringt eine Menge ;-)
Der Overhead für den Stackframe sollte nicht allzu viel sein. Und Resourcen wie
DB-Verbindungen sind ohnehin Prozessgebunden und werden beim fork nicht dupliziert.
Klar werden sie. Es wird eine exakte, 100%ige Kopie von dem Prozess angelegt. Deshalb
sollte man mit offenen DB-Handles oder ähnlichem auch nicht fork()en, es wird ein- und
dieselbe Verbindung benutzt in dem Fall.
Ich würde sagen auch das ist so formuliert falsch.
Ne.
Eher (so denk ich mir) ist es so, daß es ein httpd-Vaterprozess gibt der Anfragen
entgegen nimmt und für diese zunächst ein eigenen Kindprozess erzeugt (sofern kein
freier Kindprozess zur Verfügung steht) der diese Anfrage dann erst bearbeitet und die
Antwort an den Browser zurückgibt.
Jo. Und wo habe ich etwas anderes behauptet? ;-)
Die fork() wird also immer von diesem (keine Resourcen belegenden) Vaterprozess gemacht
Falsch. Der Vaterprozess hat alle Module geladen, die Konfiguration geparsed, etc, pp.
und nicht von einem laufenden Kindprozess der evtl. schon eine DB-Verbindung offen hat.
Was hat das eine mit dem anderen zu tun? Du hast gesagt, eine DB-Verbindung wird durch
fork() nicht kopiert. Ich habe gesagt, das ist falsch, sie wird durchaus kopiert. Nun
erzählst du mir, dass der Apache-Main-Prozess keine DB-Handels offen hat. Äh, ja, und?
Weiter?
Grüße,
CK
Sobald dir ein Gedanke kommt, lache über ihn.