我创建了下面的小型 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,其余页面在哪里?它们在磁盘上吗?