gpt4 book ai didi

c - 如何模拟大量使用的内存

转载 作者:行者123 更新时间:2023-11-30 17:17:55 24 4
gpt4 key购买 nike

我需要进行一个实验来演示 Linux 虚拟内存管理的 LRU(最近最少使用)逐出行为。为此,我编写了以下代码来计算页面错误(使用/usr/bin/time -v )。它首先分配一 block 连续的内存(100 页),然后定期(每纳秒)触摸每个页面 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 驱逐政策的理解正确吗?例如,页面必须处于非事件状态多长时间,操作系统才能将其驱逐。
  2. 是否有标准(或常用)工具来模拟内存竞争环境?

最佳答案

在 Linux 中,当进程获取新页面时,它会映射到零页面。只有当你向其中写入内容时才会导致页面错误。尝试在执行 malloc 之后和开始循环之前写入所有页面。

关于c - 如何模拟大量使用的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29334591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com