Опубликован: 08.11.2022 | Доступ: свободный | Студентов: 80 / 0 | Длительность: 06:05:00
Лекция 12:

Адресное пространство и виртуальная память

< Лекция 11 || Лекция 12: 12 || Лекция 13 >

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

ФИЗИЧЕСКИЙ АДРЕС И ПРЯМАЯ АДРЕСАЦИЯ

При старте программы операционная система создаёт для нее специальный процесс. Можно сказать, что процесс является экземпляром программы, точнее - запущенным на компьютере экземпляром. Как уже упоминалось выше, одновременно на компьютере может быть запущено не-сколько экземпляров одной и той же программы, с чем Вы, наверняка, сталкивались - например, работая в Windows, легко запустить несколько экземпляров текстового редактора "Блокнот". Далее мы иногда будем использовать термины процесс и программа как сино-нимы считая, что из контекста понятно, о чём идёт речь.

В оперативную память созданного процесса копируется код соответствующей программы, а также выделяется память для данных программы. Процессор взаимодействует с этой памятью посредством адресов. Система адресации у современных компьютеров оказывается непростой, и мы начнём её изучать с понятия физического адреса.

Физический адрес (Physical Address) - это номер ячейки в оперативной памяти. Зная этот номер, процессор непосредственно обращается в нужное место оперативной памяти за необходимыми данными.

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

Многие ЭВМ прошлых поколений, а также простые современные вычислительные уст-ройства с позволяют своим программам обращаться к оперативной памяти напрямую, по физическо-му адресу, минуя всевозможные адресные преобразования, о которых пойдёт речь в этой лекции. Такая организация работы с памятью называется прямой адресацией.

Прямая адресация - это механизм использования в ма-шинном коде программ реальных физических адресов в оперативной памяти, без использования ад-ресных преобразований.

Хотя данная схема, на первый взгляд, выглядит естественной, она не обладает достаточ-ной гибкостью - ведь в действительности не всё так просто! Поэтому в современных персональных компьютерах, смартфонах, планшетах и других сложных вычислительных устройствах прямая адресация не применяется. И нам есть о чём поговорить в рамках данной лекции.

Дадим теперь определения адресного пространства программы. Казалось бы, это - вся оперативная память, которая выделяется процессу. Однако это не так, поскольку программа может оперировать с оперативной памятью большего объёма, чем выделено её процессу. Для этого исполь-зуется механизм виртуальной памяти, о котором речь пойдёт чуть ниже. А тут мы дадим корректное определение адресного пространства программы

Адресное пространство (Address Space) - это множество адресов, допустимое для использования программой.

В частности, значения указателей в программах на языке C, работающих на компьютерах семейства процессоров Intel x86, являются элементами адресного про-странства.

СЕГМЕНТНАЯ АДРЕСАЦИЯ

Память, которая выделяется процессу при старте операционной системой, является набо-ром сегментов.

Сегмент - это фрагмент оперативной памяти, выделяе-мый операционной системой процессу.

Размер и конкретное расположение сегментов процесса операционная система выбирает, исходя из следующих параметров:

  • размер машинного кода программы;
  • размер её данных;
  • оптимизация распределения памяти данного процесса с точки зрения других запущенных процессов, а также, возможно, процессов, которые могут быть запущены в ближайшем буду-щем.

Рассмотрим классическую (упрощённую) схему памяти процесса, когда эта память состо-ит из сегмента кода, сегмента данных и сегмента стека. Адреса внутри сегментов формируются как смещения относительно начала сегмента. Код программы знает о сегментах и оперирует этими сме-щениями. Например, в операции сложения вида регистр/память адрес в памяти для второго операнда указывается в виде смещения от начала сегмента данных (напомним, что именно там хранятся все переменные программы). Таким образом, реальный физический адрес, по которому должен обратиться процессор, вычисляются уже внутри процессора, а последний в свою очередь, знает физические адреса начала каждого сегмента. Итак, мы подошли к понятию виртуального адреса и адресного преобразования.

Адрес, с которым непосредственно работает программа, называет-ся виртуальным адресом (Virtual Address).

Адресное преобразование (Address Conversion) - это ме-ханизм вычисления физического адреса по виртуальному.

Отметим, что сегментная организация памяти процесса является не единственным источ-ником виртуальных адресов.

Рассмотрим теперь подробнее сегменты процесса.

Сегмент кода хранит в оперативной памяти машинный код про-граммы.

Сегмент данных хранит глобальные переменные программы (так называемые статические данные), а также используется для кучи (heap) в том случае, если в программе используются динамические данные. Размер всего сегмента данных известен во время запуска программы, но память для кучи выделяется в нём по мере исполнения программы, поскольку на мо-мент запуска не понятно, сколько программе понадобится динамической памяти - это зависит от конкретного сценария исполнения программы, поскольку динамическая память запрашивается с уровня прикладной программы, и её использование организует сам программист - автор програм-мы. Соответственно, куча является "динамическим пузырём" нефиксированного размера, "раздувающийся" по мере запросов программы.

В программах на языке C для того, чтобы запросить динамическую память, программист использует функцию malloc, а в C++ - оператор new. Поскольку динамическая память выделяется "в ручном" режиме, то и освобождаться она должна также "вручную", с помощью специальных функций (функция free в С, оператор delete в C++). Меха-низм динамической памяти требует от программиста внимательности и организованности, но взамен предоставляет гибкость и возможность создавать более эффективные программы. Однако при использовании этого механизма программист может допустить (и допускает!) сложно обнаружимые ошибки. Это стало причиной того, что в современных промышленных языках, таких как Java, C#, Python использование динамической памяти доступно только через выделение объектов, а не массивов байтов, как в C, а освобождение - посредством автоматической сборки мусора, освобождающей память объектов, на которые больше нет ссылок из программы.

Сегмент стека используется процессом для организации вызо-вов процедур (методов) программы. Он реализует структуру данных под названием стек.

< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Наталья Ра
Наталья Ра

Здравствуйте! Когда появится возможность сдать экзамен на сертификат?