进程的驻留内存增加但没有主要页面错误

时间:2016-11-29 11:31:23

标签: memory-management malloc page-fault

我创建了一个bellow小c程序,它使用malloc()分配50Mb内存,然后使用循环“触摸”每个页面以使其驻留。

int main ()
{
  // Map 50M to RAM
  unsigned char *p = malloc(52428800);
  sleep(5);

  // Touch every page 
  for (int i = 0; i< 52428800; i+=4096)
    p[i] = 1;    
  sleep(100000);
}

实际上程序似乎有效,这意味着在第一个5秒睡眠之后,“top command”输出上的常驻内存开始填满并最终将所有虚拟内存分配给RAM。

PID   %MEM    VIRT    RES   CODE    DATA   SHR                                             
32486  0.6   55396   52360     4   51528   1104   

我注意到程序的页面错误,只有很小的错误:

ps -ef -o min_flt,maj_flt 32486 

MINFL  MAJFL
12879      0

不应该出现重大页面错误吗?据我所知,当我使用malloc()时,会创建一个50Mb的虚拟地址空间。在每个虚拟页面上预先写入,实际的住宅大小非常小,但之后等于所请求的虚拟内存。

当我“触摸”页面(为了使它们居住),然后每个页面从磁盘移动到DRAM,对吧?为什么没有任何重大页面错误呢?

另外,当你使用malloc()50米并且注意到住宅大小时,只有几千字节,其余页面在哪里?他们在磁盘上吗?

1 个答案:

答案 0 :(得分:0)

操作系统可以创建需求零页面以支持您的malloc调用。你在这里做了一件事来强制从磁盘读取。

您可能希望在修改页面后尝试第二个循环,以查看是否会导致页面错误。