来自proc / pid / maps的堆栈大小

时间:2012-03-24 05:27:57

标签: c stack

我在/ 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。

3 个答案:

答案 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看到的堆栈大小会更多。