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 clone
eine 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 )
. ** **.
fork
Das pthread_create
Kopieren 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_THREAD
bewirkt CLONE_SIGHAND
, dass die Signalübertragung gemeinsam genutzt wird (was benötigt wird , wodurch die Signalhandlertabelle gemeinsam genutzt wird).
** Vereinfacht. Es gibt sowohl SYS_fork
als auch SYS_clone
syscalls, aber im Kernel sind die sys_fork
und sys_clone
beide sehr dünne Wrapper um dieselbe do_fork
Funktion, die selbst ein dünner Wrapper ist copy_process
. Ja, die Begriffe process
, thread
und task
sind eher austauschbar in dem Linux - Kernel verwendet ...