Как многоуровневая подкачка экономит память?

Меня смущает концепция многоуровневой схемы подкачки.

Пусть 32-битный виртуальный адрес и одна страница размером 4 КиБ, тогда у меня будет 2 20 страниц / записей таблицы страниц.
Пусть одна запись таблицы страниц будет иметь размер 4 байта, поэтому страница размер таблицы 2 20 * 4 байта.

Если я разделю виртуальный адрес на 10 | 10 | 12, то я понял следующее:

У меня есть каталог таблиц страниц, который индексируется 10 старшими битами виртуального адреса, поэтому он имеет 2 10 записей и указывает на 2 10 различных таблиц страниц ( то есть на уровне 2 nd).
Каждая таблица 2 уровня nd снова может быть проиндексирована (средними) 10 битами, и соответствующая запись будет содержать фактический номер кадра страницы.

Мои вопросы:

  • Это вообще правильно?
  • Одинаковы ли размеры каталога страниц и таблиц страниц?
  • Как многоуровневая схема подкачки экономит память?

person Bishnu    schedule 21.10.2015    source источник
comment
stackoverflow.com/questions/18431261/how-does -x86-paging-work /   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 27.10.2015


Ответы (1)


Ага, все правильно. Имея только один уровень таблиц страниц и 4 байта на запись, таблица страниц будет иметь

4 GiB (maximal physical address space) / 4 KiB (size of one page frame) * 4 Bytes = 4 MiB

и доступ к физическому адресу будет похож на

(page table entry)->(offset)


Чтобы уменьшить размер этой большой таблицы страниц, используется многоуровневая схема разбиения на страницы, уменьшая размер до

2^10 Bytes * 4 + 2^10 Bytes * 4 = 8 KiB

и изменение разрешения виртуального адреса на физический адрес, чтобы

(page directory entry)->(page table entry)->(offset)

Это позволяет сэкономить несколько байтов (4 MiB - 8 KiB), но имеет один недостаток: требуется одна дополнительная ссылка на память для преобразования виртуального адреса в физический. Здесь в игру вступает TLB (буфер альтернативной трансляции). Это (по сравнению с кешем L1) небольшой кэш, в котором аппаратно хранится связь виртуального адреса с физическим адресом. Здесь используется специальное оборудование, сравнимое с хеш-таблицей (std::unordered_map в стандартной библиотеке C ++), с той разницей, что оно реализовано аппаратно и, следовательно, быстрее.


Это 32-битная схема подкачки по умолчанию, используемая в архитектуре x86. x86-64, PSE, PAE, несколько измените механизм с большим количеством уровней таблиц страниц, большими размерами страниц (2 MiB, 4 MiB и даже 1 GiB) и большим физическим адресным пространством ( максимум 64 ГиБ с PAE), что приводит к большему количеству уровней таблиц страниц. Виртуальные адреса x86-64 имеют размер 48 бит, что приводит к огромному адресному пространству для каждого процесса (несколько ТиБ).


Обратите внимание на разницу между страницей и рамкой страницы. Страница - это данные, страничный фрейм - это область физической памяти, на которую отображаются страницы. Есть системы, где page's size = x * page frame's size, где x > 1.

person cadaniluk    schedule 21.10.2015
comment
спасибо за быстрый ответ! каталог страниц 1-го уровня будет иметь 2 ^ 10 записей, которые указывают на одну-одну страницы 2-го уровня, верно? то есть 2 ^ 10 количество страниц 2-го уровня !! Таким образом, общий размер должен быть (2 ^ 10 байт * 4 (размер директории страницы) + 2 ^ 10 (количество возможных таблиц 2-го уровня) * 2 ^ 10 байт * 4 (размер каждой таблицы 2-го уровня))? Пожалуйста исправьте. - person Bishnu; 21.10.2015
comment
@ashish Частично правильно. Размер таблиц страниц складывается из размера каталога страниц + размера таблицы страниц, что дает 8 КиБ при настройке x86 по умолчанию. Он не снова умножается на 2 ^ 10 байтов. - person cadaniluk; 21.10.2015
comment
Я согласен с твоей точкой зрения. Но логически, если вы думаете, что количество таблиц 2-го уровня, присутствующих в памяти, равно количеству записей в каталоге страниц. Думаю, у меня есть 2 записи в каталоге страниц для 2 процессов сравнения. Каждая запись указывает на 2 таблицы разностных страниц определенного размера. Таким образом, размер будет размером каталога страниц + размером каждой таблицы страниц (т. Е. 2). - person Bishnu; 21.10.2015
comment
@ashish Если у вас есть любимый ответ, примите его, чтобы отметить проблему как решенную. - person cadaniluk; 22.10.2015
comment
@ashish Я думаю, что ваше утверждение Думаю, у меня есть 2 записи в каталоге страниц для 2 процессов diff. У разных процессов есть свой собственный каталог страниц, после некоторого изучения я понял, что многоуровневая разбивка на страницы экономит память, потому что она не выделяет память для каждой отдельной таблицы страниц. Она выделяет память для таблицы страниц только тогда, когда это необходимо. Процессы обычно не используют все адресное пространство, поэтому выделение памяти для отображения неиспользуемого виртуального адреса, как в случае одноуровневой подкачки, является излишним. Многоуровневая подкачка экономит память, отображая только используемые виртуальные адреса. - person Farsan Rashid; 24.06.2017