如何模拟重用的内存

时间:2015-03-29 20:41:27

标签: c linux memory memory-management lru

我需要进行一项实验来演示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)。

所以我的问题是双重的,

  1. 我是否正确理解了Linux驱逐政策?例如,页面必须处于非活动状态,以便OS将其驱逐出去。
  2. 是否有标准(或常用)工具来模拟记忆竞争环境?

1 个答案:

答案 0 :(得分:0)

在Linux中,当你的进程抓取一个新页面时,它被映射到零页面。只有当你写一些东西时才会导致页面错误。在执行malloc之后和开始循环之前尝试写入所有页面。