C中proc/pid/maps的堆栈大小

  • 本文关键字:堆栈 pid proc maps c stack
  • 更新时间 :
  • 英文 :


我在linux-64位的/proc/pid/maps中看到了一个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 maxn", limit.rlim_cur, limit.rlim_max);
}

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

我得到的Stack Limit=8388608,最高可达8MB。

rlim_cur是该进程的堆栈可以增长到的"软限制"。它不是当前堆栈使用情况的指标。从man页面:

每个资源都有一个相关的软限制和硬限制,由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页。这可能是该进程当前堆栈使用情况的更好指标。但是,它可能包括堆栈以外的内容,例如环境变量。

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

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

最新更新