Was bestimmt, welcher PID ein Prozess zugewiesen wird?

7

Was bestimmt, welcher PID ein Prozess zugewiesen wird?

Es scheint, als gäbe es eine Obergrenze für den ganzzahligen Wert, der für die ID verwendet wird. Was ist diese Grenze und wo ist sie definiert?

Gibt es einen Bereich, der für Prozesse reserviert ist, die nicht vom Benutzer erstellt wurden?

Um ganz klar zu sein, ich frage dies eher aus Neugier als aus irgendeinem praktischen Grund.

chb
quelle

Antworten:

12

Was ist der Maximalwert der Prozess-ID? deckt die max; Es gibt reservierte Prozesse ( 0und 1sind bemerkenswert), aber nicht viele, und es gibt ein bisschen Code im Kernel, der die nächste freie Ganzzahl (die meisten Unix) oder stattdessen eine zufällige PID (OpenBSD oder einige Linux-Varianten) auswählt. OpenBSD ruft dies auf, allocpidwas in zu finden istkern/kern_fork.c

/* Find an unused pid */
pid_t
allocpid(void)
{
        static pid_t lastpid;
        pid_t pid;

        if (!randompid) {
                /* only used early on for system processes */
                pid = ++lastpid;
        } else {
                /* Find an unused pid satisfying lastpid < pid <= PID_MAX */
                do {
                        pid = arc4random_uniform(PID_MAX - lastpid) + 1 +
                            lastpid;
                } while (ispidtaken(pid));
        }

        return pid;
}
Thrig
quelle
Wenn die PIDs knapp werden (natürlich unwahrscheinlich), wird diese zufällige Auswahl nicht so gut funktionieren. Der Algorithmus überrascht mich.
Spender
OpenBSD legt standardmäßig sehr niedrige Prozesslimits fest (256 pro Benutzer). Wenn Sie dies nicht ändern login.confoder einen daemonKlassenbenutzer Amok ausführen lassen, wird das Prozesslimit lange vor Ablauf der PIDs erreicht.
Thrig
Es überrascht mich die Logik der beiden Codepfade. Nur der zufällige Pfad ruft ispidtaken () auf. Wenn das System im anderen Fall den maximalen PID-Wert erreicht, wird ein Rollover auf 0 durchgeführt. Gibt allocpid () ihn als verwendbar zurück? mmh
Massimo