我需要进行一项实验来演示Linux虚拟内存管理的LRU(最近使用过的)驱逐行为。为此,我编写了以下代码来计算页面错误(使用/usr/bin/time -v
)。它首先分配一个连续的内存块(100页),然后定期(每nanosec
个)触摸每一页1000次。
#define npage 1000
int main(int argc, char** argv)
{
int n = 1000;
int nanosec = atoi(argv[2]);
struct timespec t;
t.tv_sec = 0;
t.tv_nsec = nanosec;
char* mem = malloc(npage*4*1024);
char tmp;
int i;
int count = 0;
while(count < n){
// printf(".");
// fflush(stdout);
for (i = 0; i < npage*4096; i+=4096){
tmp = mem[i];
}
nanosleep(&t, NULL);
count ++;
}
return 0;
}
希望,nanosec
越大,页面错误就越多。但是,结果表明,无论它睡多久(最多1秒),页面错误的数量往往都是相同的。
sleep 100 ns
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 481
sleep 200 ns
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 479
/// ....
sleep 419430400 ns
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 483
sleep 838860800 ns
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 482
我猜的唯一原因是执行环境不具备内存竞争力,即1000页(4MB)相当小,其他进程的内存负载也很低,因此操作系统选择不回收它们甚至内存在相当长的时间内变为非活动状态(在这种情况下,最长的非活动时间是838860800 ns = .84 s)。
所以我的问题是双重的,
答案 0 :(得分:0)