Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Динамическая память



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

· сама программа пользователя;

· системные программы, которые осуществляют вспомогательные действия;

· при выполнении программ пользователя;

· определяемые пользователем константы и структуры данных (переменные);

· временная память для хранения промежуточных результатов при вычислении выражений;

· адреса возврата для подпрограмм;

· временная память при передаче параметров;

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

· различные системные данные (например, информация о статусе устройств ввода-вывода).

Таким образом, управление памятью касается широкого класса объектов. До сих пор мы пользовались простейшим способом распределения памяти – статическим.

Практика программирования часто выдвигает на передний план два конфликтующих фактора: время выполнения программы и объем занимаемой памяти. И иногда для экономии памяти приходится поступиться быстродействием. Статическое распределение памяти эффективно потому, что на управление памяти в этом случае не тратится ни время, ни память. Но рассмотрим пример. Пусть в некоторой задаче обрабатывается матрица размером 300х300 целых чисел. Тогда необходимо описание:

var a1: array[1..300,1..300] of integer.

Такие переменные, описанные в разделе var, Н. Вирт назвал статическими за то, что они могут обрабатываться компилятором без выполнения программы на основании одного только статического (неизменного) текста программы. В нашем примере общее количество элементов 90 000, необходимый объем памяти равен 90000 х 2 = 180 000 байт. При этом маловероятно, что программе могут одновременно понадобиться все 90000 элементов. Кроме того, все переменные, объявленные в программе, располагаются в одной непрерывной области памяти «сегменте данных», длина которого (определяется архитектурой микропроцесcора) равна 64 Кб, что также вызывает затруднения при обработке больших массивов.

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

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

Итак, работа с переменными в различных языках программирования может быть организована различными способами:

1. Статический. Место для хранения переменных отводится компилятором. В программе обращение к переменной происходит по имени, а компилятор связывает это имя с конкретным адресом в памяти. Эта связь постоянна в течение всего времени выполнения программы. В Паскале таким образом можно объявлять переменные размером до 64 Кб.

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

3. Совмещение статической и динамической памяти - выделение места для локальных параметров подпрограмм.

Динамическая память – это оперативная память, выделяемая программе при ее работе за вычетом сегмента данных (64 Кб), стека (обычно 16 Кб) и размера самой программы. Распределение памяти показано на рис. 13.1.

       
   
 
 


Старшие

адреса Системные программы HEAPEND


Еще не распределенная память HEAPPTR

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Динамическая память

(расширяется в сторону увеличения адресов) HEAPORG

 
 


До 64 К Сегмент стека

(расширяется в сторону уменьшения адресов)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Свободная память стека

До 64 К Сегмент данных основной программы

(глобальные переменные, тип const)

До 64 К Сегменты кодов включаемых модулей

каждый

До 64 К Сегмент кода основной программы


Младшие Паскаль

адреса системные программы

памяти

Рис. 13.1. Распределение памяти





Дата публикования: 2014-10-25; Прочитано: 423 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...