Как Linux определяет следующий PID?

Как Linux определяет следующий PID, который он будет использовать для процесса? Цель этого вопроса - лучше понять ядро ​​Linux. Не бойтесь публиковать исходный код ядра. Если PID распределяются последовательно, как Linux заполняет пробелы? Что происходит, когда он достигает конца?

Например, если я запускаю PHP-скрипт из Apache, который выполняет один и тот же PID будет распечатан в течение нескольких минут во время обновления. Этот период времени зависит от того, сколько запросов получает Apache. Даже если есть только один клиент, PID в конечном итоге изменится.

Когда изменяется PID, это будет близкое число, но насколько близкое? Число, по-видимому, не является полностью последовательным. Если я сделаю ps aux | grep apache Я получаю достаточное количество процессов:

enter image description here

Как Linux выбирает этот следующий номер? Предыдущие несколько PID все еще работают, а также самый последний PID, который был напечатан. Как apache выбирает повторное использование этих PID?

37
задан user 6 December 2014 в 15:39
поделиться

4 ответа

Ядро выделяет идентификаторы PID в диапазоне (RESERVED_PIDS, PID_MAX_DEFAULT). Он делает это последовательно в каждом пространстве имен (задачи в разных пространствах имен могут иметь одинаковые идентификаторы). В случае, если диапазон исчерпан, назначение pid завершается.

Некоторый соответствующий код:

Внутри alloc_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;
}

alloc_pidmap ()

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 () . На самом деле, это очень распространено.

49
ответ дан 27 November 2019 в 04:36
поделиться

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.

8
ответ дан 27 November 2019 в 04:36
поделиться

PID могут назначаться случайным образом. Есть несколько способов сделать это.

4
ответ дан 27 November 2019 в 04:36
поделиться

Я бы предпочел предположить, что поведение, которое вы наблюдаете , происходит из другого источника :

Хорошие веб-серверы обычно имеют несколько экземпляров процессов для балансировки нагрузки запросов. Эти процессы управляются в пуле и назначаются определенному запросу каждый раз, когда поступает запрос. Для оптимизации производительности Apache, вероятно, назначает один и тот же процесс группе последовательных запросов от одного и того же клиента. После определенного количества запросов этот процесс прекращается и создается новый.

Я не верю, что более чем одному процессу последовательно назначается один и тот же PID в Linux.

Поскольку вы говорите, что новый PID будет близок к последнему, я предполагаю, что Linux просто назначает каждому процессу последний PID + 1. Но есть процессы, которые появляются и завершаются все время в фоновом режиме приложениями и системой. программ, поэтому вы не можете предсказать точное количество следующего запуска процесса apache.

Помимо этого, вы не должны использовать какие-либо предположения о назначении PID в качестве основы для чего-то, что вы реализуете. (См. Также комментарий Санмая.)

11
ответ дан 27 November 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: