我有一个关于使用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
在我的程序中,我想使用更大的堆栈大小来防止堆栈溢出;我想在这里确认的是,通过使用大的堆栈大小,我不会消耗更多的物理内存,只会消耗更大的虚拟地址。这是对的吗?
答案 0 :(得分:0)
如果您需要更大的堆栈大小以防止溢出,这意味着在某些时候您实际上使用更大的大小(即,您的堆栈将比默认允许的更深) )。
在这种情况下,您的程序会因默认堆栈大小而崩溃,而在此位置则会将另一个页面分配给其地址空间。因此,从某种意义上说,可以使用更多的物理内存。
分配给您的进程的页面一次实际驻留在内存中,但是,取决于您的操作系统,内存压力,其他进程等。