Студопедия — Динамическая память
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

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






Динамические структуры данных.

Указатели

Статические и динамические структуры данных.

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

Типы данных, рассмотренные до сих пор, являются статическими. Данные этих типов имеют один и тот же размер и формат на протяжении выполнения всего блока, в котором были объявлены.

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

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

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

Во время работы программы динамические переменные располагаются в специальной динамически распределяемой области памяти или куче (Heap).

Во время выполнения программы система выделяет три сегмента: сегмент кода, сегмент данных, сегмент стека. Префиксный сегмент программы (PSP) — область длиной 256Б — строится DOS при загрузке файла имя. exe. Адрес сегмента PSP сохраняется в предопределенной переменной PrefixSeg длиной в слово.

Сегмент кода адресуется через регистр CS (содержимое не изменяется во время выполнения программы). Основная программа занимает первый сегмент кода. Следующие сегменты занимают коды модулей (если они есть) в порядке, обратном описанному в предложении Uses. Последний сегмент кода занят кодом модуля System. Размер каждого отдельного сегмента кода не может превышать 64К, а общий размер сегмента кода ограничен только объемом имеющейся памяти.

Сегмент данных адресуется через регистр DS (содержимое не изменяется во время выполнения программы). Он содержит все типизованные константы, за которыми следуют все глобальные переменные. Размер сегмента данных не может превышать 64К.

В сегменте стека располагаются локальные переменные процедур и функций. При входе в программу регистр сегмента стека SS и указатель стека SP загружаются так, что адрес SS:SP указывает на первый байт, следующий за сегментом стека. Содержимое регистра SS в процессе выполнения программы не изменяется, а SP перемещается вниз, пока не достигнет нижней границы стека. Размер стека не может превышать 64К. По умолчанию ему назначается размер 16К (можно изменить с помощью директивы компилятора {$M}, а с помощью директивы {$S} проверить на переполнение).

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

 


Схема распределения памяти программы на Паскале:

Увеличение адресов →     Верхняя граница памяти операционной системы  
  Куча ┌───^───┐ Свободная Память FreePtr HeapPtr
Динамически распределяемая область памяти ↑ (расширение) HeapOrg
    Оверлейный Буфер OvrHeapEnd OvrHeapOrg
  Область стека (≤ 64 К, по умолч. 16 К) ┌───^───┐ Сегмент Стека (расширение) ↓  
  Свободная область стека SSeg: SPtr     SSeg: 0000
Образ файла имя.exe ┌──────────────^───────────────┐ Сегмент данных (≤ 64 К) ┌─^─┐ Глобальные переменные  
Типизованные константы   DSeg: 0000
Сегмент кода ┌────────^────────┐ Сегмент кода модуля System (≤ 64 К)  
Сегмент кода первого модуля (≤ 64 К)  
...  
Сегмент кода последнего модуля (≤ 64 К)  
Основная программа (≤ 64 К)   CSeg: 0000
256 Б Префиксный сегмент программы (PSP) PrefixSeg

 

В динамически распределяемой области памяти (Heap) сохраняются динамические переменные. Она занимает всю свободную память или часть свободной памяти, оставшуюся при выполнении программы. Действительный размер области зависит от максимального и минимального значений, которые можно установить с помощью директивы компилятора {$M}. Гарантированный минимальный размер области не может быть меньше минимального значения, установленного для данной области. Максимальный размер никогда не может превышать заданного для нее максимального значения. Если указанный минимальный объем недоступен — программа не выполняется. По умолчанию минимальный размер равен 0К, максимальный — 1МБ (т.е. вся свободная адресуемая память).

Управляет (непосредственно при работе программы) динамически распределяемой областью памяти программа динамического распределения памяти (администратор кучи) — часть библиотеки модуля System. Динамически распределяемая область памяти — структура, похожая на стек, но расширяющаяся от младших адресов к старшим. Нижняя граница записывается в переменной HeapOrg, верхняя — в HeapPtr. При каждом выделении памяти для динамической переменной HeapPtr перемещается вверх.

Адреса

Память компьютера представляет собой совокупность элементарных ячеек для хранения информации — байтов, каждый из которых имеет собственный номер или адрес, что позволяет обращаться к любому байту памяти. Адреса задаются совокупностью двух шестнадцатиразрядных слов, которые называются сегментом и смещением. Сегмент — это участок памяти, имеющий длину 64К и начинающийся с физического адреса, кратного 16 (т.е. 0, 16, 32, 48 и т.д.). Смещение указывает, сколько байт от начала сегмента необходимо пропустить, чтобы обратиться к нужному адресу.

Адресное пространство компьютера составляет 1М. Для адресации в этих пределах нужно 20 двоичных разрядов, которые получаются из двух шестнадцатиразрядных слов (сегмента и смещения) следующим образом: содержимое сегмента смещается влево на 4 разряда, освободившиеся правые разряды заполняются нулями, результат складывается с содержимым смещения.

Физический адрес = Сегмент + Смещение







Дата добавления: 2015-08-12; просмотров: 412. Нарушение авторских прав; Мы поможем в написании вашей работы!



Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

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

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Типы конфликтных личностей (Дж. Скотт) Дж. Г. Скотт опирается на типологию Р. М. Брансом, но дополняет её. Они убеждены в своей абсолютной правоте и хотят, чтобы...

Гносеологический оптимизм, скептицизм, агностицизм.разновидности агностицизма Позицию Агностицизм защищает и критический реализм. Один из главных представителей этого направления...

Функциональные обязанности медсестры отделения реанимации · Медсестра отделения реанимации обязана осуществлять лечебно-профилактический и гигиенический уход за пациентами...

ТЕРМОДИНАМИКА БИОЛОГИЧЕСКИХ СИСТЕМ. 1. Особенности термодинамического метода изучения биологических систем. Основные понятия термодинамики. Термодинамикой называется раздел физики...

Травматическая окклюзия и ее клинические признаки При пародонтите и парадонтозе резистентность тканей пародонта падает...

Подкожное введение сывороток по методу Безредки. С целью предупреждения развития анафилактического шока и других аллергических реак­ций при введении иммунных сывороток используют метод Безредки для определения реакции больного на введение сыворотки...

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия