Linux verwendet ein 1-1-Threading-Modell, bei dem (für den Kernel) nicht zwischen Prozessen und Threads unterschieden wird - alles ist einfach eine ausführbare Aufgabe. * *
Unter Linux klont der Systemaufruf cloneeine Aufgabe mit einer konfigurierbaren Freigabeebene, darunter:
CLONE_FILES: Verwenden Sie dieselbe Dateideskriptortabelle (anstatt eine Kopie zu erstellen).
CLONE_PARENT: Richten Sie keine Eltern-Kind-Beziehung zwischen der neuen und der alten Aufgabe ein (andernfalls Kind getppid()= Eltern getpid())
CLONE_VM: denselben Speicherplatz gemeinsam nutzen (anstatt eine COW- Kopie zu erstellen )
fork()ruft am clone(wenigsten teilen )und pthread_create()ruft clone(am meisten teilen auf ). ** **.
forkDas pthread_createKopieren von Tabellen und das Erstellen von COW-Zuordnungen für den Speicher kostet ein kleines bisschen mehr als das Kopieren von Tabellen, aber die Linux-Kernel-Entwickler haben versucht (und es geschafft), diese Kosten zu minimieren.
Das Wechseln zwischen Aufgaben, wenn sie denselben Speicherplatz und verschiedene Tabellen gemeinsam nutzen, ist ein kleines bisschen billiger als wenn sie nicht gemeinsam genutzt werden, da die Daten möglicherweise bereits in den Cache geladen sind. Das Wechseln von Aufgaben ist jedoch immer noch sehr schnell, auch wenn nichts gemeinsam genutzt wird. Dies ist etwas anderes, das Linux-Kernel-Entwickler sicherstellen möchten (und das sie erfolgreich sicherstellen können).
In der Tat, wenn Sie auf einem Multi-Prozessor - System sind, nicht kann Sharing Leistung tatsächlich von Vorteil: wenn jede Aufgabe auf einem anderen Prozessor ausgeführt wird , gemeinsam genutzten Speicher teuer ist synchronisiert.
* Vereinfacht. CLONE_THREADbewirkt CLONE_SIGHAND, dass die Signalübertragung gemeinsam genutzt wird (was benötigt wird , wodurch die Signalhandlertabelle gemeinsam genutzt wird).
** Vereinfacht. Es gibt sowohl SYS_forkals auch SYS_clonesyscalls, aber im Kernel sind die sys_forkund sys_clonebeide sehr dünne Wrapper um dieselbe do_forkFunktion, die selbst ein dünner Wrapper ist copy_process. Ja, die Begriffe process, threadund tasksind eher austauschbar in dem Linux - Kernel verwendet ...