我创建了一个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米并且注意到住宅大小时,只有几千字节,其余页面在哪里?他们在磁盘上吗?
答案 0 :(得分:0)
操作系统可以创建需求零页面以支持您的malloc调用。你在这里做了一件事来强制从磁盘读取。
您可能希望在修改页面后尝试第二个循环,以查看是否会导致页面错误。