在 pthread_attr_setstacksize 的手册页上https://man7.org/linux/man-pages/man3/pthread_attr_setstacksize.3.html
A thread's stack size is fixed at the time of thread creation. Only the main thread can dynamically grow its stack.
我对linux pthread的理解,主线程堆栈大小限制为ulimit -s
主线程创建的值。尽管它根据堆栈使用的需求将 phy 映射到 virt,但大小不再增长。
这里的动态增长是什么意思?这是否意味着主线程堆栈大小可以增长超过ulimit -s
?
设定值由ulimit -s
(aka setrlimit(RLIMIT_STACK, ...)
),通常默认为 8 MBmaximum堆栈大小。最初,将分配和映射更少量的虚拟内存(可能只有几 kb)。当堆栈增长超过实际分配的数量时,就会触发页面错误。然后内核将当前使用情况与 rlimit 中设置的最大值进行比较。如果尚未达到最大值,内核会分配更多的虚拟内存页并将它们映射到位,然后将控制权返回给进程;这是完全透明的。如果达到最大值,它会使用 SIGSEGV 终止该进程。
如果系统必须为每个进程保留完整的 8 MB 虚拟内存,那么效率会很低,而大多数进程使用的虚拟内存要少得多。通过仅根据需要分配它,您仍然可以拥有数百个进程,每个进程的堆栈限制为 8 MB,即使机器只有(比方说)64 MB 内存 + 交换总数。这是一种形式过度承诺.
另请记住,进程可以调用setrlimit
只要没有其他东西被映射到该地址空间,它就会在运行时自行增加其最大堆栈大小。主线程的堆栈传统上位于虚拟内存的顶部附近,其他所有内容都靠近底部,因此之间有大量可用地址空间,因此通常可以将最大值增加到超出其初始 8 MB 限制。然而,其他线程的堆栈必然必须分配在其他地方,并且实际上不可能确保有大量空闲地址空间供它们增长。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)