linux-l: multithreading mit linux

Gregor Kopij gkopij at kokinet.com
So Mai 10 14:20:01 CEST 1998


At 10:13 09.05.98 +0200, you wrote:
>das war mir bewusst, dass jeder thread einen eintrag in der prozessabelle 
>bekommt. der speicher wird aber auch kopiert -- jedenfalls sehe ich in 
>top 3 mal main prog mit je 10MB :-/
>> glibc wuerde ich auf jeden Fall empfehlen, dann hast du mehr Freude
>> an Threads - die alte libc ist nicht vollstaendig thread-safe und du
>> riskierst merkwuerdige Abstuerze.  Mit dem Kern sollte es funktionieren.
>Guter hinweis, wird gemacht
>Thomas

Hi!

Der Speicher wird nicht kopiert. Die Speicherstellen werden nur als shared
markiert. Auch beim Fork/Clone wird nur dann speicher für den neuen Prozess
angefordert und belegt, falls eine Änderung ansteht (beim beschreiben der
gegebenen Speicherstelle). Wenn die Prozesse den Speicher (bzw. die
betreffende Speicherstelle) nicht ändern, wird auch kein neuer Speicher
angefordert. Also, es "sieht nur so aus" als ob Du viel Speicher
verbrauchst, aber auch nur dann, wenn der Speicher sich auch wirklich ändert.
Diese Info habe ich aus dem Buch "Linux-Kernel-Programmierung". Aus meiner
Erfahrung wird das auch so gemacht. Ich habe ein sehr
"fork/clone"-intensives Serverprogramm und in der Anzeige "läuft" der
Speicher auch über, da ich auch keinen Swap-Space habe. Bis jetzt traten
aber keine Probleme auf, da die Kinder auf den Speicher nur lesend
zugreifen und dann beenden. In der Zeit kommt es nur selten vor, daß auch
der Server den Speicher in der Zeit ändert, in der auch das Kind läuft. 
Also, keine Angst ;-), es sei denn Du beschreibst wirklich den Speicher von
allen Kindern. Dann hast Du ein "kleines" Problem, das man aber mit
Shared-Memory in den Griff bekommen kann. Mußt Du Threads benutzen? Mit
"direkter" Programmierung kann man es besser kontrollieren. Das ist aber
Geschmackssache.
Hoffe geholfen zu haben

Gruß

Gregor

P.S. Wenn das oben nicht aktuell ist, bitte mich sofort zu korrigieren.
Danke!




Mehr Informationen über die Mailingliste linux-l