Linux上的最大子进程数

时间:2015-04-13 12:35:50

标签: c linux fork

下面的代码会尽可能多地生成孩子。一旦父进程退出,它们将不会进一步分叉,并且将成为僵尸 父进程会产生多少子进程?

int main(int argc, char *arg[])
{
     while(fork() > 0);
}

2 个答案:

答案 0 :(得分:4)

使用RLIMIT_NPROC setrlimit(2)可以限制子进程的数量。请注意,fork(2)可能由于多种原因而失败。您可以使用bash builtin ulimit来设置该限制。

您可以使用getrlimit(或解析/proc/self/limits,请参阅proc(5))以获取该信息。

在整个系统范围内,您可以使用/proc/sys/kernel/threads-max,因为:

  

此文件指定线程数的系统范围限制   (任务)可以在系统上创建。

还有/proc/sys/kernel/pid_max

  

此文件指定PID环绕的值(即,   此文件中的值大于最大PID)。的PID   超过此值不分配;因此,这个价值   文件也可作为系统范围内的总数限制   进程和线程。此文件的默认值32768,   导致与早期内核相同的PID范围。在32位   平台,32768是pid_max的最大值。在64位   系统,pid_max可以设置为最大2 ^ 22的任何值(PID_MAX_LIMIT,   大约400万)。

但是,可能存在其他限制(特别是交换空间)。

内核的任务是单线程进程或某些进程内的某个线程 - 例如由低级系统调用clone(2)(或某些kernel thread创建,例如kworkerksoftirqd等...。

BTW,实际的进程数量受可用资源的限制。典型的Linux桌面只有几百个(现在,我的Debian / x86-64桌面有32Gb RAM和i5-4690S有227个进程)。所以一个进程是一个非常昂贵的资源(它需要RAM,它需要CPU ......)。如果你有太多这些,你将体验thrashing。在实践中,您不希望有太多可运行的进程或可调度任务(最多只有几十个,可能不超过core几个)。

答案 1 :(得分:3)

更新 - 我可能很快,没有看到没有fork循环。然后,它可能取决于在该机器上分叉的成本。僵尸也可能使用系统资源,这些资源在某些时候会耗尽。下面提到的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);

- 原始答案:

它将创建尽可能多的进程,实际上可能(也就是说,它会快速冻结机器 - 我已经完成了),或者当前用户或shell允许的数量,如果施加了这样的限制。在bash中,可以通过内置shell命令ulimit -u <number>强加限制。请注意,一个过程可能不必通过bash启动(也许一个cron作业赢了)。