Как Linux определяет следующий PID? - PullRequest
36 голосов
/ 10 августа 2010

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

Например, если я запускаю PHP-скрипт из Apache, который выполняет <?php print(getmypid());?>, тот же PID будет распечатан в течение нескольких минут при нажатии на кнопку refresh Этот период времени зависит от того, сколько запросов получает Apache. Даже если есть только один клиент, PID в конечном итоге изменится.

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

enter image description here

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

Ответы [ 4 ]

49 голосов
/ 11 августа 2010

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

Какой-то соответствующий код:

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

11 голосов
/ 10 августа 2010

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

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

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

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

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

8 голосов
/ 10 августа 2010

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.

4 голосов
/ 11 августа 2010

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

...