Perché i valori PID non sono continui?


14

Se digitiamo ps -ef, otteniamo un elenco di processi. Perché i numeri PID non sono continui?

Risposte:


16

Su Ubuntu sono continui. Su altri sistemi operativi potrebbe essere diverso.

Il kernel alloca PID nell'intervallo di (RESERVED_PIDS, PID_MAX_DEFAULT). Lo fa in modo sequenziale in ogni spazio dei nomi (le attività in spazi dei nomi diversi possono avere gli stessi ID). Nel caso in cui l'intervallo sia esaurito, l'assegnazione del pid termina.

( /programming/3446727/how-does-linux-determine-the-next-pid )

Mente però ...

  • La pianificazione del kernel può eseguire il fork di un processo in modo che possa saltare i numeri.
  • Un PID scompare al termine dell'attività.
  • I PID non vengono riutilizzati fino al raggiungimento di PID_MAX_DEFAULT.
  • Un PID reserverd viene ignorato.

Alcuni argomenti su StackOverflow:

Nei commenti è un comando per testare l'assegnazione dei PID:

for i in {1..20}; do sh -c 'echo $$'; done

"La pianificazione del kernel può bloccare un processo in modo che possa saltare i numeri." - il kernel può creare un processo mentre determina quale processo eseguire? Sembra strano.
user253751

È abbastanza comune per lo scheduler eseguire il fork di un processo. Probabilmente questo bit: lxr.free-electrons.com/source/kernel/pid.c#L125 che lo sta determinando :)
Rinzwind

8

Gli ID di processo mancanti nel mezzo sono già morti e i loro PID verranno riutilizzati dal kernel nei processi successivi.

I processi morti non verranno mostrati nella tabella dei processi (tranne che per gli zombi), quindi ps -efnon li mostreranno.


3

Normalmente il PID è continuo ma alcuni processi saranno interrotti appena si esegue il comando ps -ef.

Inoltre alcuni processi potrebbero essere solo un sottoprocesso di un altro processo che non è mostrato nel ps -efcomando. Per vedere alcuni risultati espansi e puoi controllare il PID continuo usa ilpstree

pstree -p

Uscita campione:

   ├─teamviewerd(3468)─┬─{teamviewerd}(3474)
│                   ├─{teamviewerd}(3475)
│                   ├─{teamviewerd}(3476)
│                   ├─{teamviewerd}(3477)
│                   ├─{teamviewerd}(3478)

mentre se esegui ps -efvedi solo il processo genitore.

$ ps -ef | grep teamviewerd
root      3468     1  0 Jul15 ?        00:07:38 /opt/teamviewer9/tv_bin/teamviewerd -f

2

Sono continue. I PID sono assegnati in ordine sequenziale fino al raggiungimento del limite massimo. Dopo questo limite ricomincerà da zero.

Quindi è solo che i PID mancanti ps -efsono processi morti. Si noti che ps -efelenca solo i processi in esecuzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.