Как сэкономить место с помощью перевернутых таблиц страниц?
Зачем нам экономить память, если мы используем инвертированные таблицы страниц для сопоставления виртуальных адресов с физическими? Например, если у нас есть два процесса, каждый из которых имеет 4 страницы, у нас будет 8 записей в двух разных таблицах, указывающих с виртуального на физический адрес:
Process 1:
[0] = 1
[1] = 5
[2] = 63
[3] = 0
Process 2:
[20] = 14
[21] = 55
[22] = 11
[25] = 9
Если бы мы использовали перевернутые таблицы страниц, у нас была бы только одна большая таблица, указывающая на нее наоборот. Но по размеру они равны.
2) Inverted page table
[0] = <p1 | 3>
[1] = <p1 | 0>
[5] = <p1 | 1>
[9] = <p2 | 25>
[11]= <p2 | 22>
[14]= <p2 | 20>
[55]= <p2 | 21>
[63]= <p1 | 2>
3 ответа
Таблица страниц в первом случае представляет собой структуру данных для каждого процесса. Каждый процесс имеет указатель на свою собственную таблицу страниц, этот указатель загружается в регистр%CR3, когда процесс запланирован. Также он сохраняется, когда переключается контекст. с другими регистрами.
Но инвертированная хеш-таблица - это глобальная структура данных. ОС, использующая этот метод, будет использовать некоторый механизм блокировки для предоставления доступа только к одному процессу в данный момент времени (представьте, что 2 процесса на 2 ядрах обращаются к глобальным данным одновременно).
Предполагая 4 ГБ оперативной памяти на каждый процесс и размер страницы 4096. В первом случае каждый процесс имеет 4 ГБ /4096 (без записей в таблице страниц * размер каждой записи таблицы страниц), и все это будет занимать место для каждого процесса, который создается / разветвляется. Общая память, используемая для отображения виртуальной памяти на физическую, представляет собой общую сумму размера таблицы страниц всего процесса. Это более простой подход, поскольку при каждом переключении контекста вы будете изменять только указатель, ничего сложного.
Во втором случае у вас будет одна таблица только с 4 ГБ /4096 записей, поэтому пространство сохраняется, но управление памятью становится сложным, так как это глобальные данные, вам придется добавлять больше информации в каждую запись, рассказывающую, как текущий владелец есть (как вы показали) и т. д. MMU/OS должна заботиться о синхронизации.
Но приведенный вами пример не является точным: в реальной системе с таблицей страниц для каждого процесса можно получить доступ ко всему адресу, в вашем случае процесс p1 имеет 4 страницы, а p2 - другой набор страниц. В действительности оба процесса могут получить доступ к одному и тому же виртуальному адресу, сопоставленному с различным физическим фреймом. Таким образом, каждая таблица должна содержать 8 записей.
Таблица страниц должна быть в одном блоке (вы получаете страницы как в массиве). Вы получаете 2 вещи из перевернутого стола.
Таблица dir становится меньше, например, вместо размера таблицы 2^20 и смещения 2^12, вы получите размер таблицы 2^10.
Тогда вместо получения (2^20) * (2^2) байтов памяти для таблицы страниц, большинство страниц будет отображаться на диске, и вы будете размещать их только в том случае, если они нужны процессу.
В вашем случае вместо всего процесса будет таблица страниц размером 2^20 * 2^2 байта, у вас будет только 2^10 * 2^2 байта для таблицы dir и еще один 2^10 * 2^2 байта для таблицы страниц. это большая разница, вместо 2 ^ 22 байтов, у вас есть 2^13.
Надеюсь это было понятно.
Таблица инвертированных страниц меньше, потому что ее размер зависит от размера памяти, а не от размера виртуального адресного пространства. Если виртуальное адресное пространство 2^48, вы можете иметь 2^36 записей таблицы страниц на процесс.
При использовании перевернутых таблиц страниц количество записей в таблице страниц зависит только от объема памяти. Скажем, у вас есть 4 ГБ памяти, тогда ваша таблица перевернутых страниц будет иметь 2^32 - 2^12 = 2^20 записей. Это для любого количества процессов тоже.