Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


База данных страничных блоков



Windows фиксирует coстояние каждой физической страницы памяти в структуре данных, называемой базой данных страничных блоков (Page Frame Database). Каждая физическая страница может находиться в одном из восьми различных стояний:

· активная, или действительная (active , valid). Страница в текущий момент отображается на виртуальную память, входя, таким образом, в рабочий набор страниц;

· переходная (transition). Страница в процессе перехода к активному состоянию;

· резервная (standby). Страница только что вышла из состояния «активная», но осталась неизменной;

· измененная (modified). Страница вышла из состояния «активная». Ее содержание, пока она находилась в указанном состоянии, было изменено, но еще не записано на диск;

· измененная незаписанная (modified no write ). Страница находится в состоянии «измененная», но особо помечена как страница, содержимое которой не сброшено на диск. Используется драйверами файловой системы Windows;

· свободная (free). Страница свободна, но содержит произвольные записи и, следовательно, не может использоваться процессом;

· обнуленная ( zeroed ). Страница свободна и инициализирована нулями потоком нулевой страницы. Может быть выделена процессу;

· плохая (bad). В странице были отмечены ошибки четности или какие-то другие аппаратные ошибки, поэтому она не должна использоваться.

Кучи памяти в 32-разрядной Windows

При создании процесса Windows назначает ему кучу по умолчанию (default heap), то есть изначально резервирует область виртуальной памяти объемом 1 Мб. Тем не менее, при необходимости система будет регулировать размер кучи, которая используется самой Windows для различных целей.

API-функция GetProcessHeap используется для получения дескриптора кучи. При помощи функции HeapCreat е, возвращающей дескриптор кучи, программист может создавать дополнительные кучи.

Есть несколько причин создавать дополнительные кучи вместо того, чтобы использовать кучу по умолчанию. Например, те кучи, которые предназначены для конкретных задач, часто оказываются более эффективными. Кроме того, ошибки записи данных в кучу, память для которой выделена из специализированной кучи, не затронут данных других куч. Наконец, выделение памяти из специализированной кучи в общем случае будет означать, что данные в памяти упакованы более плотно друг к другу, а это может уменьшить потребность в загрузке страниц из файлa подкачки. Следует также упомянуть, что доступ к куче упорядочен (serialized), то есть система заставляет каждый поток, пытающийся обратиться к памяти кучи, дожидаться своей очереди, пока другие потоки не закончат производимые операции. Следовательно, только один поток в каждый момент времени может выделять или освобождать память кучи во избежание неприятных конфликтов.

16-разрядная Windows поддерживает и глобальную, и локальную кучи. Соответственно в данной системе реализованы функции GlobalAlloc и LocalAlloc . Они выполняются, но не очень эффективны, поэтому следует избегать их применения в Win32. Однако их все-таки приходится использовать для некоторых целей, таких как создание окна просмотра буфера обмена.

Функции работы с кучей

Для работы с кучами используются следующие функции:

· GetProcessHeap возвращает дескриптор кучи процесса по умолчанию;

· GetProcessHeaps возвращает список дескрипторов всех куч, используемых в данный момент процессом;

· HeapAlloc выделяет блок памяти из заданной кучи;

· HeapCompact дефрагментирует кучу, объединяя свободные блоки. Может также освобождать неиспользуемые страницы памяти кучи;

· HeapCreate создает новую кучу в адресном пространстве процесса;

· HeapDestroy удаляет заданную кучу;

· HeapFree освобождает предварительно выделенные блоки памяти кучи;

· HeapLock блокирует кучу, при использовании данной функции только один поток имеет к ней доступ. Другие потоки, запрашивающие доступ, переводятся в состояние ожидания до тех пор, пока поток, владеющий кучей, не разблокирует ее. Это одна из форм синхронизации потоков, то есть тот прием, которым система реализует упорядоченность доступа;

· HeapReAlloc перераспределяет блоки памяти кучи. Используется для изменения размера блока;

· Heapsize возвращает размер выделенного блока памяти кучи;

· HeapUnlock разблокирует кучу, которая до этого была заблокирована функцией HeapLock ;

· HeapValidate проверяет пригодность кучи (или отдельного ее блока), если имеются ли какие-либо повреждения;

· HeapWalk позволяет программисту просматривать содержимое кучи. Обычно используется при отладке.


Поделиться:



Последнее изменение этой страницы: 2019-03-20; Просмотров: 86; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.01 с.)
Главная | Случайная страница | Обратная связь