一个进程最多可以创立多少个线程
前言
话不多说,先来张脑图~
linux 虚构内存常识回忆
虚构内存空间长啥样
在 Linux 操作系统中,虚构地址空间的外部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范畴也不同。比如最经常出现的 32 位和 64 位系统,如下所示:
经过这里可以看出:
32 位虚构内存空间
经过这张图你可以看到,用户空间内存,从低到高区分是 6 种不同的内存段:
在上方的内存段中,堆和文件映射段的内存是灵活调配的。比如说,经常使用 C 规范库的malloc()或许mmap(),就可以区分在堆和文件映射段灵活调配内存。
64 位虚构内存空间
我们知道在 32 位机器上,指针的寻址范畴为 2^32,所能表白的虚构内存空间为 4 GB。
那么我们或许会以为在 64 位机器上,指针的寻址范畴为 2^64,所能表白的虚构内存空间为 16 EB 。虚构内存地址范畴为:0x0000 0000 0000 0000 0000 - 0xFFFF FFFF FFFF FFFF 。
理想上在目前的 64 位系统下只经常使用了 48 位来形容虚构内存空间,寻址范畴为 2^48 ,所能表白的虚构内存空间为 256TB。
从上图中我们可以看出 64 位系统中的虚构内存规划和 32 位系统中的虚构内存规划大体上是差不多的。
创立一个线程须要消耗多大虚构内存
前面我们也引见了栈段,包括部分变量和函数调用的高低文等。栈的大小是固定的,普通是 8 MB。当然系统也提供了参数,以便我们自定义大小;
如今我们来验证一下,口头 ulimit -a 这条命令,检查进程创立线程时自动调配的栈空间大小
影响一个进程可创立多少线程的条件
虚构内存空间下限
32位系统
在 32 位 Linux 系统里,一个进程的虚构空间是 4G,内核分走了1G,用户能用的只要 3G。
创立一个线程须要占用 8M 虚构内存,总共有 3G 虚构内存可以经常使用。于是我们可以算出,最多可以创立差不多 380个(3G/8M)左右的线程。
假构想使得进程创立上千个线程,那么我们可以调整创立线程时调配的栈空间大小,比如调整为 512k:
[ecs-user@iZ2ze923utbhhwxwgc0pd9Z ~]$ ulimit -s 512
64位系统
64 位系统象征着用户空间的虚构内存最大值是 128T,这个数值是很大的,一个线程需占用 8M 栈空间的状况来算,那么通常上可以创立 128T/8M 个线程,也就是 1000多万个线程,有点魔幻!
所以按 64 位系统的虚构内存大小,通常上可以创立有数个线程。
系统参数限度
前面学习我们了解到了64 位系统的虚构内存大小,通常上可以创立有数个线程。不过理想上,必需创立不了那么多线程,除了虚构内存的限度,还有系统的限度。
比如上方这三个内核参数的大小,都会影响创立线程的下限:
总结
最后便捷总结下: