Понятие кучи

Программный стек
Сегмент команд
Сегмент данных
Куча
Сегмент команд
Сегмент данных
Куча

Распределение памяти в исполнительном модуле.

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

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

Для реализации динамических структур данных используют т.н. кучу (heap). Это объем памяти, в котором можно выделить участок для произвольного элемента данных. Для кучи есть 2 операции: выделения памяти ALLOCATE и освобождения FREE. Эти функции не делают никаких действий с собственно памятью. При выделении программист получает адрес, а при освобождении доступный объем кучи становится больше. Одного адреса для этих операций недостаточно, требуется еще и размер элемента данных. Если указатель типизированный, размер будет получен автоматически. В случае нетипизированного указателя размер должен быть передан в функцию.

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

Организация кучи под Windows. Куча строится по другому принципу, так как в процессе выполнения действий над объектом может изменяться как количество так и их длина. Все объекты располагаются в куче, поэтому куча стала обязательной частью и в программе на визуальном языке программирования размер кучи больше чем все остальные части вместе взятые. Для обработки данных кучи существует специальная программа – диспетчер кучи. Он состоит из таблицы в которой заносятся адрес каждого фрагмента кучи(экстента), а также длина. Максимальная длина данного, возможного для распределения в куче равна длине максимального экстента. После начала выполнения программы при распределении динамических переменных диспетчер кучи заполняет таблицу измененными данными. В процессе выполнения при уничтожении переменной(при освобождении памяти данные в таблице изменяются и куче образуются “дырки”).

В Турбо Паскале куча строится по следующим параметрам:

1. Собир-ся все свободные места м/у концом сегмента данных или команд и концом страницы.

2. Выделяется одна специальная страница (или меньше) под кучу и стек. Величину кучи или стека можно изменить задав {$M n1, n2, n3} n1- задает количество байт в стеке; n2 - память, отведенная для подпрограммы; n3- длина кучи.

Необходимо помнить (особенно при проектировании программ оболочек с вызовом других выполняемых программ), что величина стека должна превышать 4 тысячи байт.

Для delphi:

{$ H+}- использование расширенных строк;

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

В языке СИ происходит автоматическое запоминание адреса и величины кучи, которая приводит к автоматическому очищению кучи после выхода из подпрограммы.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: