我在/ proc / pid / maps中看到了linux-64位的C程序的堆栈大小。我可以看到以下关于堆栈大小的行。
7fffc2e14000-7fffc2e35000 rw-p 00000000 00:00 0 [stack]
我不理解上述值。如果我采取差异,我会得到差值135168十进制。但这并不接近8MB。我解释错了吗?
但如果我打印rlimit:
int main (void)
{
struct rlimit limit;
getrlimit (RLIMIT_STACK, &limit);
printf ("\nStack Limit = %ld and %ld max\n", limit.rlim_cur, limit.rlim_max);
}
输出: Stack Limit = 8388608和-1 max
我得到Stack Limit = 8388608,达到8MB。
答案 0 :(得分:4)
rlim_cur
是该进程的堆栈可以增长到的“软限制”。它不是当前堆栈使用情况的指示器。来自man
page:
另一方面,每个资源都有一个相关的软限制和硬限制,如下所定义 rlimit结构:
struct rlimit { rlim_t rlim_cur; /* Soft limit */ rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */ };
软限制是内核强制执行的值 相应的资源。硬限制作为软的上限 limit:无特权的进程可能只将其软限制设置为一个值 在0到硬限制的范围内,并且(不可逆地)降低它 硬限制。
/proc/[pid]/maps
显示当前为该进程映射的内容。我看到0x21000最有可能(33)4k页。这可能是该进程当前堆栈使用情况的更好指标。但是,它可能包含堆栈以外的内容,例如环境变量。
答案 1 :(得分:2)
当进程启动时,Linux不会为堆栈提交整个rlimit大小。它只保留了这么多虚拟地址空间(以便其他mmaps等不能阻止堆栈增长)并让堆栈动态增长到极限。但是,还有一个默认的提交堆栈大小,根据系统的不同,似乎是128k或132k,我不知道如何调整/调整它。
答案 2 :(得分:0)
RLIMIT_STACK
指定堆栈可以增长的最大限制。现在你的堆栈是132 KB。如果您使用了更多自动变量,那么您在/proc/pid/maps
看到的堆栈大小会更多。