В * nix PID являются уникальными идентификаторами для запуска процессов. Как создаются PID? Это просто целое число, которое увеличивается, или более сложная структура, такая как список? Как они перерабатываются? Под рециркуляцией я подразумеваю, что, когда процесс завершается, его PID будет в конечном итоге использоваться другим процессом.
42
Ответы:
Как гласит Википедия ,
так что это действительно очень простая политика для «генерации», просто увеличивая счетчик и «перерабатывая», просто оборачивайте число вокруг максимального значения и продолжайте увеличивать до тех пор, пока не найдете номер, который был присвоен процессу, который завершился и имеет были удалены из таблицы процессов.
Некоторые реализации Unix, такие как AIX, используют менее простую политику, см., Например, этот FAQ .
источник
while(true);
), извините, я быстро отвечал ;-)Различается.
Большинство систем просто хранят счетчик последнего сгенерированного PID, добавляют его (упаковка с максимальным числом, например, 65535 или немного меньше - часто это происходит при 65000 или даже 60000), и проверяют, что число не используется в настоящее время ( повторяется, если PID все еще используется - таким образом, PID 1, ядро, все еще там и не переиздается).
Другие системы, ориентированные на безопасность, генерируют случайное число и проверяют, что оно не используется.
В любой момент времени гарантируется, что все номера PID являются уникальными.
источник
Что касается утилизации, вопрос, о которой следует помнить, состоит в том, что pid не становится доступным, как только процесс с этим pid завершается. Pid не становится доступным, пока родительский элемент этого процесса не соберет статус завершения своего дочернего элемента с помощью какой-либо формы системного вызова wait (). Ребенок, которого уволили, но чей родитель не произвел ожидание, называется зомби и обычно будет отображаться в пс как несуществующий. Плохо ведущий родитель может заморозить систему pids, если он запускает дочерние элементы и не ждет их ().
Если родитель процесса умирает до того, как он соберет статус ребенка, это нормально. Дочерний объект наследуется init, который будет следить за выдачей wait () и повторным использованием pid.
источник
myprog &
последовалwait $!
бы UB.Они являются порядковыми номерами и имеют циклический переход (по значению, зависящему от ОС), если система работает достаточно долго. Числа никогда не используются повторно, если они не являются свободными в точке
fork()
.источник