Определение размера таблицы страниц для виртуальной памяти

рассмотрим систему виртуальной памяти с 38-битным виртуальным байтовым адресом, страницами 1 КБ и 512 МБ физической памяти. Каков общий размер таблицы страниц для каждого процесса на этом компьютере, предполагая, что допустимые, защищенные, грязные и используемые биты занимают в общей сложности 4 бита и что все виртуальные страницы используются? (предположим, что адреса дисков не хранятся в таблице страниц.)

3 ответов


Ну, если вопрос просто "каков размер таблицы страниц?"независимо от того, поместится ли он в физическую память, ответ можно вычислить так:

первая физическая память. Существует 512K страниц физической памяти (512M / 1K). Для представления каждой страницы требуется 19 бит. Добавьте это к 4 битам учетной информации, и вы получите 23 бита.

теперь виртуальная память. С 38-битным адресным пространством и размером страницы 10-бит (1K) вам нужно 228 записи в таблице страниц.

228 записи таблицы страниц в 23 бит каждый 6,174,015,488 бит или 736M.

Это максимальный размер, необходимый для одноуровневой подсистемы VM для каждого процесса.

теперь, очевидно, это не сработает, если у вас есть только 512m физической ОЗУ, поэтому у вас есть несколько вариантов.

  1. вы можете уменьшить количество физических страниц. Например, только Позвольте половине памяти быть предметом подкачки, сохраняя другую половину резидента в любое время. Это сэкономит один бит на запись, на самом деле недостаточно, чтобы изменить ситуацию.

  2. увеличить размер страницы если это возможно. 1K-страница в 38-битном адресном пространстве является причиной очень коротких таблиц страниц. Например, я думаю, что '386, с его 32-битным адресным пространством, использует 4K-страницы. Это привело бы к миллиону записей в таблице страниц, намного меньше, чем 260 здесь требуется миллион.

  3. перейти на многоуровневый. Немного более продвинутый, но это в основном означает, что сами таблицы страниц, подлежат подкачки. Вы должны сохранить первый уровень таблиц страниц в физической памяти, но второй уровень может входить и выходить по мере необходимости. Это значительно снизит физические требования, но за счет скорости, так как могут возникнуть два уровня ошибок страницы, чтобы получить фактическую страницу процесса (один для вторичных таблиц подкачки, а другой для страница процесса).


давайте посмотрим немного ближе на Вариант 3.

Если мы разрешим 32M для основной таблицы подкачки и дадим каждой записи 4 байта (32 бита: только 23 необходимы, но мы можем округлить для эффективности здесь), это позволит 8,388,608 страниц для вторичной таблицы страниц.

поскольку каждая из этих страниц таблицы вторичных страниц имеет длину 1K (что позволяет нам хранить 256 записей таблицы вторичных страниц по 4 байта каждая), мы можем обратиться к общей сумме из 2,147,483,648 виртуальных страниц.

Это позволило бы 8,192 полностью загруженным (т. е. используя все 28-битное адресное пространство) процессам работать бок о бок, предполагая, что у вас есть справедливый кусок дискового пространства для хранения нерезидентных страниц.

теперь, очевидно, основная таблица подкачки (и подсистема VM, и, вероятно, справедливый кусок остальной части ОС) должна оставаться резидентом все время. Вы не можете разрешить страницу из одной из основных страниц, так как вам может понадобиться эта страница для того, чтобы вернуть его в :-)

но это резидентная стоимость только 32M из 512M для основной таблицы подкачки, намного лучше, чем (как минимум, для одного полностью загруженного процесса) 736M.


размер таблицы страниц= всего нет записей таблицы страниц*размер записи таблицы страниц

ШАГ 1: ПОИСК НЕТ ЗАПИСЕЙ В ТАБЛИЦЕ СТРАНИЦ:

no of page table entries=virtual address space/page size

=2^38/2^10=2^28

таким образом, в таблице страниц есть 2^28 записей

ШАГ 2: НЕТ КАДРОВ В ФИЗИЧЕСКОЙ ПАМЯТИ:

no of frames in the physical memory=(512*1024*1024)/(1*1024)=524288=2^19

нам нужен 19 bits и дополнительно 4 bits для действительных, битов предохранения, пакостных и пользы всего 23 бита=2,875 байта

size of the page table=(2^28)*2.875=771751936B=736MB

1Kb pages = 2^10, 512MB = 2^29 = > смещение = 29-10 = 19 бит.

virtual включает в себя две части: фрейм страницы + смещение => фрейм страницы + грязный бит = 38 - 19 = 29 бит. 29 бит включает 4 бит грязный (выше) => 25 бит для реального фрейма страницы, каждый фрейм страницы имеет 10 бит длиной.

Итак, размер таблицы страниц: 2^25 * 10 = 320M.

надеюсь, что это правильно.