Как Linux определяет следующий PID, который он будет использовать для процесса? Цель этого вопроса - лучше понять ядро Linux. Не бойтесь публиковать исходный код ядра. Если PID распределяются последовательно, как Linux заполняет пробелы? Что происходит, когда он достигает конца?
Например, если я запускаю PHP-скрипт из Apache, который выполняет Php print (getmypid ());?>
один и тот же PID будет распечатан в течение нескольких минут во время обновления. Этот период времени зависит от того, сколько запросов получает Apache. Даже если есть только один клиент, PID в конечном итоге изменится.
Когда изменяется PID, это будет близкое число, но насколько близкое? Число, по-видимому, не является полностью последовательным. Если я сделаю ps aux | grep apache
Я получаю достаточное количество процессов:
Как Linux выбирает этот следующий номер? Предыдущие несколько PID все еще работают, а также самый последний PID, который был напечатан. Как apache выбирает повторное использование этих PID?
Ядро выделяет идентификаторы PID в диапазоне (RESERVED_PIDS, PID_MAX_DEFAULT). Он делает это последовательно в каждом пространстве имен (задачи в разных пространствах имен могут иметь одинаковые идентификаторы). В случае, если диапазон исчерпан, назначение pid завершается.
Некоторый соответствующий код:
for (i = ns->level; i >= 0; i--) {
nr = alloc_pidmap(tmp);
if (nr < 0)
goto out_free;
pid->numbers[i].nr = nr;
pid->numbers[i].ns = tmp;
tmp = tmp->parent;
}
static int alloc_pidmap(struct pid_namespace *pid_ns)
{
int i, offset, max_scan, pid, last = pid_ns->last_pid;
struct pidmap *map;
pid = last + 1;
if (pid >= pid_max)
pid = RESERVED_PIDS;
/* and later on... */
pid_ns->last_pid = pid;
return pid;
}
Обратите внимание, что PID в контексте ядра - это больше, чем просто идентификаторы int
; соответствующую структуру можно найти в /include/linux/pid.h
. Помимо идентификатора, он содержит список задач с этим идентификатором, счетчик ссылок и узел хешированного списка для быстрого доступа.
Причина, по которой идентификаторы PID не отображаются последовательно в пользовательском пространстве, заключается в том, что планирование ядра может вызвать ответвление процесса между вызовами вашего процесса ' fork ()
. На самом деле, это очень распространено.
PID являются последовательными в большинстве систем. Вы можете убедиться в этом, запустив несколько процессов самостоятельно на простаивающей машине.
например. используйте возврат истории, стрелку вверх, чтобы многократно запускать команду, которая выводит собственный PID:
$ ls -l /proc/self
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21491
$ ls -l /proc/self
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21492
$ ls -l /proc/self
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21493
$ ls -l /proc/self
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21494
Не зависите от этого: по соображениям безопасности некоторые люди запускают ядра, которые тратят дополнительное время ЦП для случайного выбора новых PID.
PID могут назначаться случайным образом. Есть несколько способов сделать это.
Я бы предпочел предположить, что поведение, которое вы наблюдаете , происходит из другого источника :
Хорошие веб-серверы обычно имеют несколько экземпляров процессов для балансировки нагрузки запросов. Эти процессы управляются в пуле и назначаются определенному запросу каждый раз, когда поступает запрос. Для оптимизации производительности Apache, вероятно, назначает один и тот же процесс группе последовательных запросов от одного и того же клиента. После определенного количества запросов этот процесс прекращается и создается новый.
Я не верю, что более чем одному процессу последовательно назначается один и тот же PID в Linux.
Поскольку вы говорите, что новый PID будет близок к последнему, я предполагаю, что Linux просто назначает каждому процессу последний PID + 1. Но есть процессы, которые появляются и завершаются все время в фоновом режиме приложениями и системой. программ, поэтому вы не можете предсказать точное количество следующего запуска процесса apache.
Помимо этого, вы не должны использовать какие-либо предположения о назначении PID в качестве основы для чего-то, что вы реализуете. (См. Также комментарий Санмая.)