- •Планирование и диспетчеризация потоков.
- •Приоритетное планирование
- •Адаптивно-рефлекторное планирование
- •Создание выполнение и завершение процессов
- •Объекты синхронизации События
- •Условие освобождении объектов синхронизации
- •Эффективность многозадачной системы
- •Механизм сообщений Windows
- •Страничная организация памяти
- •Механизмы управление памяти
Механизмы управление памяти
Для работы с памяти используется 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 варианта
-
Предполагает, что одной записи соответствует одна страница. Освобождение записи освобождает страницу.
-
Создается битовая карта занятых записей, с которой работает специальная программа.
-
В структуре можно добавить поле занятости, в котором будет приниматься истина или ложь. Программа сборки мусора, имеющая низкий приоритет, освобождает память под незанятые записи. При необходимости атрибуты защиты могут быть изменены с помощью функции
BOOL virtualProtect(
LPVOID lpAdress,//
DWORD dwSize,//
DWORD flNewProtect,//новый атрибут защиты
DWORD lpflOldProtect// )
Как правило, вытесняется страница, которая дольше всего не использовалась. Для блокировки страниц используется функция:
BOOL ViruaLock(
LPVOID lpAdress,//
DWORD dwSize,//)
По умолчанию, процесс может заблокировать максимум 30 страниц, если надо больше, то используется промежуточные действия. На разблокирования используется функция VirualAlloc. После заверения процесса, заблокированные страницы автоматически разблокируются.