【发布时间】:2015-03-29 20:41:27
【问题描述】:
我需要进行一个实验来演示 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 越大,发生的页面错误越多。但是,结果表明,无论它休眠多长时间(最多 1s),缺页错误的数量都趋于相同。
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)。
所以我的问题是双重的,
- 我是否正确理解 Linux 驱逐策略?例如,页面必须处于非活动状态多长时间才能让操作系统将其逐出。
- 是否有标准(或常用)工具来模拟内存竞争环境?
【问题讨论】:
标签: c linux memory memory-management lru