所以我们在 Solaris 上有一个程序,它的堆栈空间不足。
在对此进行调查时,我简要了解了堆栈的 ulimit 是什么:
user@solaris-box:~$ ulimit -a
...
stack size (kbytes, -s) 8192
所以堆栈大小限制为 8 兆字节。但这是整个过程的极限吗?
如果我的进程有 10 个线程怎么办,每个线程只允许 819k 吗?(或它们的一些混合,高达 8MiB?)
我找不到任何关于此的文档。
所以我们在 Solaris 上有一个程序,它的堆栈空间不足。
在对此进行调查时,我简要了解了堆栈的 ulimit 是什么:
user@solaris-box:~$ ulimit -a
...
stack size (kbytes, -s) 8192
所以堆栈大小限制为 8 兆字节。但这是整个过程的极限吗?
如果我的进程有 10 个线程怎么办,每个线程只允许 819k 吗?(或它们的一些混合,高达 8MiB?)
我找不到任何关于此的文档。
概括
对于主线程,您必须在进程启动之前
setrlimit()
调用(可能通过使用ulimit
),以确保较大的堆栈大小有效。对于由进程启动的线程,您需要使用
pthread_attr_setstacksize()
,因为线程堆栈大小完全不受来自/的stack size
资源限制的影响。setrlimit()
getrlimit()
代码需要看起来像这样:
您可以从当前堆栈大小限制中获取线程堆栈大小:
(请注意,如果您使用的是创建自己的线程的库,则该库可能有自己记录的设置线程堆栈大小的方法,例如 OpenMPI。)
详细解答
资源限制由
ulimit
实用程序从命令行设置。如果你跑
truss -f -a -vall -o /tmp/truss.out /usr/bin/ulimit -a
,你会看到如果你调查一下
/tmp/truss.out
,你会看到我们看到它
ulimit
使用(getrlimit()
andsetrlimit()
) 库函数来获取/设置资源限制。每/页(
getrlimit()
setrlimit()
man
注意粗体部分):因此,由非主线程的进程创建的线程的堆栈大小不受进程
RLIMIT_STACK
资源限制的影响。而且您必须在进程启动setrlimit()
之前(在父进程中)调用,以确保任何更大的堆栈大小限制实际上是有效的。根据手册页:
pthread_create()