如何编写简单的"页面错误生成器"?

Neo*_*Neo 4 c memory kernel memory-management microbenchmark

对于我在Linux Kernel上的课程项目,我需要模拟由于内存不足而导致大量页面交换的情况.

我想编写一个需要大量物理内存的程序,因此该程序访问的页面必须多次交换.

VAn*_*rei 5

首先,首先需要分配一个大于RAM大小的缓冲区.我希望你在64位操作系统上运行或启用PAE.如果让我们说4GB的RAM,你需要这样的东西:

double* pBigArray = (double*)malloc(sizeof(double) * 536870912); 
// You actually need more than that. This is just 4GB.
Run Code Online (Sandbox Code Playgroud)

现在,只有一个大于RAM大小的阵列是不够的.重要的是你如何访问它.如果您只是连续读取元素,CPU中的硬件预取程序会将程序读取的一些数据带入缓存中.

要生成许多页面错误,您需要从不在RAM中的地址读取.

要做到这一点,这是一个简单的方法,通过随机读取数组:

double lfBigChecksum = 0.0;
while (true)
{
   int iIndex = rand() % BUFFER_SIZE;
   lfBigChecksum += pBigArray[iIndex];
}
Run Code Online (Sandbox Code Playgroud)

如果你有一个8GB和4GB的RAM阵列,那么一半的读取将是页面错误(并从硬盘中的交换空间提供).