对于我在Linux Kernel上的课程项目,我需要模拟由于内存不足而导致大量页面交换的情况。
我想编写一个需要大量物理内存的程序,因此该程序访问的页面必须多次交换进出。
答案 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。