
Ich versuche, die Linux-Prozesse zu verstehen. Die jeweiligen Begriffe pid_max
, ulimit -u
und verwirren mich thread_max
.
Was genau ist der Unterschied zwischen diesen Begriffen? Kann jemand die Unterschiede erklären?
Antwort1
Tut mir leid, die akzeptierte Antwort enthält in mehrfacher Hinsicht falsche Informationen.
/proc/sys/kernel/pid_max
hat nichts mit der maximalen Anzahl von Prozessen zu tun, die zu einem bestimmten Zeitpunkt ausgeführt werden können. Es handelt sich vielmehr um die maximale numerische PROZESSKENNUNG, die vom Kernel zugewiesen werden kann.
Im Linux-Kernel sind ein Prozess und ein Thread ein und dasselbe. Sie werden vom Kernel auf die gleiche Weise behandelt. Sie belegen beide einen Slot in der Datenstruktur task_struct. Ein Thread ist in Linux, der üblichen Terminologie nach, ein Prozess, der Ressourcen mit einem anderen Prozess teilt (sie teilen sich auch eine Thread-Gruppen-ID). Ein Thread im Linux-Kernel ist, soweit es den Scheduler betrifft, weitgehend ein konzeptionelles Konstrukt.
Nachdem Sie nun verstanden haben, dass der Kernel im Wesentlichen nicht zwischen einem Thread und einem Prozess unterscheidet, sollte es verständlicher sein, dass dies /proc/sys/kernel/threads-max
tatsächlich die maximale Anzahl von Elementen ist, die in der Datenstruktur task_struct enthalten sind. Dies ist die Datenstruktur, die die Liste der Prozesse oder, wie sie genannt werden, Aufgaben enthält.
ulimit ist, wie der Name schon sagt, ein Benutzerlimit. Das -u
Flag wird definiert als „Die maximale Anzahl von Prozessen, die einem einzelnen Benutzer zur Verfügung stehen“. Ein Element von task_struct enthält die UID des Benutzers, der die Aufgabe erstellt hat. Eine Anzahl pro UID wird verwaltet und jedes Mal erhöht/verringert, wenn eine Aufgabe zu task_struct hinzugefügt/entfernt wird. ulimit -u
Gibt also die maximale Anzahl von Elementen (Prozessen) an, die ein bestimmter Benutzer zu einem bestimmten Zeitpunkt innerhalb von task_struct haben darf.
Ich hoffe, das klärt die Sache auf.
Antwort2
Lassen Sie uns den Unterschied zwischen einem Prozess und einem Thread verstehen.DasVerknüpfung,
Der typische Unterschied besteht darin, dass Threads (desselben Prozesses) in einem gemeinsamen Speicherbereich ausgeführt werden, während Prozesse in getrennten Speicherbereichen ausgeführt werden.
Jetzt haben wir den pid_max
Parameter, der wie folgt bestimmt werden kann.
cat /proc/sys/kernel/pid_max
Der obige Befehl gibt also zurück32.768was bedeutet, dass ich ausführen kann32.768Prozesse gleichzeitig in meinem System, die in separaten Speicherbereichen ausgeführt werden können.
Jetzt haben wir den threads-max
Parameter, der wie folgt bestimmt werden kann.
cat /proc/sys/kernel/threads-max
Der obige Befehl gibt mir die Ausgabe als126406Das heißt, ich kann126406Threads in einem gemeinsam genutzten Speicherplatz.
Nehmen wir nun den 3. Parameter ulimit -u
, der die Gesamtzahl der Prozesse angibt, die ein Benutzer zu einem bestimmten Zeitpunkt ausführen kann. Der obige Befehl gibt mir die Ausgabe als63203. Das bedeutet, dass für alle Prozesse, die ein Benutzer zu einem Zeitpunkt erstellt hat, der Benutzer63203laufende Prozesse.
Hypothetischer Fall
Angenommen, es gibt zwei Prozesse, die gleichzeitig von zwei Benutzern ausgeführt werden und jeder Prozess viel Speicher verbraucht, dann nutzen beide Prozesse effektiv den63203Benutzerlimit für die Prozesse. Wenn das der Fall ist, haben die beiden Benutzer effektiv das gesamte126406 threads-max
Größe.
Nun muss ich bestimmen, wie viele Prozesse ein Benutzer zu einem beliebigen Zeitpunkt ausführen kann. Dies kann aus der Datei ermittelt werden. /etc/security/limits.conf
Es gibt also grundsätzlich 2 Einstellungen in dieser Datei, wie oben erläutertHier.
Aweiche Grenzeist wie einWarnungUndharte Grenzeist eintatsächliche Höchstgrenze. Beispielsweise verhindert „Following“, dass jemand in der Studentengruppe mehr als 50 Prozesse hat, und bei 30 Prozessen wird eine Warnung ausgegeben.
@student hard nproc 50
@student soft nproc 30
Harte Grenzen werden vom Kernel verwaltet, während weiche Grenzen von der Shell erzwungen werden.