programming.systems.cpp.17.memory.allocation (Лекции Волковой 2015)
Описание файла
Файл "programming.systems.cpp.17.memory.allocation" внутри архива находится в папке "Лекции Волковой 2015". PDF-файл из архива "Лекции Волковой 2015", который расположен в категории "". Всё это находится в предмете "практикум (прикладное программное обеспечение и системы программирования)" из 4 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Распределение памятиРаспределение памяти - это процесс, в результате которогоотдельным элементам исходной программы ставятся в соответствиеадрес, размер и атрибуты области памяти, необходимой для размещениялексических единиц.Область памяти - это блок ячеек памяти, выделяемых для данных икаким-то образом объединенных логически.Распределение памяти выполняется после фазы анализа текстаисходной программы на этапе подготовки к генерации объектногомодуля (перед генерацией кода объектного модуля).Исходными данными для процесса распределения памяти служатсведения о семантике конструкций ЯП, таблица идентификаторов,построенная лексическим анализатором и информация, полученнаясинтаксическим анализатором при анализе декларативной чистипрограммы.Современные компиляторы, в основном, работают с относительными, ане с абсолютными адресами ячеек памяти.Распределение памятиСемантика программ подразумевает, что при ихвыполнении области памяти будут необходимы дляхранения: кодов пользовательских программ; данных, необходимых для работы этих программ; кодов системных программ, обеспечивающих поддержкупользовательских программ в период их выполнения; записей о текущем состоянии процесса выполненияпрограмм (например, записей об активации процедур).По способу использования области памяти делятся наглобальные и локальные, а по способу распределения –на статические и динамические.Классы памятиВыделяемую память можно разделить наЛокальнаялокальную / глобальную истатическую / динамическую.ГлобальнаяОбласть памятиДинамическаяСтатическаяСтековаядисциплинаДисциплина произвольногораспределенияРаспределяемаяпрограммистомРаспределяемаякомпиляторомКлассы памятиЛокальная память - это область памяти, которая выделяется в началевыполнения некоторого фрагмента результирующей программы (блока, функции,оператора…) и может быть освобождена по завершении выполнения данногофрагмента.
Доступ к локальной области памяти всегда запрещен за пределамитого фрагмента программы, в котором она выделяется.Глобальная память - это область памяти, которая выделяется один раз приинициализации результирующей программы и действует все время выполненияпрограммы. Как правило, глобальная область памяти доступна из любой частиисходной программы.Статическая память - это область памяти, размер которой известен на этапекомпиляции.
Для статической памяти компилятор порождает некоторый адрес (какправило, относительный), и дальнейшая работа с ней происходит относительноэтого адреса.Динамическая память - это область памяти, размер которой становитсяизвестным только на этапе выполнения результирующей программы. Длядинамической памяти компилятор порождает фрагмент кода, который отвечает зараспределение памяти (ее выделение и освобождение). Как правило, сдинамическими областям памяти связаны многие операции с указателями и сэкземплярами объектов (классов) в ООЯП.Динамические области памяти можно разделить на динамические областипамяти, выделяемые пользователем и непосредственно компилятором.Методы динамического распределения памятиЯвное выделение блоков фиксированного размера:свободнозанятоЯвное выделение блоков переменного размера:свободнозанятоНеявное выделение динамической памятиНеявно выделяемые блоки памяти могут быть фиксированного илипеременного размера.При неявном динамическом выделении и освобождении блоков памяти,выделяемые блоки обычно имеют следующую структуру:- размер блока (если блок фиксированного размера, то эта информация в нёмне хранится.);- счётчик ссылок, пометка (обычно есть либо одно, либо другое):Счетчик ссылок подсчитывает количество указателей в программе, которыессылаются на этот блок (например, при p = q, один счётчик (для блока, на которыйуказывал указатель p) уменьшается на единицу, а другой увеличивается), еслисчётчик равен нулю, то блок не используется и его можно освободить.
Существуетпроблема циклических ссылок, когда счётчики всегда > 0.Пометка фиксирует, задействован данный блок или не задействован, т.е. упрограммы есть хотя бы один указатель, ссылающийся на этот блок. В некоторыймомент начинает работать «сборщик мусора». Он помечает все блоки какнедостижимые, а затем начинает анализ текущих указателей программы, чтоявляется очень трудоемким процессом. Блоки, на которые ничего не указывает,считаются свободными.- указатели на блоки- заказанная память, необходимая для размещения объектов программы.Общие принципы генерации объектного кодаПри генерации объектного кода компилятор переводит текстпрограммы во внутреннем представлении в текст программы навыходном языке (как правило, машинном).Генерация объектного кода происходит на основе: определенной на фазе анализа компиляциисинтаксической структуры программы, информации, хранящейся в таблице идентификаторов, результата распределения памяти.Характер и сложность отображения промежуточного представленияпрограммы в последовательность команд на машинном языке зависитот языка внутреннего представления и архитектуры вычислительнойсистемы, на которую ориентирована результирующая программа.Часто для построения кода результирующей программыкомпиляторы используют синтаксически управляемый перевод..