В * nix PID являются уникальными идентификаторами для запуска процессов. Как создаются PID? Это просто целое число, которое увеличивается, или более сложная структура, такая как список? Как они перерабатываются? Под рециркуляцией я подразумеваю, что, когда процесс завершается, его PID будет в конечном итоге использоваться другим процессом.
В Unix идентификаторы процессов обычно распределяются последовательно, начиная с 0 и увеличиваясь до максимального значения, которое варьируется от системы к системе. Как только этот предел достигнут, распределение возобновляется с нуля и снова увеличивается. Однако для этого и последующих проходов все идентификаторы PID, все еще назначенные процессам, пропускаются.
так что это действительно очень простая политика для «генерации», просто увеличивая счетчик и «перерабатывая», просто оборачивайте число вокруг максимального значения и продолжайте увеличивать до тех пор, пока не найдете номер, который был присвоен процессу, который завершился и имеет были удалены из таблицы процессов.
Некоторые реализации Unix, такие как AIX, используют менее простую политику, см., Например, этот FAQ .
Спасибо за ответ. Кстати, что именно такое политика AIX "это менее просто"?
14 лет назад
0
@ Helltone, я не думаю, что AIX документирует, какую именно политику он использует (так что она может измениться при любом выпуске), но вы можете думать об этом как о генерации случайных чисел в соответствующем диапазоне (который повторяется до тех пор, пока не будет сгенерирован PID, то есть в настоящее время не используется).
Alex Martelli 14 лет назад
1
Этот алгоритм кажется мне немного проблематичным. Как вы гарантируете, что не попадете в тупик? И нет ли проблемы с производительностью?
14 лет назад
0
The kernel is in control and need not lock anything, so how could it deadlock? Yes, there is a small performance price to pay (a small extra overhead at fork time -- say a couple dozen machine instructions for a congruential PRNG or /dev/urandom read, vs many fewer for a counter-increment), but that's always the case for measures intended to improve security (check the CPU overhead of HTTPS communication vs plain HTTP for example;-).
Alex Martelli 14 лет назад
1
Я имел в виду livelock (`while (true);`), извините, я быстро отвечал ;-)
14 лет назад
0
Обычно я вижу, что номера PID очень малы (в диапазоне 2000 - 5000), даже если моя машина включена в течение 30-40 дней. Означает ли это, что за последние 40 дней было разветвлено только 5000 процессов? это выглядит маленьким числом для меня.
Jack 14 лет назад
0
@ Джек, я полагаю, что это всего лишь эффект утилизации - ваше ядро может быть построено с небольшим максимальным числом процессов (на моей рабочей станции на работе я использую стандартное ядро ubuntu hardy heron и регулярно вижу PID до 30 000 или около того, хотя я выключаю машину каждые выходные).
Alex Martelli 14 лет назад
0
11
Jonathan Leffler
Различается.
Большинство систем просто хранят счетчик последнего сгенерированного PID, добавляют его (упаковка с максимальным числом, например, 65535 или немного меньше - часто это происходит при 65000 или даже 60000), и проверяют, что число не используется в настоящее время ( повторяется, если PID все еще используется - таким образом, PID 1, ядро, все еще там и не переиздается).
Другие системы, ориентированные на безопасность, генерируют случайное число и проверяют, что оно не используется.
В любой момент времени гарантируется, что все номера PID являются уникальными.
6
frankc
Что касается утилизации, вопрос, о которой следует помнить, состоит в том, что pid не становится доступным, как только процесс с этим pid завершается. Идентификатор pid не становится доступным до тех пор, пока родительский объект этого процесса не получит статус завершения своего дочернего элемента с помощью какой-либо формы системного вызова wait (). Ребенок, которого уволили, но чей родитель не произвел ожидание, называется зомби и обычно будет отображаться в пс как несуществующий. Плохо ведущий родитель может заморозить систему pids, если он запускает дочерние элементы и не ждет их ().
Если родитель процесса умирает до того, как он соберет статус ребенка, это нормально. Ребенок наследуется init, который будет следить за выдачей wait () и повторным использованием pid.
3
Donal Fellows
Они являются порядковыми номерами и имеют циклический переход (по значению, зависящему от ОС), если система работает достаточно долго. Числа никогда не используются повторно, если они не являются свободными в точке fork().