我需要模拟一种情况,即因内存不足而出现大量页面交换的情况,以便进行有关Linux内核的课程项目。
我想编写一个需要大量物理内存的程序,这样由此程序访问的页面将被多次交换进和交换出。
我需要模拟一种情况,即因内存不足而出现大量页面交换的情况,以便进行有关Linux内核的课程项目。
我想编写一个需要大量物理内存的程序,这样由此程序访问的页面将被多次交换进和交换出。
首先,您需要分配一个比RAM大小更大的缓冲区。我希望您正在运行64位操作系统或已启用PAE。如果您有4GB的RAM,则需要类似以下的东西:
double* pBigArray = (double*)malloc(sizeof(double) * 536870912);
// You actually need more than that. This is just 4GB.
double lfBigChecksum = 0.0;
while (true)
{
int iIndex = rand() % BUFFER_SIZE;
lfBigChecksum += pBigArray[iIndex];
}
如果您有一个8GB的数组和4GB的RAM,那么一半的读取将会是页面错误(并且会从硬盘中的交换空间中获取)。
malloc(4294967296ULL);
。 - selbiemalloc
会立即放弃并返回NULL。他可以在一个循环中分配100MB,直到malloc返回NULL。如果需要,在32位上可以有多个程序实例运行以强制页面交换。 - selbierand()
只返回0-0x7fffffff之间的值。我猜如果他使用双数组而不是像我想的那样使用字符数组,这个问题就会隐式地解决。但是他可以在循环中这样说:size_t iIndex = rand()|(((size_t)rand())<<8) % BUFFER_SIZE;
- selbie你可以通过动态分配大量空间并不使用它来消耗大量内存。例如在C++中,你可以这样做:
int *foo = new int[10000000];
这将会占用40MB的内存(假设你的int
是4个字节),但并不会对其进行任何操作。如果多次执行此操作(可能需要在几个进程中分散执行),那么你的RAM将很快被耗尽。
while(true)
)。 - David says Reinstate Monicaint *foo = malloc(10000000);
分配了动态内存。然而,我的RSS只有356 KB(由/proc/$pid/status
报告)。 - Neo