Здравствуйте! Когда появится возможность сдать экзамен на сертификат? |
Адресное пространство и виртуальная память
Физический адрес, прямая адресация, адресное пространство про-граммы. Сегментная адресация: сегменты, их назначение, виртуальный адрес, адресное преобразо-вание; виртуальная память: страничная адресация, страницы, страничное адресное преобразование и их использование при реализации виртуальной памяти; замещение страниц физической памяти, выделение страниц по мере необходимости.
ФИЗИЧЕСКИЙ АДРЕС И ПРЯМАЯ АДРЕСАЦИЯ
При старте программы операционная система создаёт для нее специальный процесс. Можно сказать, что процесс является экземпляром программы, точнее - запущенным на компьютере экземпляром. Как уже упоминалось выше, одновременно на компьютере может быть запущено не-сколько экземпляров одной и той же программы, с чем Вы, наверняка, сталкивались - например, работая в Windows, легко запустить несколько экземпляров текстового редактора "Блокнот". Далее мы иногда будем использовать термины процесс и программа как сино-нимы считая, что из контекста понятно, о чём идёт речь.
В оперативную память созданного процесса копируется код соответствующей программы, а также выделяется память для данных программы. Процессор взаимодействует с этой памятью посредством адресов. Система адресации у современных компьютеров оказывается непростой, и мы начнём её изучать с понятия физического адреса.
Физический адрес (Physical Address) - это номер ячейки в оперативной памяти. Зная этот номер, процессор непосредственно обращается в нужное место оперативной памяти за необходимыми данными.
Когда мы говорим об адресуемой ячейке в оперативной памяти, то мы имеем в виду ма-шинное слово, которое, как рассказывалось в предыдущих лекциях, является минимально адресуе-мый фрагмент памяти.
Многие ЭВМ прошлых поколений, а также простые современные вычислительные уст-ройства с позволяют своим программам обращаться к оперативной памяти напрямую, по физическо-му адресу, минуя всевозможные адресные преобразования, о которых пойдёт речь в этой лекции. Такая организация работы с памятью называется прямой адресацией.
Прямая адресация - это механизм использования в ма-шинном коде программ реальных физических адресов в оперативной памяти, без использования ад-ресных преобразований.
Хотя данная схема, на первый взгляд, выглядит естественной, она не обладает достаточ-ной гибкостью - ведь в действительности не всё так просто! Поэтому в современных персональных компьютерах, смартфонах, планшетах и других сложных вычислительных устройствах прямая адресация не применяется. И нам есть о чём поговорить в рамках данной лекции.
Дадим теперь определения адресного пространства программы. Казалось бы, это - вся оперативная память, которая выделяется процессу. Однако это не так, поскольку программа может оперировать с оперативной памятью большего объёма, чем выделено её процессу. Для этого исполь-зуется механизм виртуальной памяти, о котором речь пойдёт чуть ниже. А тут мы дадим корректное определение адресного пространства программы
Адресное пространство (Address Space) - это множество адресов, допустимое для использования программой.
В частности, значения указателей в программах на языке C, работающих на компьютерах семейства процессоров Intel x86, являются элементами адресного про-странства.
СЕГМЕНТНАЯ АДРЕСАЦИЯ
Память, которая выделяется процессу при старте операционной системой, является набо-ром сегментов.
Сегмент - это фрагмент оперативной памяти, выделяе-мый операционной системой процессу.
Размер и конкретное расположение сегментов процесса операционная система выбирает, исходя из следующих параметров:
- размер машинного кода программы;
- размер её данных;
- оптимизация распределения памяти данного процесса с точки зрения других запущенных процессов, а также, возможно, процессов, которые могут быть запущены в ближайшем буду-щем.
Рассмотрим классическую (упрощённую) схему памяти процесса, когда эта память состо-ит из сегмента кода, сегмента данных и сегмента стека. Адреса внутри сегментов формируются как смещения относительно начала сегмента. Код программы знает о сегментах и оперирует этими сме-щениями. Например, в операции сложения вида регистр/память адрес в памяти для второго операнда указывается в виде смещения от начала сегмента данных (напомним, что именно там хранятся все переменные программы). Таким образом, реальный физический адрес, по которому должен обратиться процессор, вычисляются уже внутри процессора, а последний в свою очередь, знает физические адреса начала каждого сегмента. Итак, мы подошли к понятию виртуального адреса и адресного преобразования.
Адрес, с которым непосредственно работает программа, называет-ся виртуальным адресом (Virtual Address).
Адресное преобразование (Address Conversion) - это ме-ханизм вычисления физического адреса по виртуальному.
Отметим, что сегментная организация памяти процесса является не единственным источ-ником виртуальных адресов.
Рассмотрим теперь подробнее сегменты процесса.
Сегмент кода хранит в оперативной памяти машинный код про-граммы.
Сегмент данных хранит глобальные переменные программы (так называемые статические данные), а также используется для кучи (heap) в том случае, если в программе используются динамические данные. Размер всего сегмента данных известен во время запуска программы, но память для кучи выделяется в нём по мере исполнения программы, поскольку на мо-мент запуска не понятно, сколько программе понадобится динамической памяти - это зависит от конкретного сценария исполнения программы, поскольку динамическая память запрашивается с уровня прикладной программы, и её использование организует сам программист - автор програм-мы. Соответственно, куча является "динамическим пузырём" нефиксированного размера, "раздувающийся" по мере запросов программы.
В программах на языке C для того, чтобы запросить динамическую память, программист использует функцию malloc, а в C++ - оператор new. Поскольку динамическая память выделяется "в ручном" режиме, то и освобождаться она должна также "вручную", с помощью специальных функций (функция free в С, оператор delete в C++). Меха-низм динамической памяти требует от программиста внимательности и организованности, но взамен предоставляет гибкость и возможность создавать более эффективные программы. Однако при использовании этого механизма программист может допустить (и допускает!) сложно обнаружимые ошибки. Это стало причиной того, что в современных промышленных языках, таких как Java, C#, Python использование динамической памяти доступно только через выделение объектов, а не массивов байтов, как в C, а освобождение - посредством автоматической сборки мусора, освобождающей память объектов, на которые больше нет ссылок из программы.
Сегмент стека используется процессом для организации вызо-вов процедур (методов) программы. Он реализует структуру данных под названием стек.