如何写一个简单的"page fault generator"?
How to write a simple "page fault generator"?
对于我关于 Linux 内核的课程项目,我需要模拟由于内存不足导致 大量页面交换 的情况。
我想编写一个需要大量物理内存的程序,因此该程序访问的页面必须多次换入换出。
您可以通过动态分配大量 space 而不使用它来消耗大量内存。 IE 在 C++ 中你可以做到
int *foo = new int[10000000];
它只会吃掉 40MB(假设您的 int
s 是 4 btyes)并且什么也不做。这样做几次(您可能需要将其分散到多个进程中),您会很快耗尽 RAM。
当然,首先你真的需要分配一个比你的 RAM 大小大的缓冲区。我希望你 运行 使用 64 位 OS 或者你启用了 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 RAM 的阵列,一半的读取将是页面错误(并从硬盘中的交换 space 提供)。
对于我关于 Linux 内核的课程项目,我需要模拟由于内存不足导致 大量页面交换 的情况。
我想编写一个需要大量物理内存的程序,因此该程序访问的页面必须多次换入换出。
您可以通过动态分配大量 space 而不使用它来消耗大量内存。 IE 在 C++ 中你可以做到
int *foo = new int[10000000];
它只会吃掉 40MB(假设您的 int
s 是 4 btyes)并且什么也不做。这样做几次(您可能需要将其分散到多个进程中),您会很快耗尽 RAM。
当然,首先你真的需要分配一个比你的 RAM 大小大的缓冲区。我希望你 运行 使用 64 位 OS 或者你启用了 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 RAM 的阵列,一半的读取将是页面错误(并从硬盘中的交换 space 提供)。