Записи таблицы страниц в виртуальной памяти - PullRequest
0 голосов
/ 18 ноября 2018

У меня простой вопрос относительно записей в таблице страниц. Предположим, что нам дан 32-битный виртуальный адрес со страницей 4 КиБ и объемом физической памяти 2 ^ 28 бит.

Поскольку смещение страницы составляет 12 битов, у нас будет 2 ^ 20 записей таблицы страниц, которые будут отображаться в 2 ^ 16 физических фреймах. Но как это возможно для 2 ^ 20 записей для сопоставления с 2 ^ 16 записей. Там не хватило бы физических кадровых адресов. Предположим, что процесс использует все 2 ^ 20 страниц, а затем, если вся ОЗУ состоит из памяти только этого процесса, все 2 ^ 16 кадров в ОЗУ будут содержать память этого процесса. Правильно ли я сказал, что 2 ^ 4 записей таблицы страниц показывают, что он отображается на диск?

Кроме того, если процесс использует только одну таблицу страниц, то оставшиеся 2 ^ 20 - 1 записи таблицы страниц будут недействительными?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Но как это возможно, чтобы 2 ^ 20 записей отображались на 2 ^ 16 записей. Не хватило бы адресов физических кадров.

Важно понимать, что виртуальная память является «виртуальной» - это иллюзия, которая на самом деле (физически) не существует. Это позволяет ОС выполнять различные трюки, такие как:

  • пометка некоторых / множества виртуальных страниц как «неиспользуемых / не присутствующих», чтобы не тратить оперативную память, когда она не нужна (и чтобы программы получали сообщение об ошибке при попытке доступа к чему-то, что не существует - например, SIGSEGV сигнал).

  • перемещать страницы между ОЗУ и пространством подкачки, делая вид, что ОЗУ больше, чем есть на самом деле. Обратите внимание, что это не ограничивается «подкачкой места на диске» - например, это может быть память, встроенная в какое-то устройство (например, неиспользуемая память на видеокарте), память, которой нет в текущей машине (например, использование сети для хранения данных в ОЗУ другого компьютера), и это может быть ОЗУ на том же компьютере (например, если половина данных может быть сжата до половины ее размера, то «сжатие как пространство подкачки» позволит вам хранить 4 МБ данных в 3 МБ ОЗУ).

  • сделать вид, что ОЗУ было выделено путем сопоставления одной и той же страницы, заполненной нулями, и последующего ее выделения (если и только если страница записана); так что вы можете иметь большую площадь нулей (например, раздел программы «.bss»), которая почти ничего не стоит (до тех пор, пока она не записана).

  • делать вид, что файл отображается / загружается в память без выделения памяти и без загрузки файла; а затем выделяет страницы и загружает в них данные, если / когда к данным обращаются позже, а также (чтобы получить больше свободной оперативной памяти, если ОС нуждается в этом для других целей) освобождает память, если она не была изменена (зная, что вы можно просто получить его снова с диска позже, если к нему снова будет доступ)

  • отображение одних и тех же страниц оперативной памяти в несколько процессов. Например, если у вас есть 10 процессов, которые все исполняют один и тот же исполняемый файл; затем исполняемый файл может быть сохранен в ОЗУ один раз, а затем сопоставлен с кешами виртуальной файловой системы и сопоставлен с 10 различными процессами.

  • трюки "копировать на запись"; где одна и та же страница ОЗУ отображается на множество процессов (так что любой процесс может читать со страницы), а затем, если процесс записывает на страницу, ОС может выделить новую страницу и сделать копию старой страницы и заменить оригинальная (общая, только для чтения) страница с новой (не общей, доступной для записи) копией.

Если каждое виртуальное адресное пространство составляет 1 МБ, то у вас может быть 100 процессов (с 100 виртуальными адресными пространствами и 1 ГБ от общего пространства), где процессы используют (в среднем) 512 КБ виртуального адресного пространства каждый, так что похоже, что в общей сложности используется 51200 КБ виртуальной памяти; но на компьютере может быть только 64 КБ ОЗУ, тогда как оставшиеся 51136 КБ виртуальной памяти просто обман.

0 голосов
/ 19 ноября 2018

В вашем вопросе много предположений.Чтобы быть с, вы предполагаете, что записи таблицы страниц являются 32-битными.Они могут быть 64 или даже 128 битами.

Вы также предполагаете, что есть 20 битов, доступных для указания в фреймах страницы.Любая реальная система будет нуждаться в некоторых из этих битов для целей управления и защиты.

Но как это возможно для 2 ^ 20 записей для сопоставления с 2 ^ 16 записями.Там не хватило бы физических кадровых адресов.

В этом весь смысл системы виртуальной памяти.Предполагая, что у вас есть 2 ^ 20 страниц, сопоставленных с процессом, но только 2 ^ 16 физических страниц, тогда не все страницы процесса будут сопоставлены с фреймами страниц одновременно.

Am iПравильно ли сказать, что 2 ^ 4 записей таблицы страниц показывают, что она отображается на диск?

Рационально спроектированная система виртуальной памяти хранит копии всех страниц процессов на диске где-нибудь.Страницы копируются с диска в память и отображаются в адресном пространстве по мере необходимости.

...