Скачать презентацию Адресация памяти. Распределение оперативной памяти при выполнении программ Скачать презентацию Адресация памяти. Распределение оперативной памяти при выполнении программ

К2_Динамическая память.ppt

  • Количество слайдов: 12

Адресация памяти. Распределение оперативной памяти при выполнении программ 2013 г. Адресация памяти. Распределение оперативной памяти при выполнении программ 2013 г.

АДРЕСАЦИЯ ПАМЯТИ ►Режим адресации памяти Процедура или схема преобразования адресной информации об операнде в АДРЕСАЦИЯ ПАМЯТИ ►Режим адресации памяти Процедура или схема преобразования адресной информации об операнде в его исполнительный адрес. ► Способы адресации памяти Прямой Исполнительный адрес берется непосредственно из команды или вычисляется с использованием указанного в команде значения и содержимого какого-либо регистра Прямая адресация Косвенный В команде содержится значение косвенного адреса, т. е. адреса ячейки памяти, в которой находится окончательный исполнительный адрес. Сегментная адресация Страничная адресация Сегментно-страничная адресация

ПРЯМАЯ АДРЕСАЦИЯ ПАМЯТИ Значение адреса сегмент Номер «параграфа» (непрерывного блока, размером 16 байт) смещение ПРЯМАЯ АДРЕСАЦИЯ ПАМЯТИ Значение адреса сегмент Номер «параграфа» (непрерывного блока, размером 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 : ПРИМЕР (см. распечатку). Поменять местами значения двух переменных 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; Пример. Описание ссылки на массив 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; {тип-массив ссылок Пример. Описание массива ссылок 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 Куча

ПРЕИМУЩЕСТВА ИСПОЛЬЗОВАНИЯ ДИНАМИЧЕСКИХ ПЕРЕМЕННЫХ • Данные используются только там, где они необходимы • Несколько ПРЕИМУЩЕСТВА ИСПОЛЬЗОВАНИЯ ДИНАМИЧЕСКИХ ПЕРЕМЕННЫХ • Данные используются только там, где они необходимы • Несколько переменных могут использовать одну и ту же область памяти • В программе можно создавать структуры с изменяющимся размером. • Снимаются ограничения на размер памяти, отводимой под данные