0

我创建了下面的小型 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 命令”输出上的常驻内存开始填满并最终将所有虚拟内存分配给 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() 50m 并且你注意到住宅大小时,只有几个 KB,其余页面在哪里?它们在磁盘上吗?

4

1 回答 1

0

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

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

于 2016-11-29T16:18:14.403 回答