Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
В любой вычислительной системе память относится к тем ресурсам, которых всегда не хватает. Управление памятью – одна из главных забот программиста, так как во время выполнения программы память необходима для следующих элементов программ и данных:
· сама программа пользователя;
· системные программы, которые осуществляют вспомогательные действия;
· при выполнении программ пользователя;
· определяемые пользователем константы и структуры данных (переменные);
· временная память для хранения промежуточных результатов при вычислении выражений;
· адреса возврата для подпрограмм;
· временная память при передаче параметров;
· буферы ввода/вывода, в которых хранятся данные между моментом их реальной физической передачи с физического устройства или на него и моментом инициации в программе операций ввода или вывода;
· различные системные данные (например, информация о статусе устройств ввода-вывода).
Таким образом, управление памятью касается широкого класса объектов. До сих пор мы пользовались простейшим способом распределения памяти – статическим.
Практика программирования часто выдвигает на передний план два конфликтующих фактора: время выполнения программы и объем занимаемой памяти. И иногда для экономии памяти приходится поступиться быстродействием. Статическое распределение памяти эффективно потому, что на управление памяти в этом случае не тратится ни время, ни память. Но рассмотрим пример. Пусть в некоторой задаче обрабатывается матрица размером 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!