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

UptoLike

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

На данном рисунке:
Virtual Memory API - набор функций, позволяющих приложению работать с вирту-
альным адресным пространством: назначать физические страницы блоку адресов и
освобождать их, устанавливать атрибуты защиты.
Memory Mapped File API - набор функций, позволяющий работать с файлами, ото-
бражаемыми в память. Новый механизм, предоставляемый Win32 API для работы с
файлами и взаимодействия процессов.
Heap Memory API - набор функций, позволяющих работать с динамически распре-
деляемыми областями памяти (кучами).
Local, Global Memory API - набор функций работы с памятью, совместимых с 16-
битной Windows. Следует избегать их использования.
CRT Memory API - функции стандартной библиотеки языкаСпериода исполнения
(runtime).
Рассмотрим более подробно первых три интерфейса API, поскольку они применя-
ются в настоящее время наиболее часто.
4.4.1. API-функции для обеспечения работы с виртуальной памятью
Блок адресов в адресном пространстве процесса может находиться в одном из трех
состояний [4]:
1. Выделен (committed) - блоку адресов назначена физическая память либо часть файла
подкачки.
2. Зарезервирован (reserved) - блок адресов помечен как занятый, но физическая память
не распределена.
3. Свободен (free) - блок адресов не выделен и не зарезервирован.
Резервирование и выделение памяти производится блоками. Начальный адрес бло-
ка должен быть выровнен на границу 64K (округляется вниз), а размер кратен размеру
страницы (округляется вверх). При выделении память обнуляется.
Для резервирования региона памяти в адресном пространстве процесса или выде-
ления ее используется функция VirtualAlloc, а для освобождения - функция VirtualFree.
Функция VirtualAlloc является базовой при выполнении операций управления вир-
туальным адресным пространством. Параметры этой функции определяют, какой объем
памяти необходимо выделить, в каком месте адресного пространства должен распола-
гаться выделенный фрагмент, закреплять ли за ним физическую память и какой вид за-
щиты следует установить. Функция возвращает адрес выделенного региона или NULL в
случае неудачи.
LPVOID VirtualAlloc ( LPVOID lpvAddress, // адрес для размещения нового блока
DWORD dwSize, // размер нового блока
DWORD fdwAllocationType,// зарезервировать адреса или закрепить
// физическую память
DWORD fdwProtect ); // нет доступа, только чтение
// или чтение/запись
Функция VirtualAlloc сначала пробует найти область свободных адресов размером
dwSize байтов, которая начинается с адреса lpvAddress. Для этого она просматривает де-
рево VAD. Если необходимая область памяти свободна, функция возвращает значение
lpvAddress. В противном случае она просматривает все адресное пространство и ищет
свободный блок памяти достаточного размера. При обнаружении такого блока функция
возвращает его начальный адрес, иначе - значение NULL.
111
     На данном рисунке:
• Virtual Memory API - набор функций, позволяющих приложению работать с вирту-
   альным адресным пространством: назначать физические страницы блоку адресов и
   освобождать их, устанавливать атрибуты защиты.
• Memory Mapped File API - набор функций, позволяющий работать с файлами, ото-
   бражаемыми в память. Новый механизм, предоставляемый Win32 API для работы с
   файлами и взаимодействия процессов.
• Heap Memory API - набор функций, позволяющих работать с динамически распре-
   деляемыми областями памяти (кучами).
• Local, Global Memory API - набор функций работы с памятью, совместимых с 16-
   битной Windows. Следует избегать их использования.
• CRT Memory API - функции стандартной библиотеки языка “С” периода исполнения
   (runtime).
     Рассмотрим более подробно первых три интерфейса API, поскольку они применя-
ются в настоящее время наиболее часто.

     4.4.1. API-функции для обеспечения работы с виртуальной памятью

     Блок адресов в адресном пространстве процесса может находиться в одном из трех
состояний [4]:
1. Выделен (committed) - блоку адресов назначена физическая память либо часть файла
   подкачки.
2. Зарезервирован (reserved) - блок адресов помечен как занятый, но физическая память
   не распределена.
3. Свободен (free) - блок адресов не выделен и не зарезервирован.
     Резервирование и выделение памяти производится блоками. Начальный адрес бло-
ка должен быть выровнен на границу 64K (округляется вниз), а размер кратен размеру
страницы (округляется вверх). При выделении память обнуляется.
     Для резервирования региона памяти в адресном пространстве процесса или выде-
ления ее используется функция VirtualAlloc, а для освобождения - функция VirtualFree.
     Функция VirtualAlloc является базовой при выполнении операций управления вир-
туальным адресным пространством. Параметры этой функции определяют, какой объем
памяти необходимо выделить, в каком месте адресного пространства должен распола-
гаться выделенный фрагмент, закреплять ли за ним физическую память и какой вид за-
щиты следует установить. Функция возвращает адрес выделенного региона или NULL в
случае неудачи.

LPVOID VirtualAlloc ( LPVOID lpvAddress,  // адрес для размещения нового блока
                   DWORD dwSize,          // размер нового блока
                   DWORD fdwAllocationType,// зарезервировать адреса или закрепить
                                          // физическую память
                   DWORD fdwProtect );    // нет доступа, только чтение
                                          // или чтение/запись

     Функция VirtualAlloc сначала пробует найти область свободных адресов размером
dwSize байтов, которая начинается с адреса lpvAddress. Для этого она просматривает де-
рево VAD. Если необходимая область памяти свободна, функция возвращает значение
lpvAddress. В противном случае она просматривает все адресное пространство и ищет
свободный блок памяти достаточного размера. При обнаружении такого блока функция
возвращает его начальный адрес, иначе - значение NULL.


                                         111