Wie werden PIDs generiert?

25455
Giovanni Funchal

Auf * nix sind PIDs eindeutige Bezeichner für laufende Prozesse. Wie werden PIDs generiert? Ist es nur eine Ganzzahl, die inkrementiert wird, oder eine komplexere Struktur wie eine Liste? Wie werden sie recycelt? Mit Recycling meine ich, dass, wenn ein Prozess endet, seine PID schließlich von einem anderen Prozess wiederverwendet wird.

37
http://lwn.net/Articles/10238/ vor 14 Jahren 0

4 Antworten auf die Frage

35
Alex Martelli

Wie Wikipedia sagt,

Unter Unix werden Prozess-IDs in der Regel sequentiell vergeben. Sie beginnen bei 0 und steigen auf einen Maximalwert, der von System zu System variiert. Sobald dieses Limit erreicht ist, startet die Zuweisung wieder bei Null und steigt erneut an. Für diese und nachfolgende Durchläufe werden jedoch alle PIDs, die den Prozessen noch zugewiesen sind, übersprungen.

Es ist also eine sehr einfache Richtlinie für "Generierung". Erhöhen Sie einfach einen Zähler und "Recycling". Wickeln Sie die Zahl einfach mit einem Maximalwert um und erhöhen Sie sie so lange, bis Sie eine Nummer finden, die einem Prozess zugewiesen wurde, der abgeschlossen wurde wurde aus der Prozesstabelle entfernt.

Einige Unix-Implementierungen wie AIX verwenden eine weniger einfache Richtlinie, siehe z . B. diese häufig gestellten Fragen .

Danke für die Antwort. Was genau ist diese AIX-Richtlinie "das ist weniger einfach"? vor 14 Jahren 0
@Helltone, ich glaube nicht, dass AIX genau dokumentiert, welche Richtlinie verwendet wird (daher könnte sich dies bei jeder Version ändern), aber Sie könnten es als Zufallszahlengenerierung im entsprechenden Bereich betrachten (die wiederholt wird, bis eine PID generiert wird derzeit nicht verwendet). Alex Martelli vor 14 Jahren 1
Dieser Algorithmus erscheint mir etwas problematisch. Wie stellen Sie sicher, dass Sie nicht in eine Sackgasse geraten? Und gibt es kein Leistungsproblem? vor 14 Jahren 0
Der Kernel hat die Kontrolle und muss nichts sperren. Wie kann er also blockieren? Ja, es ist ein geringer Leistungspreis zu zahlen (ein kleiner zusätzlicher Aufwand bei der Gabelung - sagen wir ein paar Dutzend Maschinenanweisungen für einen kongruenten PRNG- oder / dev / urandom-Lesevorgang, viel weniger für ein Gegeninkrement), aber das ist immer so Dies ist der Fall für Maßnahmen zur Verbesserung der Sicherheit (zum Beispiel den CPU-Overhead der HTTPS-Kommunikation im Vergleich zu einfachem HTTP ;-). Alex Martelli vor 14 Jahren 1
Ich meinte Livelock (`while (true);`), sorry, ich habe schnell geantwortet ;-) vor 14 Jahren 0
Normalerweise sehe ich sehr kleine PID-Werte (im Bereich von 2000 bis 5000), auch wenn meine Maschine 30 bis 40 Tage eingeschaltet ist. Bedeutet das, dass in den letzten 40 Tagen nur 5000 Prozesse gegabelt wurden? das sieht für mich eine kleine Zahl aus. Jack vor 14 Jahren 0
@Jack, ich denke, es ist nur eine Auswirkung des Recyclings - Ihr Kernel kann aus einer kleinen Anzahl von Prozessen bestehen (auf meinem Arbeitsplatz bei der Arbeit verwende ich einen Standard-Ubuntu-Hardy-Reiher-Kernel, den ich regelmäßig sehe.) PIDs bis zu 30.000, obwohl ich die Maschine jedes Wochenende ausschalte). Alex Martelli vor 14 Jahren 0
11
Jonathan Leffler

Es variiert.

Bei den meisten Systemen wird nur die zuletzt erzeugte PID gezählt, eine hinzugefügt (Umbruch mit einer maximalen Anzahl wie 65535 oder etwas kleiner - häufig wird der Umbruch bei 65000 oder sogar 60000 ausgeführt) und überprüft, ob die Anzahl derzeit nicht verwendet wird ( Wiederholen, wenn die PID noch verwendet wird - PID 1, der Kernel, ist immer noch vorhanden und wird nicht 'neu ausgegeben').

Andere sicherheitsorientierte Systeme generieren zufällig eine Zahl und überprüfen, dass sie nicht verwendet wird.

Es ist jederzeit gewährleistet, dass alle PID-Nummern eindeutig sind.

6
frankc

Was den Recycling-Teil der Frage anbelangt, ist zu beachten, dass eine PID nicht verfügbar wird, sobald der Prozess mit dieser PID beendet ist. Die PID wird erst verfügbar, wenn das übergeordnete Element dieses Prozesses den Beendigungsstatus seines untergeordneten Objekts über eine Form des Systemaufrufs wait () abruft. Ein Kind, das beendet ist, dessen Elternteil jedoch nicht gewartet hat, wird als Zombie bezeichnet und erscheint in der Regel als nicht mehr vorhanden. Es ist möglich, dass ein ungezogenes Elternteil das Pids-System verhungert, wenn es Kinder startet und nicht auf sie wartet ().

Wenn das übergeordnete Element eines Prozesses stirbt, bevor es den Status eines untergeordneten Objekts erfasst, ist dies in Ordnung. Das Kind wird von init vererbt, der dafür sorgt, dass wait () ausgegeben wird und die PID wiederverwendet wird.

3
Donal Fellows

Sie sind Sequenznummern und umlaufen (mit einem betriebssystemspezifischen Wert), wenn das System lange genug in Betrieb ist. Zahlen werden nur dann wiederverwendet, wenn sie zum Zeitpunkt von frei sind fork().