Выполните код, подобный следующему:
for (int stride = 1; stride < maxpossiblepagesize; stride += searchgranularity) {
char* somemem = (char*)malloc(veryverybigsize*stride);
starttime = getcurrentveryaccuratetime();
for (pos = somemem; pos < somemem+veryverybigsize*stride; pos += stride) {
// iterate over "veryverybigsize" chunks of size "stride"
*pos = 'Q'; // Just write something to force the page back into physical memory
}
endtime = getcurrentveryaccuratetime();
printf("stride %u, runtime %u", stride, endtime-starttime);
}
График результатов с шагом по оси X и временем выполнения по оси Y.В шаге = размер страницы должна быть точка, где производительность больше не падает.
Это работает, вызывая ряд сбоев страниц.Как только шаг превышает размер страницы, число сбоев перестает увеличиваться, поэтому производительность программы больше не падает заметно.
Если вы хотите быть умнее, вы можете использовать тот факт, что системный вызов mprotect
должен работать нацелые страницы.Попробуйте что-нибудь поменьше, и вы получите ошибку.Я уверен, что есть и другие «дыры», подобные этому, - но приведенный выше код будет работать на любой системе, которая поддерживает подкачку страниц и где доступ к диску намного дороже, чем доступ к ОЗУ.Это была бы всякая полунормальная современная система.