如何确定linux中程序的当前堆栈大小?
据说每个程序的堆栈大小在linux中都是8 MB,但是当你使用时 cat / proc // mmap它显示不同的大小。
另外,如何确定关联线程的堆栈大小?既然据说线程有自己的私有堆栈呢?
答案 0 :(得分:4)
如果你只想要当前的堆栈大小,你可以在main()的顶部声明一个变量,获取它的地址,并将它与在你定义“current”的地方声明的变量的地址进行比较。差异应该是堆栈增长的大致尺寸。
如果您想知道为堆栈保留了多少内存,可以检查/ proc / [pid] / maps,其区域标记为[stack]。例如,我的atd流程有:
7fff72a41000-7fff72a56000 rw-p 00000000 00:00 0 [stack]
0175b000-0177c000 rw-p 00000000 00:00 0 [heap]
给你一个想法。
当我想知道我的程序使用的堆栈的最大大小时,朋友与我分享的一个巧妙的技巧如下。我会在这里提出它以防有人发现它有用:)
1)在main()开头附近调用的函数中,使用alloca()或非常长的数组来编写0xDEADBEEF或其他一些不太可能的常量,而不是像你期望的那样使用堆栈。当小函数返回时,该存储器将被“释放”。
2)在main的末尾,再次使用alloca()来获取一个内存区域,并通过它“搜索”你曾经用过的任何魔法常量(你可能会尝试找到其中64个的第一个块)或者某些内容可以跳过可能已经分配但只是从未使用过的内存区域,并且该指针指向最大堆栈使用情况。
不完美,但它对我正在做的事情很有用!
答案 1 :(得分:3)
正如史蒂文所建议的那样,为你的线程保留的堆栈大小与你的线程当前使用的堆栈之间存在差异。
如果您想知道为一个线程保留了多少内存,可以使用pthread属性。
pthread_attr_t attr;
size_t stacksize;
pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("%u\n", stacksize);
这将打印创建一个线程时保留的默认堆栈大小。对我而言是8 Mb。
您可以使用pthread_attr_setstacksize()更改此值,并将attr结构作为2个参数传递给pthread_create函数。
编辑:也许您还应该了解延迟分配问题。除非您在此内存空间中随处读取或写入,否则您的8 Mb虚拟空间将不会使用8Mb的物理内存空间。
答案 2 :(得分:0)
虽然在 /proc/
等中可以通过多种方式手动查询 Linux。我最近发现 stackusage 非常方便,它可以拦截线程的创建并非常准确地显示实际使用情况。也适用于单线程应用程序。