Перемещаемая память


  • Как уже отмечалось, блок неперемещаемой памяти характеризуется тем, что как бы он не перемещался физически, его виртуальный адрес остается неизменным, что может привести к фрагментации виртуальной памяти.

Итак, при работе программ, которые постоянно выделяют, расширяют, освобождают память, может возникнуть потенциальная проблема фрагментации виртуальной памяти. Для решения этой проблемы можно использовать перемещаемую память.

Блок перемещаемой памяти характеризуется тем, что его виртуальный адрес может в любое время измениться даже без физического перемещения блока памяти.Блок перемещаемой памяти можно выделить при помощи функция GlobalAlloc, передавая ей в качестве первого параметра GMEM_MOVEABLE или комбинированный флаг GHND, включающий в себя флаги GMEM_ MOVEABLE и GMEM_ZEROPOINT для обнуления блока памяти.

· Флаг GMEM_MOVEABLE позволяет перемещать блок памяти в виртуальной памяти. Это не обязательно означает, что блок памяти будет перемещен в физической памяти, но адрес, которым пользуется программа для чтения и записи, может измениться.

Рассмотрим, как создается и используется блок перемещаемой памяти. Первым делом определяются указатель и переменная типа GLOBALHANDLE (описатель, селектор блока памяти):

#define N 256 . . . int *p; GLOBALHANDLE hGlobal; // указатель и описатель (неинициализированные)

Затем выделяется память, например, так:

hGlobal=GlobalAlloc(GHND, N*sizeof(int));

Перед тем, как обратиться к памяти, нужно зафиксировать блок с использованием вызова:

p=(int *)GlobalLock(hGlobal);

· Эта функция преобразует описатель памяти в указатель. Пока блок зафиксирован, Windows не изменяет его виртуальный адрес.

Доступ к i-тому элементу массива, хранящегося в блоке памяти, на который теперь ссылается p, осуществляется при помощи операции []:

. . . p[i] . . .

После работы с зафиксированным блоком с него необходимо снять фиксацию:

GlobalUnlock(hGlobal);

· Этот вызов дает Windows возможность перемещать блок в виртуальной памяти. Для того чтобы правильно осуществлять этот процесс, необходимо фиксировать и снимать фиксацию блока памяти в ходе обработки одного сообщения.

Когда нужно освободить память, следует вызвать функцию GlobalFree с параметром-описателем, а не с указателем (к этому времени с блока должна быть снята фиксация, если она производилась):

GlobalFree(hGlobal);

Блок можно фиксировать несколько раз до того, как снять с него фиксацию. Windows запоминает количество фиксаций, и каждое фиксирование требует снятия для того, чтобы дать возможность блоку перемещаться.

Перемещение блока в виртуальной памяти не есть перемещение байтов с одного места на другое - производятся только манипуляции с таблицами страниц. Единственной причиной для выделения перемещаемой памяти служит предотвращение фрагментации виртуальной памяти.

Замечание.Для того чтобы получить описатель блока памяти, на который указывает указатель p, необходимо использовать функцию:

GLOBALHANDLE hGlobal=GlobalHandle(p);

Удаляемая память

Совместно с флагом GMEM_MOVEABLE при выделении памяти можно использовать опцию GMEM_DISCARDABLE. Блок памяти, выделенный с этим флагом, может быть удален из физической памяти ядром Windows, когда необходима свободная память.

Например, блоки памяти, содержащие код, являются удаляемыми и защищенными от записи. Следовательно, быстрее загрузить код из исходного файла .exe, чем записывать его на диск, а затем вновь загружать с диска.

Если память выделяется для неизменных данных, которые могут быть легко регенерированы (обычно загрузкой из файла), то можно сделать этот блок удаляемым. О том, что данные были сброшены, можно узнать, вызвав функцию GlobalLock и получив в ответ NULL. Теперь данные можно восстановить

· Блок памяти не может быть удален до тех пор, пока счетчик фиксаций больше нуля. Для преднамеренного удаления блока памяти вызывается функция:

GlobalDiscard(hGlobal);


Дата добавления: 2017-01-26; просмотров: 984;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.