Как многоуровневая таблица страниц экономит место в памяти?
Я пытаюсь понять, как многоуровневая таблица страниц экономит память. Как я понимаю, многоуровневая таблица страниц в общей сложности потребляет больше памяти, чем одноуровневая таблица страниц.
пример: рассмотрим систему памяти с размером страницы 64KB и 32-разрядным процессором. Каждая запись в таблице страниц занимает 4 байта.
одноуровневая таблица страниц : 16 (2^16 = 64KB) биты необходимы для представления смещения страницы. Так остальные 16 битов используются для индексации в таблице страниц. Так
* размер таблицы страниц = 2^16 (#страниц) * 4 байта (размер каждой записи таблицы страниц) = 2^18 байт*
многоуровневая таблица страниц : в случае двухуровневой таблицы страниц, позволяет использовать первые 10-наиболее значимые биты для индексирования в таблицу страниц первого уровня. Следующие 10 бит для индексирования в таблицу страниц второго уровня, которая имеет номер страницы для сопоставления номеров кадров. Rest 12-bits представляет смещение страницы.
размер таблицы страниц второго уровня = 2^10 (# записей) * 4 байта(размер каждой записи) = 4 КБ
общий размер всех таблиц страниц второго уровня = 2^10 (#таблиц страниц второго уровня) * 4KB (размер каждой таблицы страниц второго уровня) = 4 MB
размер таблицы страниц первого уровня = 2^10 (#записей) * (10/8) байт (размер каждой записи) = 1.25 КБ
общая память, необходимая для хранения таблиц страниц первого и второго уровня = 4 МБ + 1.25 КБ
так нам нужно больше памяти для хранения многоуровневых таблиц на странице.
Если это так, как многоуровневые таблицы страниц экономии памяти ?
3 ответов
- в singlelevel pagetable вам нужна вся таблица для доступа даже к небольшому объему данных (меньше ссылок на память). я.е 2^20 страниц каждый Pte занимая 4байт, как вы предполагали.
пространство, необходимое для доступа к любым данным, составляет 2^20 * 4bytes = 4MB
- страницы подкачки-это многоуровневая подкачка.В многоуровневом пейджинге это более конкретно, вы можете с помощью многоуровневой организации решить, какая конкретная страница из 2^20 страниц ваших данных существует, и выбрать ее. Поэтому здесь вам нужна только эта конкретная страница, чтобы быть в памяти во время выполнения процесса.
в случае 2 уровня, который вы обсуждали, вам нужен 1-й уровень pagetable, а затем 1 из 2^10 pagetables на втором уровне. Так, Размер 1-го уровня = 2^10 * 4bytes = 4KB 2-й уровень нам нужен только 1 среди 2^10 pagetables = so размер 2^10 * 4bytes = 4KB
теперь требуется общий размер: 4KB + 4KB = 8KB.
окончательное сравнение 4MB против 8KB .
многоуровневые таблицы в первую очередь необходимы, потому что если структура памяти в Intel-land.
предположим, у вас есть 32-разрядная система, и вы разделяете адресное пространство так, чтобы верхняя часть была зарезервирована для системы, а нижняя половина-для адресов пользователей.
с таким разделением вам понадобится 2 ГБ непрерывных записей таблицы страниц в каждой таблице страниц пользователя, чтобы достичь системных адресов.
старый VAX к простому подходу к этому. Он разделил адресное пространство 4GB на 4 области (2 пользователя, 1 система, одна непригодная для использования). В трех пригодных для использования областях была своя таблица страниц.
У каждого региона была своя таблица страниц. Поскольку существует выделенное системное адресное пространство, таблицы страниц пользователей могут быть виртуальными адресами, поэтому они не требуют непрерывной памяти.
первый этап трансляции адресов была посмотреть 2 высокого порядка бит адреса для выбора таблицы страниц.
вместо того, отдельные таблицы страниц, Intel-land разбивает таблицу страниц. Это уменьшает проблемы (1), требующие непрерывной памяти для таблицы; (2) требующие, чтобы таблица страниц охватывала полное адресное пространство; (3) позволяет определять адреса ядра, которые могут быть общими для всех процессов.