可以懒惰地分配静态内存吗?

时间:2018-06-18 02:02:48

标签: c linux memory

在C程序中有一个静态数组:

#define MAXN (1<<13)
void f() {
    static int X[MAXN];
    //...
}

在实际使用每个页面之前,Linux内核是否可以选择不将地址映射到物理内存?那么X怎么可以满0,那么当每个页面被访问时,内存是否归零?这怎么不影响程序的性能?

2 个答案:

答案 0 :(得分:7)

  

在实际使用每个页面之前,Linux内核是否可以选择不将地址映射到物理内存?

是的,它为所有内存执行此操作(驱动程序和内核本身使用的特殊内存除外)。

  

当X访问每个页面时,如何将内存归零?

你应该忽略这个细节。只要当你访问它时内存充满了零,我们就说它充满了零。

  

这对程序的性能有何影响?

确实如此。

答案 1 :(得分:0)

  

在实际使用每个页面之前,Linux内核可以选择不将地址映射到物理内存吗?

是的,使用用户空间内存总是可以完成。

  

那么X怎么能充满0,访问每个页面时内存是否被清零了?

内核维护一个全为0的页面,当用户请求静态数组的新页面时(静态,因此在首次使用前全为0),内核将提供调零页面,而无权编写程序。写入数组会导致写时复制机制触发:发生页面错误,内核然后分配一个可写页面,将其映射并从最后一条指令(由于该页面而无法完成的那条指令)恢复程序故障)。请注意,置零优化会在此处更改实现细节,但是理论上是相同的。

  

这如何不影响程序性能?

程序不必在启动时将(可能)很多页面清零,内核实际上也不必拥有内存(只要您不要求,内存就可以请求比系统更多的内存)不用)。页面错误将在程序执行期间生成,但可以将其最小化,请参见mmap()madvise()MADV_SEQUENTIAL。请记住,Translation Lookaside Buffer不是无限的,它可以维护的条目太多。

来源:A linux memory FAQIntroduction to Memory Management in Linux by Alan Ott