【问题标题】:How to simulate a heavy used memory如何模拟大量使用的内存
【发布时间】: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)。

所以我的问题是双重的,

  1. 我是否正确理解 Linux 驱逐策略?例如,页面必须处于非活动状态多长时间才能让操作系统将其逐出。
  2. 是否有标准(或常用)工具来模拟内存竞争环境?

【问题讨论】:

    标签: c linux memory memory-management lru


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-10-16
      • 2014-06-30
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 2022-08-23
      • 2010-12-27
      相关资源
      最近更新 更多