编辑
2023-10-28
linux
00
请注意,本文编写于 560 天前,最后修改于 560 天前,其中某些信息可能已经过时。

目录

虚拟内存空间
32位虚拟空间
64位虚拟空间
创建一个线程需要多少内存?
系统参数

虚拟内存空间

image.png

32位虚拟空间

image.png

64位虚拟空间

image.png

创建一个线程需要多少内存?

一个进程需要一个栈,默认8MB(可配置)

在 32 位 Linux 系统里,一个进程的虚拟空间是 4G,内核分走了1G,用户能用的只有 3G。

创建一个线程需要占用 8M 虚拟内存,总共有 3G 虚拟内存可以使用。于是我们可以算出,最多可以创建差不多 380个(3G/8M)左右的线程。

如果想使得进程创建上千个线程,那么我们可以调整创建线程时分配的栈空间大小,比如调整为 512k:

[ecs-user@iZ2ze923utbhhwxwgc0pd9Z ~]$ ulimit -s 512

64 位系统意味着用户空间的虚拟内存最大值是 128T,这个数值是很大的,一个线程需占用 8M 栈空间的情况来算,那么理论上可以创建 128T/8M 个线程,也就是 1000多万个线程,有点魔幻!

所以按 64 位系统的虚拟内存大小,理论上可以创建无数个线程。

系统参数

前面学习我们了解到了64 位系统的虚拟内存大小,理论上可以创建无数个线程。不过事实上,肯定创建不了那么多线程,除了虚拟内存的限制,还有系统的限制。

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

  • /proc/sys/kernel/threads-max,表示系统支持的最大线程数,默认值是 14553;
  • /proc/sys/kernel/pid_max,表示系统全局的 PID 号数值的限制,每一个进程或线程都有 ID,ID 的值超过这个数,进程或线程就会创建失败,默认值是 32768;
  • /proc/sys/vm/max_map_count,表示限制一个进程可以拥有的VMA(虚拟内存区域)的数量,具体什么意思我也没搞清楚,反正如果它的值很小,也会导致创建线程失败,默认值是 65530。

原文链接https://mp.weixin.qq.com/s/T-1RHjL4GaG7FCPMWB2FEw

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!