Дата: Воскресенье, 26.05.2013, 15:16 | Сообщение # 1
Группа: Удаленные
23.Управление памятью (Memory Management). Разработать программу, демонстрирующую механизмы управления виртуальной памятью.Microsoft Win32 API предоставляет набор функций, которые позволяют процессу манипулировать либо определять статус страниц виртуального адресного пространства. При этом поддерживается выполнение следующих операций:
Резервирование области виртуального адресного пространства. При резервировании адресного пространства не происходит передача физической памяти, но только предотвращается другие операции выделения памяти, которые используют указанную область. Эта операция никак не затрагивает виртуальное адресное пространство другого процесса. Резервирование памяти предовращает излишние расходы физической памяти, и предоставляют процессу возможность заранее зарезервировать адресное пространство для таких динамических структур данных, которые имеют свойство расти во времени. Для них процесс получает возможность выделять ровно столько физической памяти, сколько необходимо.
Передавать зарезервированной области виртуального адресного пространства процесса физиескую память (в RAM или на винчестере), которая доступна только вызвавшему процессу.
Указывать атрибуты чтения/записи, только чтения или отсутствия доступа для области памяти, которая имеет под собой физическую память. Это отличает функции по работе с виртуальной памятью от соответствующих стандартных функций выделения памяти, которые всегда выделяют фрагмент памяти доступом как для чтения, так и для записи.
Снимать резервирование страниц, делая область виртуальной памяти доступной для последующих операций выделения памяти вызывающим процессом.
Освобождения страниц, под которыми находилась физическая память, с соответствующим освобождением физической памяти, которая становиться доступной для последующего выделения памяти другими процессами.
Фиксирование расположения одной или нескольких страниц, под которыми расположена физическая память, в оперативной памяти (RAM), что запрещает системе перемещать указанные страницы в файл подкачки.
Получать информацию о диапазоне страниц виртуального адресного протранства вызывающего или указанного процесса.
Изменять атрибуты защиты страниц указанного диапазона, под которыми расположена физическая память, для вызывающего или указанного процесса.
Выделение виртуальной памяти Функции для работы с виртуальной памятью обращаются со страницами памяти. Эти функции используют размер страницы на текущем компьютере для округления (с избытком) указанных размеров и адресов. Функция VirtualAlloc используется для выполнения одной из следующих операций:
Резервирование одной или более свободных страниц памяти.
Передача физической памяти одной или более резервированных страницам.
Резервирование и передача физической памяти одной или более свободных страниц памяти.
Вы можете либо указать системе стартовый адрес страниц памяти, с которого вы хотели бы зарезервировать или по которому вы хотите выделить физическую память, либо предоставить системе самой определить этот адрес. Функция производит выравнивание переданного адреса на границу страниц. Зарезервированные страницы недоступны программе, но при передаче физичесокой памяти страницам вы можете указать атрибуты доступа PAGE_READWRITE, PAGE_READONLY или PAGE_NOACCESS. При передаче физической памяти странице для нее выделяется место в файле подкачки. Страница инициализируется и перемещается в оперативную память только при первой попытке чтения или записи по адресу, принадлежащему странице. Вы можете использовать обычные указатели для получения доступа к виртуальной памяти, для которой была передана физическая память постредством вызова функции VirtualAlloc. Освобождение виртуальной памяти Функция VirtualFree предназначеа для выполения одной из следующих операций:
Освобождение физической памяти, занимаемой одной или несколькими страницами. Состояние страниц изменяется на зарезервированное. Освобожденные страницы оперативной памяти становяться доступными для выделения любым процессом. Освобождение физической памяти может быть произведено для любого блока страниц.
Освобождение блока, состоящего из одной или более страниц зарезарвированной памяти, с изменением состояния страниц на свободное. Освобождение блока страниц делает их доступными для выделения процессом. Страницы могут быть освобождены только в том случае, если они предарительно были зарезервированы вызовом VirtualAlloc.
Освобождение физической памяти, занимаемой одной или несколькими страницами и снятие с этого блока резервирвания. При этом состояние страницы изменяется на свободное. Указанный блок должен содержать блоки, которые были зарезервированы путем вызова VirtualAlloc, а также блоки, которым была передана физическая память и никакие более.
После того, как блок был освобожден, или его физическая память была передана системе, вы не должны никогда обращаться к нему. Вся информация, которая находилась в блоке является навсегда потерянной. Попытка чтения или записи по адресам, приналежащих освобожденным страницам приводит к исключению нарушения доступа (access violation). Если вы нуждаетесь в информации, которая храиться в блоке, никогда не освобождайте из под него физическую память или не снимайте с него резервирование. Для того, чтобы указать, что данные в некотором диапазоне памяти долгое время не будут представлять для вас интереса, следует вызвать функция VirtualAlloc, передав ей в качестве одного из параметров флаг MEM_RESET. В этом случае указанные страницы при первом же удобном случае будут перещены в файл подкачки. Тем не менее, блок памяти можно будет использовать в дальнейшем. Работа со страницами Для того, чтобы определить размер страницы на текущем компьютере, необходимо использовать функцию GetSystemInfo Функции VirtualQuery и VirtualQueryEx позволяют получить информацию о регионе, состоящем из некольких последовательно расположенных страниц памяти, начинающихся с указанного адреса в виртуальном адресном пространстве процесса. При этом функция VirtualQuery позволяет получить информацию о памяти в вызывающем процессе, а VirtualQueryEx в указанном процессе и обычно используется для поддежки отладчиков, которые нуждаются в информации об отлаживаемом процессе. Если указанный адрес не попадает на границу страницы, то он округляется вниз до первого граничного значения. Указанный блок расширяется за счет следующих страниц, если они имеют следующие одинаковые атрибуты:
Все страницы имеют одинаковое состояние: им передана физическая память, или они зарезервированы, или они свободны.
Если начальная страница памяти не является свободной, то будет дана информация только о тех страницах, которые были зерезервированы тем вызовом VirtualAlloc, который и зарезервировал начальную страницу диапазона.
Защита доступа у всех страниц должна быть одна и та же (такая, как PAGE_READONLY, PAGE_READWRITE или PAGE_NOACCESS).
Функция VirtualLock позволяет зафиксировать одну или несколько страниц, которые имют под собой физическую память, в оперативной памяти (RAM), предотвращая сбрасвание этих страниц ситемой в файл подкачки. Эта функция гарантирует, что обращение к указанным критическим страницам пройдет без обращения к диску. Фиксирование страниц в памяти является опасным, так как оно ограничивает возможности системы по управлению памятью. Чрезмерное использование функции VirtualLock может понизить работоcпособность системы из-за частого сбрасывания страниц с выполняющимся кодом в файл подкачки. Функия VirtualUnlock снимает фиксацию с памяти, которая была зафиксирована вызовом VirtualLock. Функция VirtualProtect позволяет процессу изменить права доступа к любой странице памяти, которая имеет под собой физическую память в адресном простанстве процесса. Например, процесс может выделить страницы с доступом как для чтения, так и для записи, а после того, как он изменит в них данные, установить для них доступ только для чтения, или вообще запретить всякий к ним доступ с целью предотвратить случайную перезапись. Функция VirtualProtect обычно используется при работе с памятью, которая была выделена функцией VirtualAlloc, но она может также работать и с памятью, которая выделила любая другая функция. Однако вызов функции VirtualProtect изменяет атрибуты доступа сразу у целой странице, а указатели, которые возвращают другие функции, не обязательно выравнены по границе страницы. Функция VirtualProtectEx подобна функции VirtualProtect, за исключение того, что она позволяет менять атрибуты доступа к памяти указанного процесса. Такие изменения атрибутов доступа обычно требуются отладчикам при доступе к памяти отлаживаемого процесса.