在C语言中从proc/pid/maps获取堆栈大小

4

我在Linux 64位系统中查看了一个C程序的/proc/pid/maps文件,发现了与栈大小相关的以下行:

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);
}

输出: 堆栈限制 = 8388608和-1最大值
我得到了堆栈限制=8388608,这相当于8MB。

有点惊讶,因为堆栈上只有一个 struct rlimit,它就那么大。;-) 猜测它还有一些增长空间...打印 limit 的地址会很有趣,可以看到堆栈增长的空间有多大。 - mpontillo
3个回答

4

rlim_cur是进程的栈可以增长到的“软限制”。它不是当前栈使用情况的指标。引自man页面:

Each resource has an associated soft and hard limit, as defined by the rlimit structure:

struct rlimit {
    rlim_t rlim_cur;  /* Soft limit */
    rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur) */
};

The soft limit is the value that the kernel enforces for the corresponding resource. The hard limit acts as a ceiling for the soft limit: an unprivileged process may only set its soft limit to a value in the range from 0 up to the hard limit, and (irreversibly) lower its hard limit.

/proc/[pid]/maps 可以显示一个进程当前映射的内容。我看到了 0x21000,这很可能是 (33) 4k 页。这可能更好地指示了该进程当前的堆栈使用情况。然而,它可能包括除堆栈以外的其他内容,例如环境变量。


2
是的,你说得对。我定义了一个巨大的数组double[100000],然后检查了堆栈大小,它是7fffe6e97000-7fffe6f5d000,即811008字节。谢谢。 - Pkp
2
没问题。同时,请记得接受回答,如果它回答了你的问题。你的接受率为43%,对于未来的回答者来说并不鼓舞人心。 - Jonathon Reinhart

2

当进程启动时,Linux并不会为堆栈提交整个rlimit大小。它仅仅保留这么多虚拟地址空间(以便其他mmap等不能阻止堆栈的增长),并且让堆栈动态增长到限制。然而,默认提交的堆栈大小似乎也是128k或132k,具体取决于系统,并且我不知道如何调整/优化它。


0

RLIMIT_STACK 指定了您的堆栈可以增长的最大限制。现在您的堆栈大小为 132 KB。如果您使用了更多的自动变量,您在 /proc/pid/maps 中看到的堆栈大小将会更大。


需要更多的自动变量。实际上最多只有4k在使用;132k是程序启动时预先分配的任意数量。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接