Распределение виртуальной памяти
Каждая страница виртуального адресного пространства может находиться в одном из трех состояний:
- Reserved (зарезервирована) - страница зарезервирована для использования;
- Committed (передана) - для данной виртуальной страницы выделена физическая память в файле подкачки или в файле, отображаемом в память;
- Free (свободна) - данная страница не зарезервирована и не передана, и поэтому в данный момент она недоступна для процесса.
Виртуальная память может быть зарезервирована или передана с помощью вызова API-функции VirtualAlloc:
LPVOID VirtualAlloc(
LPVOID IpAddress, //Адрес резервируемой или выделяемой области.
DWORD dwSise, //Объем области.
DWORD flAllocationType, // Тип распределения.
DWORD flProtect // Тип защиты от доступа.
);
Параметр flAllocationType может принимать значения следующих констант (помимо других);
MEM_RESERVE - параметр, резервирующий область виртуального адресного пространства процесса без выделения физической памяти. Тем не менее, память может быть выделена при следующем вызове этой же функции;
МЕМ_СОММIТ - параметр, выделяющий физическую память в оперативной памяти или в файле подкачки на диске для заданного зарезервированною набора страниц.
Эти две константы могут объединяться для того, чтобы зарезервировать и выделить память одной операцией.
Разделение процедур резервирования и передачи памяти имеет некоторые преимущества. Например, резервирование памяти является очень полезной процедурой с точки зрения практичности. Если приложению требуется большой объем памяти, можно зарезервировать всю память, а выделить только ту часть, которая нужна в данный момент, раздвигая, таким образом, временные рамки более трудоемкой операции выделения физической памяти.
Управление виртуальной памятью
На рисунке 7.7 показан процесс преобразования при отображении виртуальных адресов в физические. Он называется попаданием в (физическую) страницу (page hit).
Рис.7.7 Процесс преобразования виртуальных адресов в физические (попадание)
Все виртуальные адреса делятся на три части. Самая левая часть (биты 22-31) содержит индекс каталога страниц процесса. Windows поддерживает отдельный каталог страниц для каждого процесса. Его адрес хранится в одном из регистров центрального процессора, который называется CR3. (В операцию переключения задач входит переведение CR3 в состояние, когда он указывает на каталог страниц процесса, на который осуществляя переключение.) Каталог страниц одержит 1024 четырехбайтовых элемента.
Windows поддерживает для каждого процесса совокупность таблиц страниц (page table). Каждый элемент каталога страниц содержит уникальный номер. Поэтому Windows поддерживает до 1024 таблиц страниц. ( В действительности таблицы страниц создаются только при попытке обращения к данным или коду конкретному виртуальному адресу, а не когда выделяется виртуальная память).
Следующая часть виртуального адреса (биты 12-21) используется в качестве индекса в таблице страниц, соответствующей выбранному элементу каталога страниц. Каждый элемент таблицы, соответствующий указанному индексу, содержит в 20 старших разрядах номер страничного блока, который задает конкретный страничный блок физической памяти.
Третья, и последняя, часть виртуального адреса (биты 0-11) представляет собой смещение в данном страничном блоке. Сочетание номера страничного блока и смещения дают в совокупности адрес физической памяти.
Так как каждая таблица страниц состоит из 1024 элементов и количество таблиц равно 1024, общее количество страничных блоков, которое можно определить, таким образом, будет 1024 х 1024 = 210 х 210 = 220. Так как каждый страничный блок имеет объем 4 Кб = 4 х 210 байт, то теоретический предел физического адресного пространства будет 4 х 230 = 4 Гб.
У этой довольно сложной схемы преобразования есть несколько важных преимуществ. Одно из них - очень небольшой объем страничных блоков, которые легко могут быть размещены в памяти. Гораздо легче найти непрерывный блок памяти размером 4 Кб, чем, скажем, 64 Кб.
Но основное преимущество заключается в том, что адреса виртуальной памяти двух процессов могут быть сознательно преобразованы в разные или в одни и те же физические адреса.
Предположим, что Process1 и Process2 обращаются в программе к одному и тому же виртуальному адресу. При преобразовании виртуальных адресов в физические для каждого из процессов используются их собственные каталоги страниц. Поэтому, хотя индексы в каталогах страниц одинаковы и в том, и в другом случаях, они все же представляют собой индексы из разных каталогов. Таким способом VMM может гарантировать, что виртуальные адреса каждого процесса будут преобразованы в разные физические адреса.
С другой стороны, VMM может также дать гарантию, что виртуальные адреса двух процессов, независимо от того являются ли они одинаковыми или нет, будут преобразованы в один и тот же физический адрес. Один из способов добиться этого - установить соответствующий элемент в обоих каталогах страниц на одну и ту же таблицу страниц и, следовательно, на один и тот же страничный блок. Таким образом, процессы могут совместно использовать физическую память.
Каталог и таблицы системных страниц
Нужно также упомянуть, что Windows поддерживает каталог системных страниц (system page directory) для работы с виртуальной памятью, зарезервированной Windows, так же, как и соответствующую совокупность таблиц системных страниц.
Об элементе указанной таблицы, говорят, что он является действительным (valid), если ссылается на физический страничный блок. На рисунке 7.8 изображен формат действительного элемента страниц (некоторые данные опущены).
Рис.7.8 Формат действительного элемента страниц
Обратите внимание, что элемент таблицы страниц содержит флаги, описывающие различные характеристики данного страничного блока, например, осуществлялись ли его запись и чтение, разрешен ли доступ к этой памяти из программ пользовательского режима. Самый младший разряд является битом достоверности (valid bit), называемый также битом присутствия (present bit), и указывает на то, что этот элемент действителен.
Преобразование виртуальных адресов в физические: промах
Если виртуальная страница спроецирована не на физическую память, а на файл подкачки, то процесс преобразования завершится ошибкой из-за отсутствия страницы в памяти (page fault). Эта ситуация изображена на следующем рисунке 7.8.
Рис.7.9 Процесс преобразования виртуальных адресов в физические (промах)
В данном случае система определяет, что некоторый элемент таблицы страниц не является действительным (invalid), так как бит достоверности этого элемента равен нулю Формат недействительного элемента, страница которого спроецирована на файл подкачки, показан на следующем рисунке.
|
Рис.7.10Формат элемента страниц при промахе
Для системы равенство бита достоверности нулю означает, что в этом элементе таблицы страниц содержится номер файла подкачки (в диапазоне от 0 до 15), на который спроецирован данный виртуальный адрес. Кроме того, этот же элемент содержит номер страницы внутри файла подкачки, на которую спроецирован данный виртуальный адрес. Система может затем переместить страницу файла подкачки в физическую память, изменив при этом значение бита достоверности элемента с нуля на единицу и, использовав, как и раньше, 12 разрядов виртуального адреса в качестве смещения в физическом страничном блоке. Такая процедура называется подкачкой страниц (paging).
Windows фиксирует coстояние каждой физической страницы памяти в структуре данных, называемой базой данных страничных блоков (Page Frame Database). Каждая физическая страница может находиться в одном из восьми различных стояний:
- активная, или действительная (active, valid). Страница в текущий момент отображается на виртуальную память, входя, таким образом, в рабочий набор страниц;
- переходная (transition). Страница в процессе перехода к активному состоянию;
- резервная (standby). Страница только что вышла из состояния «активная», но осталась неизменной;
- измененная (modified). Страница вышла из состояния «активная». Ее содержание, пока она находилась в указанном состоянии, было изменено, но еще не записано на диск;
- измененная незаписанная (modified no write). Страница находится в состоянии «измененная», но особо помечена как страница, содержимое которой не сброшено на диск. Используется драйверами файловой системы Windows;
- свободная (free). Страница свободна, но содержит произвольные записи и, следовательно, не может использоваться процессом;
- обнуленная (zeroed). Страница свободна и инициализирована нулями потоком нулевой страницы. Может быть выделена процессу;
- плохая (bad). В странице были отмечены ошибки четности или какие-то другие аппаратные ошибки, поэтому она не должна использоваться.
Дата добавления: 2018-11-25; просмотров: 537;