Unterstuetzt Linux "echtes" Multithreading?
-
Hallo
ich habe mal eine Frage zu dem Threadkonzept unter Linux: ich habe gelesen dass (frueher) Unix wie auch MS DOS im User Space nur einen zusaetzlichen Thread pro Prozess erlaubte und nur Solaris mehrere Theads pro Prozess unterstuetzte.
Wie ist das heute unter Unix und wie ist das bei Linux und einem modernen 2.6.x Kernel?
Unterstuetzt Linux also "effektiv" mehrere Threads pro Prozess oder "real" auch nur einen pro Prozess und praktisch dann eigentlich weitere Prozesse in derselben Prozessgruppe?
Gibt es dadurch eigentlich Einschraenkungen beim Thread Konzept unter Linux?
-
Unter Unix sind Threads ein neueres Konzept. Im Ur-Unix gab es das nicht. Neu ist allerdings relativ zu sehen. Ich schätze, daß es Threads unter Unix erst seit etwa 20 Jahren gibt.
Mit MS DOS ist das gar nicht zu vergleichen. Unter MS DOS gab es nur einen Prozess.
Bei Unix wie auch Linux gibt es keine relevanten Einschränkungen. Linux ist seit Version 2.0 multithreaded. Der 2.6-Kernel war da aber dennoch ein Meilenstein bezüglich Thread-Unterstützung. Bis 2.4 waren Threads im Prinzip mehrere Prozesse, die im gleichen Adressraum liefen. Daher hat man unter 2.4 in der Prozessliste einen Eintrag pro Thread gesehen. 2.6 hat echte Threads.
-
Hallo,
Bis 2.4 waren Threads im Prinzip mehrere Prozesse, die im gleichen Adressraum liefen.
Heisst das soviel wie Child-Prozesse die in der gleichen Prozessgruppe des Parent-Prozesses ablaufen oder ist diese Beziehung bei Threads doch noch etwas enger. Letztlich entspricht dieses Konzept des 2.4 ja dem "ein Thread pro Prozess" Verhaeltnis des "Ur-Unix", oder? Wie ist das mit der Performance, Threads sollten ja "leichter" sein als Prozesse und somit auch weniger Ressourcen und weniger Zeit benoetigen, zur Erstellung, zum Contextwechsel, etc (ich interessiere mich da mom mehr fuer das Konzept des 2.4er).
-
tntnet schrieb:
Bis 2.4 waren Threads im Prinzip mehrere Prozesse, die im gleichen Adressraum liefen.
war das der einzige unterschied zu prozessen, also der gemeinsame adressraum?
-
Nabend,
Fabeltier schrieb:
Hallo,
Bis 2.4 waren Threads im Prinzip mehrere Prozesse, die im gleichen Adressraum liefen.
Heisst das soviel wie Child-Prozesse die in der gleichen Prozessgruppe des Parent-Prozesses ablaufen oder ist diese Beziehung bei Threads doch noch etwas enger. Letztlich entspricht dieses Konzept des 2.4 ja dem "ein Thread pro Prozess" Verhaeltnis des "Ur-Unix", oder? Wie ist das mit der Performance, Threads sollten ja "leichter" sein als Prozesse und somit auch weniger Ressourcen und weniger Zeit benoetigen, zur Erstellung, zum Contextwechsel, etc (ich interessiere mich da mom mehr fuer das Konzept des 2.4er).
Threadwechsel innerhalb eines Prozesses sind sehr schnell, da die
Speicherverwaltungsstrukturen nicht aktualisiert werden muessen.Was sich jeder Thread selbst haelt, ist der PC (program counter), einen Stack,
Register und Zustandsinformationen (rechnend, blockierend, bereit). Alle
Threads eines Prozesses laufen im selben Adressraum.gruss
v R
-
Es gibt gewisse Thread-Limitierungen unter Linux/Unix.
Beispielsweise MAX_Threads pro Process.Das sind aber meistens "nur" vordefinierte Kernel-Limitierungen, die man mit einem entsprechenden Recompile lösen kann. Nicht zu vergessen, das jeder Thread den Scheduler belastet. Ich glaube momentan stößt Linux bei ca. 2^18 Threads an Kapazitätsgrenzen ( Komplexität des Schedulers ).
Aber so viele braucht ja eh kein Mensch ...
-
OberGuru schrieb:
Es gibt gewisse Thread-Limitierungen unter Linux/Unix.
Beispielsweise MAX_Threads pro Process.Das sind aber meistens "nur" vordefinierte Kernel-Limitierungen, die man mit einem entsprechenden Recompile lösen kann. Nicht zu vergessen, das jeder Thread den Scheduler belastet. Ich glaube momentan stößt Linux bei ca. 2^18 Threads an Kapazitätsgrenzen ( Komplexität des Schedulers ).
Aber so viele braucht ja eh kein Mensch ...
Ja solche Limitierungen gibt es. Max_Threads ist aber nur ein Richtwert.
Unter Linux wird der tatsaechliche Maximalwert nur durch den physikalisch
vorhandenen Speicher eingeschraenkt. Zusaetzlich gibt es die Moeglichkeit,
einen vordefinierten Wert auszulesen und zu aendern:cat /proc/sys/kernel/threads-max
respektive
echo 10000 > /proc/sys/kernel/threads-max
Unter BSD gibt es dafuer das sysctl kern.threads.max_threads_per_proc,
welches man mit sysctl entsprechend auslesen und setzen kann.gruss
v R