【问题标题】:stack size from proc/pid/maps in C来自 C 中 proc/pid/maps 的堆栈大小
【发布时间】:2012-04-08 14:45:58
【问题描述】:

我从 /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);
}

输出: 堆栈限制 = 8388608 和 -1 最大值

我得到堆栈限制 = 8388608,最大为 8MB。

【问题讨论】:

  • 我有点惊讶它这么大,因为你在堆栈上只有一个struct rlimit。 ;-) 猜猜它还有一些增长空间......打印limit 的地址来看看堆栈有多少增长空间会很有趣。

标签: c stack


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    rlim_cur 是对该进程的堆栈可以增长到什么的“软限制”。它不是当前堆栈使用情况的指标。来自man page

    每个资源都有一个关联的软限制和硬限制,由 rlimit结构:

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

    软限制是内核强制执行的值 对应的资源。硬限制是软限制的天花板 限制:非特权进程只能将其软限制设置为一个值 在从 0 到硬限制的范围内,并且(不可逆地)降低其 硬限制。

    /proc/[pid]/maps 另一方面,向您显示该进程当前映射的内容。我看到 0x21000 最有可能是 (33) 4k 页。这可能是您当前对该进程的堆栈使用情况的更好指标。但是,它可能包括堆栈以外的其他内容,例如环境变量。

    【讨论】:

    • 是的,你是对的。我定义了一个巨大的数组 double[100000],然后检查堆栈大小,它是 7fffe6e97000-7fffe6f5d000,即 811008 字节。谢谢
    • 没问题。另外,如果它回答了您的问题,请记住接受一个答案。您 43% 的接受率对于未来的回答者来说并不是很令人鼓舞。
    【解决方案3】:

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

    【讨论】:

    • 它需要更多的自动变量。实际使用的可能最多 4k; 132k 是在程序启动时预先提交的任意数量。
    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2013-02-05
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多