Jaka jest maksymalna wartość identyfikatora procesu?

42

Jaka jest maksymalna wartość identyfikatora procesu?

Czy można również zmienić identyfikator procesu?

Dmitrij Kodmov
źródło

Odpowiedzi:

61

W systemie Linux możesz znaleźć maksymalną wartość PID dla swojego systemu dzięki:

$ cat /proc/sys/kernel/pid_max

Tę wartość można również zapisać przy użyciu tego samego pliku, jednak wartość tę można rozszerzyć tylko do teoretycznego maksimum 32768 dla systemów 32-bitowych lub 4194304 dla 64-bitowych:

$ echo 32768 > /proc/sys/kernel/pid_max

Wydaje się, że normatywną praktyką w większości systemów 64-bitowych jest ustawianie tej wartości na tę samą wartość, co w systemach 32-bitowych, ale jest to raczej konwencja niż wymóg.

Od man 5 proc:

/proc/sys/kernel/pid_max  
  This file (new in Linux 2.5) specifies the value at which PIDs wrap around
  (i.e., the value in this file is one greater than the maximum PID). The
  default value for this file, 32768, results in the same range of PIDs as
  on earlier kernels. On 32-bit platfroms, 32768 is the maximum value for
  pid_max. On 64-bit systems, pid_max can be set to any value up to 2^22
  (PID_MAX_LIMIT, approximately 4 million).

I nie, nie możesz zmienić PID uruchomionego procesu. Jądro przypisuje mu numer sekwencyjny w momencie rozpoczęcia procesu i jest to jego identyfikator od tego czasu. Jedyną rzeczą, którą możesz zrobić, aby uzyskać nowy, jest rozwidlenie kodu nowego procesu i zakończenie starego.

Caleb
źródło
i możemy być pewni bitów jądro z tego
Wodnik zasilania
2
Ciekawym półprzeciwprzykładem do historii „nie można zmienić PID” jest przypadek programu wielowątkowego, w którym jeden z wątków pomocniczych wykonuje exec (). Nakłada się na cały proces, ale zmienia PID (na TID wątku wykonującego).
fche
3
Maksymalna wartość PID dla maszyny 32-bitowej to 32767, a nie 32768. 0 to program planujący, a 1 to init, a następnie procesy użytkownika otrzymują od 2 do 32767.
2
user129258 ma rację i zgadza się zarówno ze stroną podręcznika, jak i dokumentacją jądra. Maksymalna dopuszczalna wartość PID , zgodnie z żądaniem przez pytanie, jest mniejsza niż wartość w tym pseudo-pliku.
JdeBP
1
@ user129258, to utrzymuje się tylko wtedy, gdy używasz init. Zawsze istnieje możliwość uruchomienia bezpośrednio do powłoki, powiedzmy busybox i stamtąd rób rzeczy ręcznie, bez kontroli zadań. Lub nawet kilka skryptów startowych i wróć do powłoki. W każdym razie powłoka będzie w takim przypadku PID 1.
Tim
9

Inne odpowiedzi wyjaśniły

  • /proc/sys/kernel/pid_max dla systemu Linux i
  • 99999 dla FreeBSD

Ale pytanie nie określało systemu operacyjnego. Oto kilka innych:

  • Solaris, wartość maksymalna z ID procesu jest parametrem przestrajanie jądra - pidmaxw /etc/system- że domyślnie 30000, które można ustawić w dowolnym miejscu pomiędzy 266 a 999.999. Zauważ, że nie max_nprocsjest to parametr dostrajany przez jądro z subtelnie inną funkcją.
  • W systemie HP-UX 10 tunery jądra nazywają process_id_mini process_id_maxokreślają zakres dozwolonych identyfikatorów procesów.
  • W systemie AIX identyfikatory procesów składają się z kilku pól, w tym z „gniazda procesu” i pola „liczby generacji”. Maksymalna możliwa wartość to 0x03FFFFFE, ponieważ pola zajmują tylko dolne 26 bitów liczby całkowitej, a bit 0 jest zawsze równy zero, z wyjątkiem procesu nr 1.
  • W OpenBSD maksymalna wartość to 32766.
  • W NetBSD maksymalna to 30000.
JdeBP
źródło
Od wersji OpenBSD 6.5 maksymalna liczba wynosi 99999, zgodnie z intro (2), a nie 32766.
Kaiepi
4

Na FreeBSD wartość PID wynosi od 0 do 99999 zgodnie z intro(2)(link) . Oto cytat z instrukcji:

ID procesu.
Każdy aktywny proces w systemie jest jednoznacznie identyfikowany przez nieujemną liczbę całkowitą zwaną identyfikatorem procesu. Zakres tego identyfikatora wynosi od 0 do 99999.

Jeśli chcesz czytać kod źródłowy samodzielnie, to PID_MAXjest zdefiniowany w sys/sys/proc.h(link) .

Mateusz Piotrowski
źródło