Создание (резервирование) региона и передача ему физической памяти
Для создания региона явным образом обычно используется функция VirtualAlloc (вызов ряда Win32 функций, таких, как CreateFileMapping или CreateHeap, также имеет следствием создание региона). В процессе создания региона выделяют два этапа: резервирование региона и передачу ему физической памяти (commit). Оба этапа выполняются в результате вызова VirtualAlloc и могут быть объединены.
В итоге каждая виртуальная страница может оказаться в одном из трех состояний: - -свободная (free),
-зарезервированная (reserve),
-и переданная (committed).
Резервирование региона - быстрая операция, а в последующей передаче памяти не всегда возникает необходимость; таким образом, двухэтапный процесс выделения позволяет повысить эффективность системы управления памятью. Резервирование региона предполагает выравнивание начала региона с учетом гранулярности памяти (обычно это 64 Кб). Кроме того, размер региона должен быть кратен объему страницы (4Кб для x86 процессора. Узнать размер страницы можно при помощи функции GetSystemInfo ). В случае успешного резервирования происходит коррекция дерева VAD.
Для создаваемого региона можно указать конкретный диапазон виртуальных адресов. Если этого не делать, то система просматривает виртуальное адресное пространство процесса, пытаясь найти непрерывную незарезервированную область нужного размера.
Чтобы использовать зарезервированный регион, ему нужно передать, то есть реально выделить, физическую память (физическую или внешнюю по усмотрению ОС). Нет необходимости передавать физическую память всему региону целиком. Более того, это рекомендуется делать поэтапно, по мере необходимости. Так обеспечивается экономия физической памяти. Например, сложные приложения, работающие с большими массивами данных, используют следующую стратегию. Вначале физическая память не передается. Как только происходит обращение к виртуальному адресу, под который не выделена память, она тут же выделяется. Как правило, подобные ситуации обрабатываются при помощи структурной обработки исключений.
Прогон программы выделения памяти при помощи функции VirtualAlloc
В программе, листинг которой приведен ниже, осуществляется резервирование региона размером 16 страниц виртуальной памяти и затем передача физической памяти его четвертой страницы. В верхнюю часть переданной памяти записывается строка, которая затем распечатывается. Легко убедиться, что выход за пределы переданной памяти при помощи переменной Shift приводит к ошибке исполнения. В конце регион освобождается при помощи функции VirtualFree.
#include "stdafx.h"
#include "windows.h" // win32 API
#include <locale.h> // подключение Русского языка
#include <iostream> // инструкции c++ std,cout,cin …
using namespace std; // пространство стандартных имен */
void main(void)
{
PVOID pMem = NULL;
char * String;
char * pMemCommited;
int nPageSize = 4096;
int Shift = 4080;
pMem = VirtualAlloc(0, nPageSize*16, MEM_RESERVE, PAGE_READWRITE);//резервирование 16 страниц
pMemCommited=(char *)pMem+3*nPageSize;//указатель на 4 страницу
VirtualAlloc((PVOID) pMemCommited, nPageSize, MEM_COMMIT, PAGE_READWRITE);//выделение памяти под 4 страницу
String = pMemCommited + Shift;//чтение за пределами 4 страницы
cout<< «Hello, world" << endl;
VirtualFree(String, 0, MEM_RELEASE);
}
Лекция 14. Интерфейс файловой системы
Введение
В большинстве компьютерных систем предусмотрены устройства внешней памяти большой емкости, на которых можно хранить огромные объемы данных. Чтобы повысить эффективность использования этих устройств, был разработан ряд специфичных для них структур данных и алгоритмов.
Файловая система - это часть операционной системы, назначение которой состоит в том, чтобы организовать эффективную работу с данными, хранящимися во внешней памяти и обеспечить пользователю удобный интерфейс при работе с такими данными.
В ОС Windows поддерживается представление о файле как о неструктурированной последовательности байтов. Прикладная программа имеет возможность считывать эти байты в произвольном порядке. Обычно хранение файла организовано на устройстве прямого доступа в виде набора блоков фиксированного размера. Основная задача подсистемы управления файлами - связать символьное имя файла с блоками диска, которые содержат данные файла.