下面的代码将产生尽可能多的孩子。自己不会再分叉,一旦父进程退出就会变成僵尸。
父进程会产生多少个子进程?
int main(int argc, char *arg[])
{
while(fork() > 0);
}
Run Code Online (Sandbox Code Playgroud)
子过程的数量可以与被限制的setrlimit(2)使用RLIMIT_NPROC。请注意,fork(2)可能由于多种原因而失败。您可以使用bashbuiltin ulimit来设置该限制。
您可以使用getrlimit(或 parse /proc/self/limits,请参阅proc(5))来获取该信息。
在系统范围内,您可能会使用/proc/sys/kernel/threads-max:
此文件指定系统范围内可以在系统上创建的线程(任务)数量的限制。
还有 /proc/sys/kernel/pid_max
此文件指定 PID 环绕的值(即,此文件中的值比最大 PID 大 1)。不分配大于此值的 PID;因此,此文件中的值还充当系统范围内进程和线程总数的限制。此文件的默认值 32768 产生与早期内核相同的 PID 范围。在 32 位平台上,32768 是 pid_max 的最大值。在 64 位系统上,pid_max 可以设置为最多 2^22(PID_MAX_LIMIT,大约 400 万)的任何值。
但是,可能还有其他限制(特别是交换空间)。
用于内核任务可以是一个单线程程序或某些进程中的一些话题-例如,由低层次的系统调用创建克隆(2) (或某些内核线程一样kworker,ksoftirqd等...)。
顺便说一句,实际的进程数量受到可用资源的更多限制。一个典型的 Linux 桌面只有几百个(现在,我的 Debian/x86-64 桌面具有 32Gb RAM 和 i5-4690S 有 227 个进程)。所以一个进程是一种非常昂贵的资源(它需要 RAM,它需要 CPU ......)。如果你有太多他们,你会遇到颠簸。并且在实践中,您不希望有太多可运行的进程或可调度的任务(可能最多只有几十个,也许每个核心不超过几个)。