pthread的堆栈大小如何影响内存使用?

时间:2015-03-26 15:13:41

标签: c pthreads libc

我有一个关于使用pthread_attr_setstacksize()设置pthread的堆栈大小的问题:

根据我的理解,pthread的堆栈位于其创建过程的匿名mmapped区域。当我将线程的堆栈大小设置为5M& 8M分别,我看到它确实会影响mmapped区域的大小,但它们都使用(几乎)相同数量的物理内存:

pmap命令的部分结果[堆栈大小为5M]:

  

00007f97f8b52000 7172K rw --- [anon]

pmap命令的部分结果[堆栈大小为8M]:

  

00007f8784606000 10244K rw --- [anon]

top命令的部分结果[堆栈大小为5M]:

  

VIRT RES SWAP USED

 25160   7236      0   7236

top命令的部分结果[堆栈大小为8M]:

  

VIRT RES SWAP USED

 22088   7196      0   7196

在我的程序中,我想使用更大的堆栈大小来防止堆栈溢出;我想在这里确认的是,通过使用大的堆栈大小,我不会消耗更多的物理内存,只会消耗更大的虚拟地址。这是对的吗?

1 个答案:

答案 0 :(得分:0)

如果您需要更大的堆栈大小以防止溢出,这意味着在某些时候您实际上使用更大的大小(即,您的堆栈将比默认允许的更深) )。

在这种情况下,您的程序会因默认堆栈大小而崩溃,而在此位置则会将另一个页面分配给其地址空间。因此,从某种意义上说,可以使用更多的物理内存。

分配给您的进程的页面一次实际驻留在内存中,但是,取决于您的操作系统,内存压力,其他进程等。