К2_Динамическая память.ppt
- Количество слайдов: 12
Адресация памяти. Распределение оперативной памяти при выполнении программ 2013 г.
АДРЕСАЦИЯ ПАМЯТИ ►Режим адресации памяти Процедура или схема преобразования адресной информации об операнде в его исполнительный адрес. ► Способы адресации памяти Прямой Исполнительный адрес берется непосредственно из команды или вычисляется с использованием указанного в команде значения и содержимого какого-либо регистра Прямая адресация Косвенный В команде содержится значение косвенного адреса, т. е. адреса ячейки памяти, в которой находится окончательный исполнительный адрес. Сегментная адресация Страничная адресация Сегментно-страничная адресация
ПРЯМАЯ АДРЕСАЦИЯ ПАМЯТИ Значение адреса сегмент Номер «параграфа» (непрерывного блока, размером 16 байт) смещение Смещение ячейки в сегменте, отсчитанное от начала параграфа Оперативная память
КОСВЕННАЯ АДРЕСАЦИЯ ПАМЯТИ (на примере защищенного режима) Логический адрес сегмент смещение Таблица дескрипторов … Атрибуты доступа Адрес начала сегмента … Физический адрес
РАСПРЕДЕЛЕНИЕ ОПЕРАТИВНОЙ ПАМЯТИ ПРИ ВЫПОЛНЕНИИ ПРОГРАММЫ на примере прямого режима адресации Старшие адреса Область кучи (Heap) Вся оставшаяся память, используемая динамическими переменными ОПЕРАТИВНАЯ ПАМЯТЬ Оверлейный буфер (Overlay- cтарое) Сегмент стека (Stack Segment, SS) Сегмент данных (Data Segment, DS) Код модуля 1 Код модуля 2 Код EXE-файла. . . Код модуля (Code Segment, CS) N • Содержит локальные переменные, параметрызначения и адреса параметров-переменных • Содержит глобальные переменные и типизированные константы основной программы и всех подключенных к ней модулей (статические переменные). Код программы Код основной программы Program Segment Prefix (PSP-сегмент) Префикс программного сегмента Содержит сведения о выполняемой программе (256 байт) Адрес задается парой значений <сегмент>: <смещение> Младшие адреса где <сегмент> - номер параграфа, отсчитанный от начала памяти
Работа с динамическими переменными
Статические переменные (см. распечатку) Память под статические переменные выделяется до выполнения программы, а освобождается после ее завершения. Глобальные переменные и типизированные константы размещаются в сегменте данных, а локальные переменные - в сегменте стека. Var I: Integer; { 4 байта} S: String[255] {256 байтов} Begin i: =256; s: =‘Строка 1’ … End. Сегмент данных I S 4 байта для значения I 256 Строка 1 256 байтов для значения S
Динамические переменные (см. распечатку) • Динамические переменные – переменные, память под которые отводится (освобождается) при выполнении программы. Для перехода адресов этих могут совмещаться с любой областью памяти (функцияс. Ptr), но Освобождениепеременные переменных используются указатели и выполняется Динамические от адресакучи, занимаемой динамической переменнойссылки. (^), т. е. если Для хранения области к значению используется операция разыменования помощью процедур этих типов в сегментекучи. p. Int - ссылка на целое число (адрес), то значение, на которое оно указывает, будет4 байта, чаще всего они располагаются в области данных (или сегменте стека) выделяется При использовании : • Dispose(var P: Pointer) динамическая переменная). обозначатся как p. Int^переменных в области кучи используются: Для размещения этих (сама содержащие сведения о местоположении динамической переменной, а не ее значения • Free. Mem(var P: Pointer; Size: Integer) Операция разыменования (^) не применяется для типа Pointer, т. к. не известен тип значения, • процедура New(var P: Pointer) на который указывает ссылка. • процедура Get. Mem(var P: Pointer; Size: Integer) * Об использовании других подпрограмм см. в справочной системе конкретной среды разработки. Var a: Integer; { 4 байта} p: Pointer; { 4 байта} p. Int: ^Integer; { 4 байта} Begin. . . {Выделение памяти в области кучи} new(p. Int); Get. Mem(p, 16); a: =2; p. Int^: =4; . . . {Освобождение памяти в области кучи} Dispose(p. Int); Free. Mem(p, 16); … End. Сегмент данных a Значение Integer P адрес PInt адрес Куча 2 Статические переменные p. Int^ 4 Динамические переменные
ПРИМЕР (см. распечатку). Поменять местами значения двух переменных var p. I, p. J : ^Integer; temp: Integer; begin new(PI); new(PJ); p. I^: =1; p. J^: =2; temp: =p. J^; p. J^: =p. I^; p. I^: =temp; … … Dispose(p. I); Dispose(p. J); end. Сегмент данных PI, PJ адреса PI адрес PJ адрес temp Куча 21 1 2 Значение Integer 2 PI^, PJ^значения
Пример. Описание ссылки на массив TYPE ARR=ARRAY[1. . 2000] of Integer; ptr. To. Arr=^ARR; Var p. Arr: ptr. To. Arr; I: Integer; Begin New(p. Arr); {Выделение памяти под массив} {базовый тип - массив из 2000 целых значений} {ссылка на массив, 4 байта} { Работа с данными. Если память под переменные не выделена, произойдет ошибка при записи значений в произвольную область памяти } For I: =1 to 2000 do p. Arr^[I]: =I; . . . … Dispose(p. Arr); {Освобождение памяти} End. • p. Arr - ссылка на массив • p. Arr^ - массив со значениями типа Integer Сегмент данных p. Arr адрес p. Arr^ 1 2 3 4 … 2 1999 2000 p. Arr^[1] p. Arr^[2] . . . p. Arr^[1999] p. Arr^[2000] Куча
Пример. Описание массива ссылок TYPE Arr. Ptr= Array[1. . 1000] of ^Integer; {тип-массив ссылок на целые значения} Var Links: Arr. Ptr; I: Integer; Begin For I: =1 to 1000 do New(Links[I]); {Выделение памяти под динамические переменные} { Работа с данными. Если память под переменные не выделена, произойдет ошибка при записи значений в произвольную область памяти } For I: =1 to 1000 do Links[I]^: =I; . . . For I: =1 to 1000 do Dispose(Links[I]); {Освобождение памяти} End. • Links[I] - i-я ссылка в массиве • Links[I]^ - значение, на которое указывает i-я ссылка в массиве Сегмент данных Links[1] адрес Links[1]^ Links[2] адрес Links[3]^ Links[3] Links[999] адрес. . . адрес Links[1000] адрес Links[4]. . . 2 Links[2]^ Links[4]^. . . Links[999]^ 1 2 3 4. . . 2 999 Links[1000]^ 1000 Куча
ПРЕИМУЩЕСТВА ИСПОЛЬЗОВАНИЯ ДИНАМИЧЕСКИХ ПЕРЕМЕННЫХ • Данные используются только там, где они необходимы • Несколько переменных могут использовать одну и ту же область памяти • В программе можно создавать структуры с изменяющимся размером. • Снимаются ограничения на размер памяти, отводимой под данные