Программный стек |
Сегмент команд |
Сегмент данных |
Куча |
Сегмент команд |
Сегмент данных |
Куча |
Распределение памяти в исполнительном модуле.
Куча – специальная область памяти, предназначенная для определенных динамических действий. Как правило, в языках программирования и операционных системах разделяют две кучи: общая и графическая.
Куча – неиспользуемая до конца страницы область памяти, предназначенная для хранения динамических данных.
Для реализации динамических структур данных используют т.н. кучу (heap). Это объем памяти, в котором можно выделить участок для произвольного элемента данных. Для кучи есть 2 операции: выделения памяти ALLOCATE и освобождения FREE. Эти функции не делают никаких действий с собственно памятью. При выделении программист получает адрес, а при освобождении доступный объем кучи становится больше. Одного адреса для этих операций недостаточно, требуется еще и размер элемента данных. Если указатель типизированный, размер будет получен автоматически. В случае нетипизированного указателя размер должен быть передан в функцию.
|
|
Организация кучи под DOS. В процессе выполнения программы основные области как правило занимают не полностью 1 страницу, следовательно остаются пустые места. Они остаются на каждой странице и общее количество пустых мест называется кучей. Она предназначена для хранения изменяемых данных в процессе выполнения программы.
Организация кучи под Windows. Куча строится по другому принципу, так как в процессе выполнения действий над объектом может изменяться как количество так и их длина. Все объекты располагаются в куче, поэтому куча стала обязательной частью и в программе на визуальном языке программирования размер кучи больше чем все остальные части вместе взятые. Для обработки данных кучи существует специальная программа – диспетчер кучи. Он состоит из таблицы в которой заносятся адрес каждого фрагмента кучи(экстента), а также длина. Максимальная длина данного, возможного для распределения в куче равна длине максимального экстента. После начала выполнения программы при распределении динамических переменных диспетчер кучи заполняет таблицу измененными данными. В процессе выполнения при уничтожении переменной(при освобождении памяти данные в таблице изменяются и куче образуются “дырки”).
В Турбо Паскале куча строится по следующим параметрам:
1. Собир-ся все свободные места м/у концом сегмента данных или команд и концом страницы.
2. Выделяется одна специальная страница (или меньше) под кучу и стек. Величину кучи или стека можно изменить задав {$M n1, n2, n3} n1- задает количество байт в стеке; n2 - память, отведенная для подпрограммы; n3- длина кучи.
|
|
Необходимо помнить (особенно при проектировании программ оболочек с вызовом других выполняемых программ), что величина стека должна превышать 4 тысячи байт.
Для delphi:
{$ H+}- использование расширенных строк;
В зависимости от типа транслятора куча может быть автоматически очищена или нет. В языке Паскаль не происходит запоминание и восстановление текущего адреса кучи и ее размера, поэтому с одной стороны не возможно автоматическое освобождение кучи. С другой стороны пользователь может передавать любые данные из подпрограммы через кучу.
В языке СИ происходит автоматическое запоминание адреса и величины кучи, которая приводит к автоматическому очищению кучи после выхода из подпрограммы.