【发布时间】:2018-06-18 02:02:48
【问题描述】:
在 C 程序中有一个静态数组:
#define MAXN (1<<13)
void f() {
static int X[MAXN];
//...
}
Linux 内核能否选择在实际使用每个页面之前不将地址映射到物理内存?那么X怎么可能全是0,访问每一页时内存是否归零呢?这如何不影响程序的性能?
【问题讨论】:
-
静态内存进入
.data部分,其初始内容存在于可执行文件中。加载器处理这个,而不是内核。 -
听起来你想要的是
mmap,在Linux中带有MAP_ANONYMOUS标志,它会延迟加载。它可能无法 100% 移植到各种 Unix 版本,但它基本上可以满足您的需求。请参阅this Linux memory FAQ 了解更多信息,尤其是“什么是匿名映射?”的答案,以及Linuxmmapman page 或更友好的GNU Libc docs onmmap。 -
@ignacio:没有初始化器的静态变量需要进行零初始化。在 Unix 系统上,这通常是通过将它们放入
.bss段而不是数据段来完成的。.bss段的内容是隐含的,因此不是可执行文件的一部分。 (只有长度存在。) -
对,就是这个意思>_>
-
如果您碰巧没有访问阵列的大部分,性能会受到良好的影响。