下面的代码将产生尽可能多的子级。自己不会进一步fork,一旦父进程退出就会变成僵尸。
父进程将产生多少个子进程?
int main(int argc, char *arg[])
{
while(fork() > 0);
}
子进程的数量可以通过以下方式限制设置限制(2) http://man7.org/linux/man-pages/man2/setrlimit.2.html using RLIMIT_NPROC
。请注意fork(2) http://man7.org/linux/man-pages/man2/fork.2.html可能会因多种原因而失败。你可以使用bash builtin https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html ulimit
设置该限制。
您可以使用getrlimit
(或解析/proc/self/limits
, see proc(5) http://man7.org/linux/man-pages/man5/proc.5.html)来获取该信息。
在系统范围内,您可能会使用/proc/sys/kernel/threads-max
since:
该文件指定系统范围内的线程数限制
可以在系统上创建的(任务)。
还有/proc/sys/kernel/pid_max
该文件指定 PID 环绕的值(即
该文件中的值比最大 PID 大 1)。 PID
大于该值的不分配;因此,这个值
文件还充当系统范围内的总数限制
进程和线程。该文件的默认值 32768,
导致与早期内核相同的 PID 范围。在 32 位上
平台上,32768 是 pid_max 的最大值。在 64 位上
系统中,pid_max 可以设置为 2^22 以内的任何值(PID_MAX_LIMIT,
约 400 万)。
但是,可能存在其他限制(特别是交换空间)。
内核的任务要么是单线程进程,要么是某个进程内的某个线程 - 例如由低级系统调用创建clone(2) http://man7.org/linux/man-pages/man2/clone.2.html(或一些内核线程 http://www.crashcourse.ca/wiki/index.php/Kernel_threads like kworker
, ksoftirqd
ETC...)。
顺便说一句,实际的进程数量更多地受到可用资源的限制。典型的 Linux 桌面只有几百个进程(目前,我的 Debian/x86-64 桌面具有 32Gb RAM 和 i5-4690S 有 227 个进程)。所以一个进程是一个相当昂贵的资源(它需要RAM,它需要CPU......)。如果你有太多,你就会经历殴打 https://en.wikipedia.org/wiki/Thrashing_(computer_science)。在实践中,你不想有太多runnable进程或可调度的任务(可能最多只有几十个,也许每个任务不超过几个)core https://en.wikipedia.org/wiki/Multi-core_processor).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)