Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS_l.docx
Скачиваний:
5
Добавлен:
01.12.2018
Размер:
69.76 Кб
Скачать

Механизмы управление памяти

Для работы с памяти используется 3 основных механизма:

1. Виртуальная память –используется для работы с большими объемами памяти.

2. Отображение файлов на память (используется для быстрой работы с файлом, если необходимо обрабатывать его записи в произвольном порядке, и для создания разделяемой памяти между процессами)

3. «Кучи» - механизм выделения небольших объемов памяти для приложения

Использование виртуальной памяти – для выделения региона памяти(большого объема памяти) служит функция

LPVOID VirtualAlloc(

LPVOID lpAdress,//начальный адрес выделяемого участка(выравнивается на границу 64кб, если памяти выравнивается то адрес должен выровнены на начало страницу, при первом выделения памяти имеет значени NULL)

DWORD lpSize,//размер выделяемого памяти в кб (регион), если первый параметр NULL, то будет увеличен до границы страницы

DWORD flAllcocationType,//тип операции выделения(либо одиночный или комбинаций флагов)

WORD lpProtect );

Возвращаемые значения : если успешно выполнено, то адрес памяти, если ошибки то пустое значение. С физическою памяти используется так: сначала выделяется большой регион, а потом его блок связывается с физической памятью. Связь с физической памятью производится для того участка, для которого это необходимо. При этом страницы могут находиться в состояниях: в свободном(страница не зарезервирована и не связана), зарезервированном или связанном. Если страница находится в свободном состоянии, то эта функция может зарезервировать или зарезервировать и связать. Если страница зарезервирована, то это означает, что эта страница не может использоваться другими функция и еще не имеет физического адреса. Функция может ее связать с физической памятью, но заново зарезервировать не может. Зарезервированные страницы можно освободить функцией virtualfree. Если страница находится в связанном состоянии, то

система инициализирует и загружает выделенные страницы при первой попытке доступа к заданной памяти. После завершения процесса ОС освобождает все закреплённые за ней страницы. Функция VirtualAlloc может заново связать. Физическую память, связанную с конкретными страницами, можно освободить с помощью функции vitualFree. Для долговременного хранения память лучше выделять в старших адресах. В этом случае вместо адреса начала региона задается NULL,а флаг MEM_RESERVE комбинируется с MEM_TOP_DOWN. Для резервирования под регион рекомендуется задавать атрибут защиты, наиболее общий для всего региона. Выделяя виртуальную, память можно задавать все атрибуты защиты кроме тех которые предназначены для связи с физической памятью : PAGE_WRITECOPY, PAGE_EXECUTE_WRITECOPY, PAGE_GUARD, PAGE_NOCAСHE.

Можно выделить не весь участок физической памяти, только часть. Если размер выделяемой памяти совпадет с размером связанной памяти то можно не 2 раза вызывать функцию, а задавать флаги MEM_COMMIT|MEM_RESERVE. Для возврата физической памяти используется функция VirtualFree, в которой задаются параметры: адрес начала освобождаемой памяти; размер области; и параметр MEM_DECOMMIT. Если задан размер равный 0, то освобождается вся память. Если обратиться к памяти после ее освобождения, то произойдет ошибка. Для освобождения страниц существует 3 варианта

  1. Предполагает, что одной записи соответствует одна страница. Освобождение записи освобождает страницу.

  2. Создается битовая карта занятых записей, с которой работает специальная программа.

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

BOOL virtualProtect(

LPVOID lpAdress,//

DWORD dwSize,//

DWORD flNewProtect,//новый атрибут защиты

DWORD lpflOldProtect// )

Как правило, вытесняется страница, которая дольше всего не использовалась. Для блокировки страниц используется функция:

BOOL ViruaLock(

LPVOID lpAdress,//

DWORD dwSize,//)

По умолчанию, процесс может заблокировать максимум 30 страниц, если надо больше, то используется промежуточные действия. На разблокирования используется функция VirualAlloc. После заверения процесса, заблокированные страницы автоматически разблокируются.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]