一个进程最多可以创立多少个线程

前言

话不多说,先来张脑图~

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 位系统的虚构内存大小,通常上可以创立有数个线程。不过理想上,必需创立不了那么多线程,除了虚构内存的限度,还有系统的限度。

比如上方这三个内核参数的大小,都会影响创立线程的下限:

总结

最后便捷总结下:

您可能还会对下面的文章感兴趣: