Мегаобучалка Главная | О нас | Обратная связь


ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 15



2015-12-13 420 Обсуждений (0)
ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 15 0.00 из 5.00 0 оценок




1. Страничная и сегментная адресация

2. Учет пользователей объектов ядра. Защита.

3. Кучи. Управление памятью кучи.

Кучи

Win32 поддерживает области памяти в виде куч (heaps). Процесс может

содержать несколько куч, и из них разработчик выделяет память.

Часто достаточно одной кучи, но по приведенным ниже причинам

используется и много куч. Если достаточно одной кучи, просто используйте

функции библиотеки С для управления памятью (malloc, free, calloc,

realloc).

Кучи являются объектами Win32, поэтому они имеют дескрипторы.

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

HANDLE GetProcessHeap (VOID)

Возвращаемое значение: дескриптор кучи процесса; NULL в случае неудачи.

Заметим, что в данном случае для указания на ошибку возвращается

значение NULL, а не INVALID_HANDLE_VALUE, как в функции CreateFile.

Программа также может создавать особые кучи. Это относится к тем

случаям, когда необходимы отдельные кучи для резервирования отдельных

структур данных. Ниже описаны преимущества отдельных куч.

• Справедливость распределения. Ни один поток не может получить

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

• Многопоточное быстродействие. Благодаря предоставлению каждому

потоку отдельной кучи соревнование между потоками сокращается, что может существенно повысить быстродействие.

• Эффективность резервирования. Резервирование элементов данных

фиксированного размера в маленькой куче значительно более эффективно, чем резервирование множества элементов разных размеров в одной большой куче.

Также снижается фрагментация памяти. Кроме того, выделение каждому

потоку отдельной кучи упрощает синхронизацию, что дает дополнительный

выигрыш.

• Эффективность освобождения памяти. Вся куча и все структуры данных,

размещенные в ней, могут быть освобождены одним вызовом функции. При

этом также освобождается и вся выделенная, но потерянная память в куче.

• Эффективная локализация ссылок. Расположение структуры данных в

маленькой куче гарантирует, что ее элементы будут сосредоточены в

сравнительно небольшом количестве страниц, что потенциально сокращает

страничные ошибки при обработке структуры.

Ценность этих преимуществ изменяется в зависимости от приложения, и

многие программисты будут пользоваться только кучей процесса и

библиотекой С. В любом случае, следующие две функции создают и

уничтожают кучи.

Начальный размер кучи, который может быть нулевым и всегда округляется

до числа, кратного размеру страницы, определяет объем физической памяти (в файле подкачки), первоначально отведенный куче. Когда программа выходит за границы начального размера, автоматически выделяются дополнительные страницы вплоть до максимального предела. Так как файл подкачки является ограниченным ресурсом, отложенное выделение удобно в случаях, когда размер кучи заранее не известен. Ненулевое значение переменной dwMaximumSize определяет предел для динамического повышения объема кучи. Куча процесса также будет динамически расти.

HANDLE HeapCreate ( DWORD flOptions,

SIZE_T dwInitialSize, SIZE_T dwMaximumSize);

Возвращаемое значение: дескриптор кучи или NULL в случае ошибки.

Два поля размера имеют тип SIZE _ T , а не DWORD . Тип SIZE _ T определен таким образом, что может быть 32-разрядным или 64-разрядным беззнаковым целым, в зависимости от флагов компилятора (_WIN32 или _WIN64). Тип SIZE _ T был введен для обеспечения возможности перехода к WIN64. Переменная flOptions является комбинацией двух флагов.

• HEAP_GENERATE_EXCEPTIONS— при этом значении неудачные

попытки выделения памяти вызывают исключения, которые будут обработаны структурным обработчиком исключений (Structured Exception Handler — SEH). Функция HeapCreate сама по себе не вызывает исключений; если этот флаг установлен, исключение вызывают при неудаче такие функции, как HeapAlloc.

• HEAP_NO_SERIALIZE — установка этого флага в некоторых случаях

позволяет получить небольшое повышение быстродействия. Следует сказать также несколько слов о dwMaximumSize.

• Если значение dwMaximumSize. не равно нулю, виртуальное адресное

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

• С другой стороны, если значение dwMaximumSize. — нуль, то куча

является возрастающей за пределы начального размера. Эта граница

определяется доступным виртуальным адресным пространством, часть

которого может быть предоставлена другим кучам, и пространством файла

подкачки.

Отметим, что кучи не имеют атрибутов безопасности, так как они

недоступны извне процесса.

Для уничтожения всей кучи используйте функцию HeapDestroy. Это

другое исключение из общего правила о том, что функция CloseHandle

применяется для удаления всех ненужных дескрипторов.

BOOL HeapDestroy (HANDLE hHeap);

Переменная hHeap должна указывать на кучу, созданную функцией

HeapCreate. Будьте осторожны, не уничтожьте кучу процесса (полученную

функцией GetProcessHeap). Уничтожение кучи освобождает пространство

виртуальной памяти и физическую память в файле подкачки. Разумеется,

грамотно спроектированные программы должны освобождать кучи, которые

больше не используются.

Уничтожение кучи — это также быстрый способ освободить структуру

данных без необходимости уничтожать каждый элемент отдельно, хотя

экземпляры объектов С++ таким образом не будут уничтожены, поскольку их

деструкторы не вызываются. Уничтожение кучи имеет ряд преимуществ.

1. Нет необходимости писать код для поэлементного обхода структуры.

2. Нет необходимости освобождать каждый отдельный элемент.

3. Система не тратит время на поддержку кучи с того момента, когда все

структуры данных освобождаются одним системным вызовом.



2015-12-13 420 Обсуждений (0)
ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 15 0.00 из 5.00 0 оценок









Обсуждение в статье: ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 15

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (420)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)