Фрагмент для ознакомления
2
ВВЕДЕНИЕ
Виртуальная память - это метод управления памятью компьютера, который позволяет запускать программы, которым требуется больше оперативной памяти, чем предоставляет оперативная память компьютера, путем автоматического перемещения частей программы между основной памятью и дополнительной памятью (например, жестким диском).
Использование виртуальной памяти позволяет:
1. Освободите программиста от необходимости вручную управлять загрузкой частей программы в память и координировать использование памяти с другими программами.
2. Предоставьте программам больше памяти, чем физически установлено в системе.
3. В многозадачных системах изолирует выполняющиеся программы друг от друга, назначив им неперекрывающиеся адресные пространства.
Виртуальный ресурс - это ресурс, который предоставляет пользователю или пользовательской программе свойства, которые на самом деле не существуют. В этом случае программисту предоставляется виртуальная RAM, которая намного больше, чем вся реальная RAM, доступная в системе. Понятно, однако, что такая «ОЗУ» намного медленнее. Виртуализация ОЗУ осуществляется набором программных модулей ОС и аппаратных схем процессора и включает решение следующих задач:
1. размещение данных в запоминающих устройствах разного типа, например, часть программных кодов находится в оперативной памяти, а часть - на диске;
2. выбор технологических образов или их частей для перемещения из оперативной памяти на диск и наоборот;
3. перемещение данных между памятью и диском по мере необходимости;
4. преобразование виртуальных адресов в физические.
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ:
В Windows есть три механизма работы с памятью:
1. виртуальная память - операции с большими массивами или объектами;
2. проецируемые в память файлы - работа с большими потоками данных (обычно из файлов) и для обмена и манипулирования данными с несколькими процессами на одном компьютере;
3. кучи подходят для работы с множеством мелких объектов.
Виртуальное адресное пространство процесса
Каждому процессу назначается собственное виртуальное адресное пространство. Для 32-битных процессов размер составляет 4 ГБ. Соответственно, 32-битный указатель может быть любым числом от 0x00000000 до 0xFFFFFFFF. Таким образом, общий указатель может принимать 4294967296 значений и охватывать диапазон 4 ГБ. Для 64-битных процессов размер адресного пространства составляет 16 эксабайт, поскольку 64-битный указатель может быть любым числом от 0x00000000 00000000 до 0xFFFFFFFF FFFFFFFF и принимает 18 446 744 073 709 551 616 значений, охватывающих 16 эксабайт.
Адресное пространство разбивается на разделы
Виртуальное адресное пространство каждого процесса разбивается на разделы. Их размер и назначение зависят от конкретного ядра Windows.(табл. 1, табл. 2)
Таблица 1 - адресное пространство процесса разбивается на разделы
Таблица 2 - размер и адреса раздела пользовательского режима для процессоров с разной архитектурой
Регионы в адресном пространстве
Адресное пространство, выделенное процессу во время создания, почти полностью свободно. Поэтому, чтобы использовать какую-то его часть необходимо выделить определенные регионы через функцию VirtualAlloc. Операция выделения региона называется резервированием. При резервировании система обязательно выравнивает начало региона с учетом так называемая гранулярности распределения.
Если вы попытаетесь зарезервировать 11 КБ, система автоматически округлит указанное вами значение до большего кратного. И это означает, что x86 и x64 выделят 12 КБ, а IA-64 выделит 16 КБ. Когда зарезервированный регион становится не нужным он должен быть возвращен в общие ресурсы системы. Операция - освобождение региона - выполняется путем вызова VirtualFree функции.
Передача региону физической памяти
Чтобы использовать зарезервированную область адресного пространства вам нужно выделить физическую память и отобразить ее в этот регион. Такая операция называется передачей физической памяти. Чтобы отобразить физическую память в зарезервированный регион, вы обращаетесь к функции VirtualAlloc. Передавая физическую память регионам, нет нужды отводить ее целому региону. Можно, скажем, зарезервировать регион размером 32 Кб и отобразить физическую намять только его второй и четвертой страницам. На (рис. 1) показан пример того, как выглядит адресное пространство процесса. Из рисунка видно, что структура адресного пространства зависит от архитектуры процессора. Слева показано, что происходит с адресным пространством на процессоре x86/x64 (страницы по 4 Кб), а справа — на процессоре IA64 (страницы по 8 Кб).
Рисунок 1 - Примеры адресных пространств процессов для разных типов процессоров
Атрибуты защиты
Отдельным страницам физической памяти можно присвоить собственные атрибуты защиты (табл. 3).
Таблица 3 - Атрибуты защиты страниц памяти
Затем давайте посмотрим, что происходит, когда поток пытается получить доступ к блоку данных в адресном пространстве своего процесса. Возможен один из двух сценариев.
В первом случае данные, к которым обращается поток, находятся в ОЗУ. В этом случае процессор сопоставляет виртуальный адрес данных с физическим, и поток получает доступ к нужным ему данным.
Во втором случае данные, к которым обращается поток, находятся не в ОЗУ, а где-то в файле подкачки. Попытка доступа к данным генерирует ошибку страницы, и процессор уведомляет операционную систему об этой попытке. Затем операционная система начинает поиск свободной страницы в ОЗУ; в противном случае система будет вынуждена освободить одну из занятых страниц. Если занимаемая страница не была изменена, она просто освобождается; в противном случае сначала он копируется из основной памяти в файл подкачки. После этого система переходит к файлу подкачки, ищет в нем запрошенный блок данных и загружает этот блок в свободную страницу RAM и, наконец, отображает адрес данных в виртуальной памяти на соответствующий фактический адрес в физической памяти.
Функции виртуальной памяти позволяют напрямую зарезервировать область адресного пространства, передать в нее физическую память (из файла подкачки) и назначить любые допустимые атрибуты безопасности.
Резервирование региона в адресном пространстве
Для этого предназначена функция VirtualAlloc. С помощью этой функции можно выделить или зарезервировать страницы виртуальной памяти.
Фрагмент для ознакомления
3
1. https://docs.microsoft.com/
2. http://cplusplus.com/
3. http://www.firststeps.ru/
4. https://coderoad.ru/
5. https://vunivere.ru/
6. https://cpp.hotexamples.com/
7. Windows via C/C++. Программирование на языке Visual C++ Автор: Джеффри Рихтер, Кристоф Назар Издательство: Русская Редакция, Питер Год: 2009