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

时间:2015-04-24 14:23:26

标签: c memory memory-management kernel microbenchmark

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

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

答案 1 :(得分:-2)

只需动态分配大量空间而不使用它就可以占用大量内存。用C ++编写的IE可以做到

int *foo = new int[10000000];

哪个只会吃掉40MB(假设你的int是4个bty)并且不做任何事情。这样做几次(你可能需要在几个过程中分散它)并且你会快速吃掉你的RAM。