Come vengono generati i PID?


42

Su * nix, i PID sono identificatori univoci per i processi in esecuzione. Come vengono generati i PID? È solo un numero intero che viene incrementato o una struttura più complessa come un elenco? Come vengono riciclati? Riciclando intendo che, al termine di un processo, il PID verrà riutilizzato da un altro processo.


Risposte:


39

Come dice Wikipedia ,

In Unix, gli ID di processo sono generalmente allocati su base sequenziale, a partire da 0 e passando a un valore massimo che varia da sistema a sistema. Una volta raggiunto questo limite, l'allocazione si riavvia da zero e aumenta nuovamente. Tuttavia, per questo e per i successivi passaggi vengono saltati tutti i PID ancora assegnati ai processi.

quindi è davvero una politica molto semplice per "generazione", basta incrementare un contatore e "riciclo", basta avvolgere il numero a un valore massimo e continuare ad incrementare fino a trovare un numero assegnato a un processo che è terminato e ha stato rimosso dalla tabella dei processi.

Alcune implementazioni Unix come AIX usano una politica meno semplice, vedi ad esempio questa FAQ .


Grazie per la risposta. A proposito, che cos'è esattamente questa politica AIX "meno semplice"?

1
@Helltone, non credo che AIX documenti esattamente quale criterio utilizza (quindi potrebbe cambiare in qualsiasi versione), ma potresti pensarlo come una generazione di numeri casuali nell'intervallo appropriato (che viene ripetuto fino a quando non viene generato un PID che è non attualmente in uso).
Alex Martelli,

Questo algoritmo mi sembra un po 'problematico. Come si garantisce di non incorrere in deadlock? E non c'è un problema di prestazioni?

1
Il kernel ha il controllo e non ha bisogno di bloccare nulla, quindi come potrebbe bloccarsi? Sì, c'è un piccolo prezzo prestazionale da pagare (un piccolo sovraccarico extra al momento della forchetta - diciamo un paio di dozzine di istruzioni macchina per un PRNG congruente o / dev / urandom, contro molte meno per un controincremento), ma questo è sempre il caso di misure intese a migliorare la sicurezza (controllare l'overhead della CPU della comunicazione HTTPS rispetto al semplice HTTP, ad esempio ;-).
Alex Martelli,

Intendevo livelock ( while(true);), scusate, rispondevo rapidamente ;-)

11

Varia.

La maggior parte dei sistemi tiene semplicemente un conto dell'ultimo PID generato, ne aggiunge uno (avvolgimento a un numero massimo come 65535 o un po 'più piccolo - spesso la copertura si verifica a 65000 o persino a 60000) e verifica che il numero non sia attualmente in uso ( ripetendo se il PID è ancora in uso, quindi PID 1, il kernel, è ancora lì e non viene "ristampato").

Altri sistemi di sicurezza generano un numero a caso e controllano che non sia in uso.

In qualsiasi momento, è garantito che tutti i numeri PID siano univoci.


9

Per quanto riguarda la parte relativa al riciclaggio della domanda, una cosa da tenere a mente è che un pid non diventa disponibile non appena termina il processo con tale pid. Il pid non diventa disponibile fino a quando il genitore di quel processo non raccoglie lo stato di terminazione del proprio figlio tramite una qualche forma della chiamata di sistema wait (). Un bambino che è terminato ma il cui genitore non ha emesso un'attesa è chiamato zombi e di solito si presenta in ps come defunto. È possibile che un genitore mal educato muoia di fame il sistema dei pid se lancia i bambini e non li aspetta ().

Se il genitore di un processo muore prima che raccolga lo stato di un figlio, va bene. Il figlio viene ereditato da init che si assicurerà che venga emesso un wait () e che il pid sia riciclato.


Questo è un dettaglio molto importante. Senza di essa, anche un semplice myprog &seguito wait $!sarebbe UB.
Andreas,

3

Sono numeri di sequenza e vanno a capo (con un valore specifico del sistema operativo) se il sistema è attivo abbastanza a lungo. I numeri non vengono mai riutilizzati a meno che non siano gratuiti al punto di fork().

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.