Warum ist die maximale PID in einem 64-Bit-Linux-System 2 ^ 22?

22

Warum nicht 2 ^ 62 oder 2 ^ 31 oder irgendetwas anderes?

Was ist der Maximalwert der Prozess-ID?

Oma
quelle
2
Es ist? Was ist deine Quelle?
Muru
Das ist sehr spezifisch für Linux. Es gilt nicht für Unix im Allgemeinen.
Muru
Ich hätte es vorgezogen, eine ganze 64-Bit-Ganzzahl zu verwenden, so dass Sie garantieren können, dass sie niemals wiederverwendet werden. Die Wiederverwendung führt zu Rennbedingungen, bei denen sich die Bedeutung einer ID zwischen dem Zeitpunkt, zu dem Sie sie erhalten und verwenden, ändert.
CodesInChaos

Antworten:

34

Es scheint eine rein willkürliche Wahl zu sein. Es könnte alles sein, aber jemand 1 fühlte 4.000.000 genug ist. Verwenden Sie die Quelle :

/*
 * A maximum of 4 million PIDs should be enough for a while.
 * [NOTE: PID/TIDs are limited to 2^29 ~= 500+ million, see futex.h.]
 */
#define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \
    (sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT))

Die Geschichte von Git scheint nur bis 2005 zurück zu gehen, und der Wert ist mindestens so lang.


1 Die manpage sagt, /proc/sys/kernel/pid_maxwurde in 2.5.34 hinzugefügt, und Blick auf den Changelog , es sieht aus wie das jemand war Ingo Molnár :

<[email protected]>
    [PATCH] pid-max-2.5.33-A0

    This is the pid-max patch, the one i sent for 2.5.31 was botched.  I
    have removed the 'once' debugging stupidity - now PIDs start at 0 again.
    Also, for an unknown reason the previous patch missed the hunk that had
    the declaration of 'DEFAULT_PID_MAX' which made it not compile ...

Ingo fügte jedoch nur hinzu DEFAULT_PID_MAX. PID_MAX_LIMITwurde von Linus Torvalds in 2.5.37 hinzugefügt :

<[email protected]>
    Make pid_max grow dynamically as needed.

Es stellte sich heraus, dass ich das Changelog falsch gelesen habe.

Die Änderungen sind im Patchset 2.5.37 enthalten :

diff -Nru a/include/linux/threads.h b/include/linux/threads.h
--- a/include/linux/threads.h   Fri Sep 20 08:20:41 2002
+++ b/include/linux/threads.h   Fri Sep 20 08:20:41 2002
@@ -17,8 +17,13 @@
 #define MIN_THREADS_LEFT_FOR_ROOT 4

 /*
- * This controls the maximum pid allocated to a process
+ * This controls the default maximum pid allocated to a process
  */
-#define DEFAULT_PID_MAX 0x8000
+#define PID_MAX_DEFAULT 0x8000
+
+/*
+ * A maximum of 4 million PIDs should be enough for a while:
+ */
+#define PID_MAX_LIMIT (4*1024*1024)

 #endif

Soweit meine Suchfähigkeiten reichen.


Dank @hobbs scheint es, dass Ingo schließlich der Jemand ist . Der Patch, den ich oben zitiert habe, wurde zuerst von ihm gesendet. Aus dem dazugehörigen LKML-Beitrag :

Der Speicherbedarf des neuen PID-Zuordners skaliert dynamisch mit / proc / sys / kernel / pid_max: Die Standard-32-KB-PIDs verursachen eine 4-KB-Zuordnung, ein pid_max von 1 Million verursacht einen 128-KB-Speicherbedarf. Das aktuelle absolute Limit für pid_max liegt bei 4 Millionen PIDs - dies führt zu keiner Zuordnung im Kernel, die Bitmaps werden zur Laufzeit nach Bedarf zugeordnet. Die pidmap-Tabelle belegt 512 Bytes.

Es gab eine hitzige Diskussion darüber, höhere Limits zu haben, aber es scheint, als wäre am Ende nichts dabei herausgekommen.

muru
quelle
2
Sie können ein Git-Repo mit einer tieferen Geschichte von Linux erhalten, das für die Archäologie geeignet ist . Befolgen Sie dazu die Anweisungen unter stackoverflow.com/questions/3264283/… . Das ergibt a5b5f6a "[PATCH] generic-pidhash-2.5.36-J2, BK-curr" von Ingo Molnar, hier auf LWN zu sehen .
Hobbs
@hobbs super! So ist es doch von Ingo Molnar. Ich frage mich, warum Linus das Changelog übernommen hat.
Muru
1
@muru: Ich glaube, BitKeeper unterstützt nicht die Unterscheidung zwischen Committer und Autor, das war eine der Lektionen, die Linus beim Entwerfen von Git anwendete. IIRC, Ingo weigerte sich, BitKeeper zu verwenden, und schickte Patches per E-Mail, und sie wurden in den automatisch generierten ChangeLogs dem Committer falsch zugeordnet, da BitKeeper keinen eigenen Begriff von Autorschaft hat. Das ist sowieso meine Vermutung.
Jörg W Mittag
@ JörgWMittag möglich. Jetzt denke ich, dass ich das Changelog falsch gelesen habe und dass es sich um einen anderen Patch handeln könnte.
Muru
3
Das Zitat am Ende dieser Antwort gibt an, dass der Grund dafür, keinen willkürlich großen Wert auszuwählen, Speicherbeschränkungen sind. Bei 128 KB RAM pro 1 MB PIDs würde die Verwendung von sogar 63 Bits (wobei das Vorzeichen-Bit übrig bleibt) eine Million TB RAM nur für die PID-Tabelle erfordern, wenn ich die Mathematik nicht verpatzt hätte. Ein wenig auf der hohen Seite für aktuelle Systeme.
ein Lebenslauf