как узнать размер страницы - PullRequest
0 голосов
/ 09 июля 2010

Мне задали этот вопрос в интервью, пожалуйста, скажите мне ответ: -

У вас нет документации по ядру. Вы только знаете, что ваше ядро ​​поддерживает подкачку страниц. Как вы найдете этот размер страницы? У вас нет флага или макроса, который мог бы сказать вам о размере страницы.

Мне дали подсказку, как вы можете использовать Время, чтобы получить ответ. Я до сих пор не имею понятия об этом.

Ответы [ 3 ]

1 голос
/ 09 июля 2010

Выполните код, подобный следующему:

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 должен работать нацелые страницы.Попробуйте что-нибудь поменьше, и вы получите ошибку.Я уверен, что есть и другие «дыры», подобные этому, - но приведенный выше код будет работать на любой системе, которая поддерживает подкачку страниц и где доступ к диску намного дороже, чем доступ к ОЗУ.Это была бы всякая полунормальная современная система.

0 голосов
/ 09 июля 2010

Какой бы ответ они не ожидали, это почти наверняка будет хрупким решением.Во-первых, у вас может быть несколько размеров страниц, поэтому любой ответ, который вы могли получить за одно небольшое выделение, может не иметь отношения к следующему выделению в несколько мегабайт (см. Такие вещи, как поддержка Large Page в Linux).

Я подозреваю, что вопрос был скорее направлен на то, чтобы увидеть, как вы подошли к проблеме, а не на окончательное решение, которое вы придумали.

Кстати, этот вопрос не о Linux, потому что у вас есть документация для этого, кака также соответствие POSIX, для которого вы просто вызываете sysconf (_SC_PAGE_SIZE).

0 голосов
/ 09 июля 2010

Мне кажется, вопрос о том, «как на самом деле работает пейджинг» Они хотят, чтобы вы объяснили влияние, которое изменение размера страницы окажет на работу системы.

Я немного заржавел, но когда страница заполнена, система начинает подкачку страниц, что замедляет все. Таким образом, вы хотите запустить что-то, что заполнит память до разных размеров, и измерить время, необходимое для выполнения задачи. В какой-то момент произойдет прыжок, когда время, затраченное на выполнение задачи, внезапно прыгнет.

Как я уже сказал, я немного заржавел от реализации этого. Но я почти уверен, что именно такой ответ они и получили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...