[linux-l] Java Thread vs. c fork

Jan-Benedict Glaw jbglaw at lug-owl.de
Mo Okt 20 16:05:25 CEST 2003


On Mon, 2003-10-20 21:43:58 +1000, Peter Ross <Peter.Ross at alumni.tu-berlin.de>
wrote in message <20031020213910.S626 at guckloch.zuhause>:
> On Sun, Oct 19, 2003 at 10:51:25PM +0200, Thomas Knop wrote:
> > weil SUN behauptet unter Solaris würden Threads (lightwight processes)
> > viel schneller als reinrassige Prozesse gestartet werden.
> 
> Vielleicht kann jemand etwas zu den "Spezialitaeten" von Linux-Threads
> sagen, da ich immer wieder hoere, dass Linux-Threads wenig von einem
> lightwight process haben, sondern ein nur wenig abgespeckter Prozess
> seien?

Linux-Threads heißt erstmal, daß Du die glibc mitbenutzt... Dann hast Du
Dein "Hauptprogramm", einen Master Thread (der verwaltet alle weiteren)
und eben Deine Arbeitstiere.

Threads werden via clone() angelegt. Unter Linux ist die Implementierung
da so, daß clone() und fork() fast dasselbe tun. Einziger Unterschied:
Bei fork werden alle Speicher-Seiten auf read-only gesetzt, sodaß sie
kopiert werden kann, wenn Vater oder Kind darauf zugreift. Wird nicht
(schreibend) auf den Speicher zugegriffen, hast Du nahezu die
clone()-Geschwindigkeit.

> Unter Solaris, was ich allerdings derzeit nicht zur Verfuegung habe, sind
> Threads wesentlich schneller generiert als Prozesse zu forken.

Das deutet darauf hin, daß Solaris bei einem fork() sofort alle Seiten
kopiert, auch, wenn diese eigentilch nie wieder angerührt werden. Das
macht Linux eben genau andersherum - Kopie wird bei schreibendem Zugriff
angelegt.

Solaris:	Nach dem fork() läuft ein Prozeß sofort mit voller
		Geschwindigkeit los, dafür hast Du beim fork() selbst
		eine recht hohe Latenz.
Linux:		Fork ist *schnell*, aber das weitere Laufenlassen des
		Programmes danach hat nicht die volle Geschwindigkeit,
		da zwischendurch noch Seiten, auf die geschrieben wird,
		kopiert werden müssen.

Nun, was ist der große Unterschied? Ganz einfach: Linus(!) denkt, daß
jemand, der fork()t, sowieso in Naher Zukunft exec() aufrufen möchte.
Also kann man's sich sparen, erst den ganzen Prozeß zu kopieren.

fork() sollte, denn ich das richtig sehe, auf Solaris so wirklich zum
Abgewöhnen sein, wenn Du vorher mal wenige 100MB malloc()ierst...

MfG, JBG

-- 
   Jan-Benedict Glaw       jbglaw at lug-owl.de    . +49-172-7608481
   "Eine Freie Meinung in  einem Freien Kopf    | Gegen Zensur | Gegen Krieg
    fuer einen Freien Staat voll Freier Bürger" | im Internet! |   im Irak!
   ret = do_actions((curr | FREE_SPEECH) & ~(NEW_COPYRIGHT_LAW | DRM | TCPA));
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : nicht verfügbar
Dateityp    : application/pgp-signature
Dateigröße  : 189 bytes
Beschreibung: nicht verfügbar
URL         : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20031020/122806ce/attachment.sig>


Mehr Informationen über die Mailingliste linux-l