Что происходит, когда у вас заканчиваются PID?

8

Это чисто академический вопрос, потому что этого никогда не произойдет.

Если PID хранится как тип pid_t, а не как тип с произвольной точностью, то существует ограничение на количество PID, которые могут существовать одновременно. Есть ли определенное поведение, когда PID переполняется?

Будет ли 65536-й процесс уничтожать / sbin / init и создавать панику ядра? Или есть какие-то меры безопасности?

Фред Фрей
источник
2
stackoverflow.com/questions/6294133/maximum-pid-in-linux Я думаю, вы могли бы изменить максимальное значение и выяснить;)
2
Меньшие числа действительно используются повторно (OpenBSD и другие рандомизируют PID), и вы, вероятно, достигнете некоторого другого предела (например, из-за нехватки памяти из-за всех процессов, или из-за смерти свопа, или из-за сбоя OOM), прежде чем forkпроизойдет сбой из-за отсутствия Пид доступен.
thrig
1
Для информации: я не верю, что видел PID больше 2 ^ 15-1 = 32767. А вы?
THB
3
Ни один из предложенных дубликатов действительно не отвечает на этот вопрос.
Джули Пеллетье
1
Непонятно, спрашиваете ли вы, что происходит, когда PID достигают некоторого максимального значения (около 2 ^ 15 или около 2 ^ 32), или что происходит, когда больше невозможно выделить новый PID, что не то же самое , Я не думаю, что ваш вопрос является дубликатом любого из отмеченных вопросов; оба спрашивают, что такое предел, а не то, что происходит, когда вы превышаете его. Если вы обновите вопрос, чтобы уточнить, что вы спрашиваете, я проголосую, чтобы открыть его. (У вас уже есть ответы на обе возможные версии.)
Кит Томпсон

Ответы:

8

forkСистемный вызов должен возвращать -1, и набор errnoдля EAGAIN . Что произойдет после этого, будет зависеть от процесса, который вызвал fork.

С вилки :

Функция fork () не будет работать, если:

[EAGAIN]

Системе не хватало ресурсов, необходимых для создания другого процесса, или было бы превышено установленное системой ограничение на общее количество процессов, выполняемых в масштабе всей системы или одним пользователем {CHILD_MAX}.

JigglyNaga
источник
9

POSIX не указывает, что PID каждого нового процесса получается путем увеличения предыдущего PID. Требуется только, чтобы он был уникальным.

В системе, в которой PID увеличиваются для каждого fork(), я заметил, что значения оборачиваются после достижения некоторой верхней границы (которая в моем опыте составляет около 2 15 ). После переноса новые PID не увеличиваются строго, поскольку некоторые значения PID все еще будут использоваться из предыдущих циклов.

Не должно быть проблем, пока у вас не будет 2 N одновременно запущенных процессов. Я подозреваю, что система столкнется с некоторым ограничением емкости задолго до того, как это произошло В этом случае fork()системный вызов потерпит неудачу и, вероятно, будет установлен errnoна EAGAINили ENOMEM( man forkдля подробностей).

Код, который реализует, forkможет или не может проверить, доступны ли какие-либо PID. Это может не беспокоить, потому что предполагается, что системные ресурсы закончились бы до того, как он достигнет этой точки, или он мог бы иметь явную проверку для полноты и обработки будущих возможностей. Я не проверял, и если бы у меня было, я мог бы обращаться только к тому ядру, на которое смотрел.

Кит Томпсон
источник
Конечно, я знаю, что этого никогда не произойдет, но система имеет ограниченное количество идентификаторов PID для назначения. Я просто хочу знать, что происходит, когда он заканчивается.
Фред Фрей
1
Этот ответ на самом деле единственный, который действительно отвечает на вопрос. Поведение зависит от системы, но требуется только для обеспечения уникального pid для каждого нового процесса. Конечно, вы ограничены настроенным максимальным количеством идентификаторов PID, которое подробно описано в двух вопросах, помеченных как дубликаты, но это вряд ли произойдет, если в вашей системе не запущены контейнеры или если у вас не установлена ​​серьезная ошибка в установленной программе или скрипте.
Джули Пеллетье
2

Максимальный предел PID намного меньше, чем 2^((sizeof(int)*CHAR_BIT). См. Каково максимальное значение идентификатора процесса? , Другими словами, ваши PID никогда не превысят 4 миллиардов.

Когда все слоты pid будут заполнены, forkвызовы начнут давать сбой errno==EAGAIN(см. Fork (2) ). Если вы просто попали в топ, не заполнив все слоты, следующий PID будет следующим свободным слотом после 1 (1 - init)

PSkocik
источник