Операционные системы. Учебное пособие. Марапулец Ю.В. - 111 стр.

UptoLike

Составители: 

Функция VirtualAlloc не может зарезервировать более 1 Гб памяти, поскольку про-
цесс контролирует только нижнюю половину своего адресного пространства объемом 2
Гб. В действительности объем контролируемой памяти еще меньше из-за свободных об-
ластей (по 64 Кб каждая) на границах адресного пространства процесса (рис. 8.2). Кроме
того, функция VirtualAlloc резервирует память фрагментами по 64 Кб, а закрепляет ее
фрагментами объемом в одну страницу. При резервировании памяти функция VirtualAl-
loc округляет аргумент lpvAddress до ближайшего значения, кратного 64 Кб. При закре-
плении памяти функция VirtualAlloc осуществляет одно из двух действий. Если аргу-
мент lpvAddress имеет значение NULL, функция VirtualAlloc округляет значение
аргумента dwsize до ближайшей границы между страницами. Если значение аргумента
lpvAddress не равно NULL, она закрепляет все страницы, содержащие хотя бы один байт
информации в диапазоне адресов от lpvAddress до lpvAddress + dwSize. Например, если
при выделении двух байтов памяти заданный адрес пересекает границу двух страниц,
закрепляются две целые страницы. В большинстве систем Windows 98 размер страницы
составляет 4 Кб, но если вы хотите проверить это значение, вызовите функцию GetSys-
temInfo.
По завершении процесса система автоматически освобождает использовавшуюся
им память. Освободить память, не дожидаясь окончания процесса, позволяет функция
VirtualFree.
BOOL VirtualFree (LPVOID lpvAddress, // адрес освобождаемого блока
DWORD dwSize, // размер освобождаемого блока
DWORD fdwFreeType ); // перевести в резерв или освободить
Функция VirtualFree отменяет закрепление набора страниц, оставляя их адреса за-
резервированными, или полностью освобождает память, занимаемую этими страницами.
Закрепление можно отменять маленькими блоками, содержащими как зарезервирован-
ные, так и закрепленные страницы.
При освобождении зарезервированных адресов необходимо очищать весь выде-
ленный блок, причем все страницы этого блока должны находиться в одинаковом со-
стоянии - либо в закрепленном, либо в зарезервированном. Аргумент lpvAddress должен
содержать базовый адрес, возвращенный функцией VirtualAlloc. Значение аргумента
dwSize игнорируется, поскольку сразу освобождается весь выделенный диапазон: Аргу-
мент dwSize учитывается лишь при отмене закрепления отдельных фрагментов. Аргу-
мент fdwFreeType может принимать следующие значения:
MEM_RELEASE - освободить зарезервированный регион. При использовании этого
флага параметр dwSize должен быть равен нулю.
MEM_DECOMMIT - Освободить выделенную память.
В программах, где используются команды для работы с виртуальной памятью,
должен быть предусмотрен механизм "сбора мусора", обеспечивающий освобождение
страниц, которые становятся пустыми. В качестве такого механизма может применяться
низкоприоритетный поток, который время от времени просматривает выделенную об-
ласть и ищет пустые страницы.
Для изменения атрибутов защиты регионов используются функции VirtualProtect и
VirtualProtectEx. Причем, первая позволяет изменять атрибуты защиты в адресном про-
странстве текущего процесса, а вторая -произвольного. Рассмотрим подробнее функцию
VirtualProtect.
BOOL VirtualProtect (LPVOID lpvAddress, // адрес защищаемого блока
DWORD dwSize, // размер защищаемого блока
DWORD fdwNewProtect, // новые флаги защиты
113
      Функция VirtualAlloc не может зарезервировать более 1 Гб памяти, поскольку про-
цесс контролирует только нижнюю половину своего адресного пространства объемом 2
Гб. В действительности объем контролируемой памяти еще меньше из-за свободных об-
ластей (по 64 Кб каждая) на границах адресного пространства процесса (рис. 8.2). Кроме
того, функция VirtualAlloc резервирует память фрагментами по 64 Кб, а закрепляет ее
фрагментами объемом в одну страницу. При резервировании памяти функция VirtualAl-
loc округляет аргумент lpvAddress до ближайшего значения, кратного 64 Кб. При закре-
плении памяти функция VirtualAlloc осуществляет одно из двух действий. Если аргу-
мент lpvAddress имеет значение NULL, функция VirtualAlloc округляет значение
аргумента dwsize до ближайшей границы между страницами. Если значение аргумента
lpvAddress не равно NULL, она закрепляет все страницы, содержащие хотя бы один байт
информации в диапазоне адресов от lpvAddress до lpvAddress + dwSize. Например, если
при выделении двух байтов памяти заданный адрес пересекает границу двух страниц,
закрепляются две целые страницы. В большинстве систем Windows 98 размер страницы
составляет 4 Кб, но если вы хотите проверить это значение, вызовите функцию GetSys-
temInfo.
      По завершении процесса система автоматически освобождает использовавшуюся
им память. Освободить память, не дожидаясь окончания процесса, позволяет функция
VirtualFree.

BOOL VirtualFree (LPVOID lpvAddress,           // адрес освобождаемого блока
            DWORD dwSize,                      // размер освобождаемого блока
            DWORD fdwFreeType );               // перевести в резерв или освободить

      Функция VirtualFree отменяет закрепление набора страниц, оставляя их адреса за-
резервированными, или полностью освобождает память, занимаемую этими страницами.
Закрепление можно отменять маленькими блоками, содержащими как зарезервирован-
ные, так и закрепленные страницы.
      При освобождении зарезервированных адресов необходимо очищать весь выде-
ленный блок, причем все страницы этого блока должны находиться в одинаковом со-
стоянии - либо в закрепленном, либо в зарезервированном. Аргумент lpvAddress должен
содержать базовый адрес, возвращенный функцией VirtualAlloc. Значение аргумента
dwSize игнорируется, поскольку сразу освобождается весь выделенный диапазон: Аргу-
мент dwSize учитывается лишь при отмене закрепления отдельных фрагментов. Аргу-
мент fdwFreeType может принимать следующие значения:
MEM_RELEASE - освободить зарезервированный регион. При использовании этого
флага параметр dwSize должен быть равен нулю.
MEM_DECOMMIT - Освободить выделенную память.
      В программах, где используются команды для работы с виртуальной памятью,
должен быть предусмотрен механизм "сбора мусора", обеспечивающий освобождение
страниц, которые становятся пустыми. В качестве такого механизма может применяться
низкоприоритетный поток, который время от времени просматривает выделенную об-
ласть и ищет пустые страницы.
      Для изменения атрибутов защиты регионов используются функции VirtualProtect и
VirtualProtectEx. Причем, первая позволяет изменять атрибуты защиты в адресном про-
странстве текущего процесса, а вторая -произвольного. Рассмотрим подробнее функцию
VirtualProtect.

BOOL VirtualProtect (LPVOID lpvAddress,              // адрес защищаемого блока
                    DWORD dwSize,                    // размер защищаемого блока
                    DWORD fdwNewProtect,             // новые флаги защиты


                                         113