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

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

Читайте также:
  1. Б) Динамическая вольт-амперная характеристика дуги.
  2. В ПАМЯТЬ МОШЕННИКА
  3. ВНЕШНЯЯ ПАМЯТЬ
  4. ВНИМАНИЕ, ПАМЯТЬ И КОНТРОЛЬ ЗА ДВИЖЕНИЯМИ Внимание
  5. Высшая нервная деятельность. Сон, его значение. Сознание, память, эмоции, речь, мышление. Особенности психики человека
  6. Гипноз и память
  7. ГЛАВА 12. ПАМЯТЬ СЛЕПЫХ И СЛАБОВИДЯЩИХ
  8. Глава 13. ДИНАМИЧЕСКАЯ ВСЕЛЕННАЯ
  9. Глава 2. «ПАМЯТЬ О ТЕХ, КТО КОГДА-ТО ЖИЛ»: реалии русской истории в живописи русского средневековья
  10. Глава 4. Память
  11. ГР с магнитной памятью
  12. Диагностирование дискретных устройств с памятью. Построение диагностических и проверяющих тестов

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

Указатели

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

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

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

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

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

Необходимость в них возникает при обработке больших объемов данных (поскольку память, выделяемая под статические данные, не может превышать 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 разряда, освободившиеся правые разряды заполняются нулями, результат складывается с содержимым смещения.

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


1 | 2 | 3 | 4 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.)