C 何时分配静态数据(.bss)?

C 何时分配静态数据(.bss)?,c,gcc,elf,C,Gcc,Elf,我一直在研究如何减少应用程序的内存占用。根据上一个问题:我已经找到并清除了大多数最大的罪犯 nm--size sort是从可执行文件的.bss部分查找大型项目的宝贵工具 在pmap中看到的内存占用已经大幅下降。但是,在另一个系统(UbuntuPangolin,GCC4.6.3)上继续这项工作时,我注意到运行进程的内存占用是完全合理的,当然比.bss大小小得多 通过调试器运行代码,看起来在访问数据之前,.bss部分中最大的符号实际上没有被分配(即,我可以设置一个数组) 元素,并且内存占用增加了16

我一直在研究如何减少应用程序的内存占用。根据上一个问题:我已经找到并清除了大多数最大的罪犯

nm--size sort
是从可执行文件的.bss部分查找大型项目的宝贵工具

在pmap中看到的内存占用已经大幅下降。但是,在另一个系统(UbuntuPangolin,GCC4.6.3)上继续这项工作时,我注意到运行进程的内存占用是完全合理的,当然比.bss大小小得多

通过调试器运行代码,看起来在访问数据之前,.bss部分中最大的符号实际上没有被分配(即,我可以设置一个数组) 元素,并且内存占用增加了16MB)

bss部分只是零初始化的,因此很容易想象一个实现为它分配虚拟地址空间,但在使用它之前并不实际分配任何实际内存


这是行为上的真正差异,还是系统之间报告上的差异?

在Linux中,零初始化页都映射到内存中相同的“零”物理页。使用写时复制方法,当您将页写入该页的内存时,该页将被复制并重新映射到新页,从而导致应用程序的内存占用增加。正如你所怀疑的那样,这就是正在发生的事情。这适用于所有Linux发行版

这听起来很合理。我想你不知道这种情况持续多久了吧?我看到显示巨大内存占用的系统是2007年的时代(SLES 10.1)。Linux已经处理了很长一段时间这样的零页面。Linux 2.4中提供了共享的ZERO_页面,页面错误处理程序中的copy-on-write支持也是如此。