“主线程可以动态增长其堆栈”是什么意思

问题描述 投票:0回答:1

pthread_attr_setstacksize()

的手册页上

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

linux stack pthreads
1个回答
3
投票

ulimit -s
(又名
setrlimit(RLIMIT_STACK, ...)
)设置的值,通常默认为 8 MB,是最大堆栈大小。 最初,将分配和映射更少量的虚拟内存(可能只有几 kb)。 当堆栈增长超过实际分配的数量时,就会触发页面错误。 然后内核将当前使用情况与 rlimit 中设置的最大值进行比较。 如果尚未达到最大值,内核会分配更多的虚拟内存页并将它们映射到位,然后将控制权返回给进程;这是完全透明的。 如果达到最大值,它会使用 SIGSEGV 终止进程。

如果系统必须为每个进程保留完整的 8 MB 虚拟内存,那么效率会很低,而大多数进程使用的虚拟内存要少得多。 通过仅根据需要分配它,您仍然可以拥有数百个进程,每个进程的堆栈限制为 8 MB,即使机器只有(比方说)64 MB 内存 + 交换总数。 这是一种“过度承诺”。 还请记住,进程可以在运行时调用

setrlimit

自身并增加其自身的最大堆栈大小,只要没有其他任何内容映射到该地址空间即可。 主线程的堆栈传统上位于虚拟内存的顶部附近,其他所有内容都靠近底部,因此之间有大量可用地址空间,因此通常可以将最大值增加到超出其初始 8 MB 限制。 然而,其他线程的堆栈必然必须分配在其他地方,并且实际上不可能确保有大量的可用地址空间供它们增长。

    

© www.soinside.com 2019 - 2024. All rights reserved.