2015-04-13 7 views
0

В приведенном ниже коде появится столько детей, сколько возможно. Сами не будут развиваться дальше и станут зомби после выхода родительского процесса.
Сколько детских процессов родительский процесс порождает?Максимальное число дочерних процессов в Linux

+0

Я не знаю, была ли в этом запрошена эффективность, но 'while (fork()> = 0)' было бы лучше. или хуже, в зависимости от того, кто является владельцем. – holgac

+1

если я добавлю> = сыновья тоже делают сыновей, и я этого не хочу. – Moawiya

+1

Процессы Zombie все еще имеют назначенные pids, поэтому [max_pids] (http://stackoverflow.com/questions/6294133/maximum-pid-in-linux) может быть вашим лимитом, если у вас достаточно памяти для хранения данных процесса. – holgac

ответ

4

Число дочерних процессов может быть ограничено setrlimit(2) с использованием RLIMIT_NPROC. Обратите внимание, что fork(2) может не работать по нескольким причинам. Вы можете использовать bash builtinulimit, чтобы установить этот предел.

Вы можете использовать getrlimit (или разобрать /proc/self/limits, см. proc(5)), чтобы получить эту информацию.

Общесистемную, вы можете использовать /proc/sys/kernel/threads-max с:

Этот файл определяет системный лимит на количество нитей (задачи), которые могут быть созданы в системе.

Существует также /proc/sys/kernel/pid_max

Этот файл определяет значение, при котором ИДП обернуть вокруг (то есть значение в этом файле на единицу больше, чем максимальный PID). PID больше этого значения не выделяются; таким образом, значение в этом файле также действует как общесистемный предел для общего количества процессов и потоков . Значение по умолчанию для этого файла 32768, приводит к тому же диапазону PID, что и к ранним ядрам. На 32-битных платформах 32768 является максимальным значением для pid_max. В 64-битных системах pid_max может быть установлен на любое значение до 2^22 (PID_MAX_LIMIT, около 4 миллионов).

Однако могут быть другие ограничения (в частности, место подкачки).

Задача для ядра - это либо однопоточный процесс, либо некоторый поток внутри некоторого процесса - например, созданный низкоуровневым syscall clone(2) (или некоторые kernel thread, как kworker, ksoftirqd и т. д.).

BTW, практическое число процессов намного ограничено доступными ресурсами. Типичный рабочий стол Linux имеет всего несколько сотен (прямо сейчас, мой рабочий стол Debian/x86-64 с 32Gb RAM & i5-4690S имеет 227 процессов). Таким образом, процесс является довольно дорогостоящим ресурсом (ему нужна оперативная память, ему нужен процессор ...). Если у вас их слишком много, вы испытаете thrashing. И на практике вы не хотите иметь слишком много runnable процессов или планируемых задач (возможно, всего несколько десятков из них максимум, возможно, не более нескольких из core).

+0

Возвращает ли 'getconf CHILD_MAX' то же самое? –

3

Обновление - возможно, я был готов, не видел, чтобы не было вилки. Тогда это, вероятно, зависит от того, насколько дорого стоит вилка на этой машине. Зомби могут также использовать системные ресурсы, которые в какой-то момент будут исчерпаны. И команда ulimit, упомянутая ниже, конечно, остается в силе .--

Обновление 2: Я вижу это в some copy of /linux/kernel/fork.c, которое должно поддерживать работоспособность машины (max_threads, по-видимому, ограничивает количество процессов, так как каждый процесс имеет хотя бы один поток):

  /* 
272   * The default maximum number of threads is set to a safe 
273   * value: the thread structures can take up at most half 
274   * of memory. 
275   */ 
276   max_threads = mempages/(8 * THREAD_SIZE/PAGE_SIZE); 

- Оригинальный ответ:

он будет создавать столько процессов, как физически возможно (то есть, он будет быстро заморозить машину - я сделал это), или как многие как разрешено для текущего пользователя или оболочки, если такой предел наложен. В bash можно ввести ограничение через встроенную команду оболочки ulimit -u <number>. Обратите внимание, что процесс, вероятно, не нужно запускать через bash (возможно, задание cron не будет).

+0

Я думаю, что ваш ответ по-прежнему действителен, так как зомби-процессы по-прежнему остаются детьми. Дети не будут использовать много памяти, хотя они будут иметь только «task_struct» в ядре, только с несколькими уникальными действительными указателями. другие будут либо нулевыми, когда процесс станет зомби, либо они будут такими же, как и у родителей ». – holgac

Смежные вопросы