On *nix, PIDs являются уникальными идентификаторами для запущенных процессов. Как генерируются PID? Это просто целое число, которое увеличивается, или более сложная структура, такая как список? Как они получают рециркулированными? Под переработкой я имею в виду, что, когда процесс завершается, его PID в конечном итоге будет повторно использован другим процессом.
Как генерируются PID?
4 ответа
As Википедия говорит,
в Unix идентификаторы процессов обычно выделено на последовательной основе, начиная с 0 и растут до максимума значение которых зависит от системы система. Как только этот предел достигнут, выделение перезапускается с нуля и снова роста. Однако, для этого и последующие пропуски все PIDs все еще назначенные процессам пропускаются.
Так что это действительно очень простая политика для "поколения", просто увеличьте счетчик и "рециркуляция", просто оберните число вокруг на максимальное значение и продолжайте увеличивать, пока не найдете номер, который был назначен процессу, который закончился и был удален из таблицы процессов.
некоторые реализации Unix, такие как AIX, используют менее простую политику, см., например,чаво.
Она варьируется.
большинство систем просто подсчитывают последний сгенерированный PID, максимальное число, такое как 65535 или немного меньше - часто обертывание происходит в 65000 или даже 60000), и проверьте, что число в настоящее время не используется (повторяется, если PID все еще используется - поэтому PID 1, ядро, все еще существует и не получает "переиздание").
другие системы безопасности генерируют случайное число и проверяют, что оно не используется.
At в любой момент времени гарантируется, что все номера PID уникальны.
Что касается утилизации часть вопроса, одна вещь, чтобы иметь в виду, что pid не становится доступным, как только процесс с этим pid завершается. Pid не становится доступным, пока родитель того процесса не собирает статус завершения его потомка через некоторую форму системного вызова wait (). Дочерний элемент, который завершается, но чей родитель не выдал ожидание, называется зомби и обычно будет отображаться в ps как несуществующий. Это возможно для плохого поведения родителя, чтобы голодать систему pids, если он запускает детей и не ждет() для них.
Если родитель процесса умирает до того, как он получает статус потомка, это нормально. Дочерний элемент наследуется init, который будет убедиться, что выдан wait () и pid повторно используется.
это порядковые номера и обертывание (при определенном для ОС значении), если система работает достаточно долго. Номера никогда не используются повторно, если они не свободны в точке fork()
.
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]