Управление памятью
В системах Windows 2000 и Windows 98 применяются аналогичные методы управления памятью. По сути, в них применяются 32-разрядные указатели на адрес памяти в куче текущего процесса. Каждый процесс имеет отдельное адресное пространство памяти.
Архитектура памяти
В среде Win32 каждый процесс имеет собственное 32-разрядное виртуальное адресное пространство объемом до 4 Гбайт. Пользователю доступны 2 Гбайт в области нижней памяти (от 0x00000000 до Ox7FFFFFFF), a 2 Гбайт в области верхней памяти (от 0x80000000 до OxFFFFFFFF) зарезервированы для ядра. В усовершенствованных версиях Windows 2000 применяется иное соглашение: в них 2 Гбайт пользовательской памяти расширено до 3 Гбайт, а память ядра уменьшена до 1 Гбайт.
Адреса, используемые процессом, не соответствуют физическому расположению в памяти. Для каждого процесса ядром осуществляется преобразование виртуальных адресов в соответствующие физические адреса. Это позволяет диспетчеру памяти перемещать память и управлять ею с максимально возможной эффективностью с учетом существующих потребностей.
Адресация памяти осуществляется внутри адресного пространства процесса. Процесс не может выполнять чтение/запись за пределами своего адресного пространства (это позволяет защитить процессы друг от друга).
Глобальная память
Глобальная память распределяется из глобальной кучи процесса. Память этого типа распределяется с помощью функции GlobalAlloc, которая возвращает дескриптор памяти. В большинстве случаев этот дескриптор представляет собой указатель на распределенную память. Память распределяется в виде приватных, выделенных страниц с доступом для чтения/записи. К приватной памяти не могут получить доступ другие процессы.
С применением функции GlobalAlloc с флажком GMEM_DDESHARE в действительности нельзя распределять глобально разделяемую память, как это было в более ранних версиях Windows. Этот флажок предусмотрен для совместимости и может использоваться в некоторых приложениях для повышения производительности операций динамического обмена данными (DDE — dynamic data exchange). В приложениях, где требуется разделяемая память для других целей, могут применяться объекты отображения файла. Информация об отображениях файлов представлена в главе 17.
Функция GlobalAlloc позволяет распределить блок памяти любого размера, который может быть представлен 32 битами и может поместиться в пределах доступной памяти (включая память в файле подкачки). Распределенные объекты памяти могут быть неподвижными или перемещаемыми. Перемещаемые объекты могут быть также обозначены как отбрасываемые. С помощью виртуальной памяти в Win32 система может управлять памятью, не воздействуя на виртуальные адреса в памяти. Когда система перемещает страницу памяти, виртуальная страница процесса просто отображается в другое место. Перемещаемая память все еще применяется для распределения отбрасываемой памяти, что используется нечасто и только в тех случаях, когда приложение может легко восстановить содержимое памяти.
Виртуальная память
Виртуальное адресное пространство для каждого процесса намного превышает суммарную физическую память, доступную для всех процессов. В целях увеличения размеров памяти в системе для распределения дополнительной памяти применяется жесткий диск. Суммарный объем памяти, доступной для всех процессов, представляет собой сумму объема физической памяти и величины свободного пространства на диске, доступного для файла подкачки (файла на диске, применяемого для увеличения объема памяти). Виртуальное адресное пространство организовано в виде страниц или единиц объема памяти. Размер страницы зависит от хост-компьютера и может быть определен с помощью функции GetSystemlnfo. На компьютерах х86 размер страницы — 4 Кб.
Многие приложения удовлетворяют свои потребности в памяти с помощью функции GlobalAlloc. Однако функции виртуальной памяти предоставляют некоторые функциональные средства, недоступные при использовании функции GlobalAlloc. Они могут выполнять следующие операции.
* Резервировать диапазон виртуального адресного пространства процесса. Резервирование адресного пространства не приводит к физическому распределению памяти, но исключает возможность использования этого адресного пространства в других операциях распределения памяти.
* Выделять ряд зарезервированных страниц в виртуальном адресном пространстве процесса так, чтобы они были доступны только процессу распределения.
* Устанавливать доступ для чтения/записи, только для чтения или исключать доступ к ряду выделенных страниц. Память, распределенная с помощью функции GlobalAlloc, всегда доступна для чтения/записи.
* Освобождать ряд зарезервированных страниц.
* Отменять выделение страниц, освобождая связанную с ними физическую память.
* Блокировать одну или несколько страниц выделенной памяти в физической памяти (оперативной памяти).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.