Как стать автором
Обновить

Комментарии 5

Добавлю свои две копейки. В некоторых операционных системах, например FreeBSD, PIDы назначаются случайным образом а не последовательно. Считается, что если процессы имеют случайные PID и юзер не видит список процессов другого юзера, то это более безопасно, чем простой инкремент PID.

Интересно, насколько сильно такой подход увеличивает нагрузку в ситуации с большим кол-вом запущенных процессов, ведь поиск свободного числа случайным образом не оптимален. В прошлом сталкивался с ситуациями, когда приложение упиралось в ограничение PID'ов, приходилось повышать лимит.

Сейчас глянул, на домашнем ноутбуке лимит по-умолчанию соответствует максимуму, то есть 4194304.

Можно хранить список свободных pid и брать случайный элемент из него одновременно удаляя. А при завершении процесса класть его pid в список. Тогда генерация случайного pid может иметь O(1) ценой роста потребления памяти. Но хранить 32768 int на современном железе не проблема.

большинство современных дистрибутивов из коробки уже имеют 4 млн пидов.
Линукс часто используется в ембеддед устройствах и контейнерах, каждая лишняя страница памяти на учете может быть.

Это делается просто путем увеличения текущего наивысшего PID на 1

Ну уже ж не просто путем увеличения наивысшего, а где-то хранится определенный счетчик, который инкрементируется, пока не достигнет max pid, потом пойдет с начала, плюс будет проверять что данный pid сейчас свободен. Искать наивысший на текущий момент пид по дереву процессов дольше. Плюс не забываем про баги, из-за которых появляются зомби процессы.

что процесс считается "завершенным" только в том случае, если его статус завершения был получен его родителем.

Словно чатгпт писал. Я не понимаю смысл. Система может прибить процесс, у которого есть дочерние процессы. У них временно вообще родителя может не быть, ОС потом присвоит им родителем процесс с PID1. Я не могу точно сказать в какой момент именно происходит возврат exit code родительскому процессу, но вполне могу предположить, что после того, как завершился дочерний процесс и освободил PID, параллельно может родиться новый процесс, а потом exit code дойдет до родительского процесса, или хотя бы дойдет до родительского процесса и будет как-то обработано.

Из-за счетчика процессов вероятность того, что новый процесс займет это же PID невероятно низка из-за счетчика процессов, в котором max-pid в современных системах уже не пятизначный, но технически это наверное возможно.

Но это все слишком базовые вещи.
Если уж писать статью, то хотя бы чуть больше, чем написано в википедии. Например о том, что дерево процессов может быть не одно, что весьма полезно учитывая нынешние тренды контейнеров.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории