我在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
中看到的堆栈大小会更大。