我已经创建了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()时,创建了一个虚拟地址空间。在每个虚拟页面上编写事先,实际的驻留大小很小,但是之后等于所请求的虚拟内存。
当我"触摸"页面(为了使它们居住)时,每个页面都会从磁盘转移到DRAM,对吗?为什么没有任何重大页面错误?
另外,当您使用50m的malloc(),并且您注意到居住尺寸时,只有几个kbytes,其余页面在哪里?他们在磁盘上吗?
操作系统可以创建需求零页面以支持您的malloc呼叫。您在这里做了一些事情,以强迫磁盘阅读。
修改页面后,您可能想尝试第二个循环以查看是否导致页面故障。