На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Задача управления основной памятью



Основная память является одним из наиболее важных ресурсов вычислительной системы. В соответствии с фундаментальными принципами, сформулированными Джоном фон Нейманом более 60 лет назад, выполняемые процессором команды и обрабатываемые данные должны размещаться в основной памяти, занимая выделенные им области. Каждая команда и каждый элемент данных располагаются в памяти на строго фиксированных местах, описываемых в машинных командах в виде адресов.



Назначение адресов командам и данным выполняется при трансляции программы. При разработке программы вместо адресов используются символические имена, замена которых адресами является одной из основных задач транслирующих программ (к ним можно отнести и программы-ассемблеры, переводящие символический код на языке ассемблера в машинный код). После трансляции адресные взаимосвязи между командами и данными становятся весьма жесткими. Многие команды в качестве своих операндов содержат адреса обрабатываемых элементов данных или адреса других команд. При этом, как правило, важным является не абсолютное расположение команд и данных в памяти, а их размещение относительно друг друга. Отсюда возникают две разновидности исполняемого кода, формируемого трансляторами: абсолютный и перемещаемый код.

Код в абсолютном формате жестко привязан к его будущему расположению в основной памяти. Такой код вместе со своими данными может размещаться в памяти, только начиная со строго заданного адреса. Данный адрес называют адресом загрузки, и меняться он для однажды созданного кода не может. В этом случае все команды и элементы данных имеют четко определенные неизменяемые адреса, раз и навсегда (до следующей перетрансляции) прописанные в операндных частях машинных команд. Большим достоинством такого кода является высокая скорость его загрузки в память и выполнения процессором, а большим недостатком – невозможность изменения адреса загрузки. Поэтому данная разновидность применяется только в специальных целях, например – при создании важнейших системных модулей, размещение которых в памяти всегда неизменно и выполняется только один раз при загрузке системы.

Код в перемещаемом формате, как следует из его названия, может размещаться в памяти, начиная с любого адреса. В таком коде важнейшим понятием является расположение команды или элемента данных относительно начального нулевого адреса – так называемое смещение. Именно использование смещений вместо абсолютных адресов в операндах машинных команд позволяет размещать код в любом месте памяти, поскольку величина смещения НЕ изменяется при изменении адреса загрузки. Платой за такую гибкость является необходимость выполнения дополнительной работы при загрузке, связанной с настройкой адресных операндов на текущий адрес загрузки. Поскольку создаваемые при трансляции адреса не соответствуют реальному размещению кода в памяти, их можно назвать виртуальными. Именно этот способ является основным в настоящее время при создании подавляющего числа программ, особенно прикладных.

Преобразование виртуальных адресов (ВА) в физические адреса (ФА) может выполняться в разные моменты времени: либо при загрузке кода в память, либо непосредственно при выполнении команд процессором. Первый подход используется, если система не поддерживает механизм виртуальной памяти. В этом случае специальная системная программа “перемещающий загрузчик” размещает запускаемый код в памяти по заданному текущему адресу загрузки и заменяет в командах смещения реальными физическими адресами. После такой настройки размещенный в памяти код может выполняться процессором, поскольку все связи между командами и данными будут иметь свои “законные” значения. Это приводит к более медленной загрузке, но зато выполнение команд происходит также быстро, как и для абсолютного кода.

К сожалению, данный метод плохо подходит для многозадачных систем. Это связано с тем, что современные массовые приложения требуют больших объемов памяти и за этими запросами не могут угнаться даже постоянно возрастающие доступные объемы основной памяти. Поэтому одновременное размещение в памяти кода и данных сразу нескольких таких “монстров” (в числе которых и сами операционные системы), как правило, невозможно. Часть кода и данных запущенных программ (как прикладных, так и системных) хранится на диске, загружаясь в основную память лишь по необходимости. Поскольку пользователь в условиях “вседозволенной” многозадачности может переключаться между работающими приложениями в любом нужном ему порядке, за время существования процесса некоторые части его кода и данных могут многократно загружаться в память с диска и перемещаться обратно на диск.

Самое интересное в том, что повторная загрузка кода с диска в память может выполняться в совершенно разные области! Этот механизм, известный как виртуальная память, требует хранения кода на диске в своем “родном” виртуальном виде, т.е. с использованием виртуальных адресов. Преобразование ВА в ФА в этом случае выполняется в момент непосредственного обращения процессора по виртуальному адресу, т.е. при выполнении потока команд. Ясно, что для максимально быстрого выполнения кода такие преобразования должны выполняться как можно быстрее, и без аппаратной поддержки здесь обойтись нельзя. Именно поэтому все основные современные процессоры в своей архитектуре так или иначе поддерживают механизм преобразования адресов.

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

В связи с этим вводится понятие виртуального адресного пространства (ВАП) как потенциально возможного диапазона изменения адресов. Размерность ВАП определяется архитектурой базового процессора (в первую очередь разрядностью шины адреса) и возможностями ОС. Так, все 32-х разрядные процессоры обеспечивают ВАП в объеме 232 = 4 Гбайт, а процессоры Pentium IV – и того больше – 236 = 64 Гбайт. Процессоры типа IA-64 обеспечивают уже 264 байт. Правда, из этого огромного (пока!) объема часть адресов отводится на системные нужды (например, около 2 Гб в системах Windows), но и оставшихся хватит самым “прожорливым” программам. Ясно, что ВАП значительно больше физического адресного пространства (ФАП), определяемого объемом установленной на компьютере памяти, и эта тенденция сохранится в обозримом будущем.

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

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



Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, теория программирования, лекции по программированию, память, операционные системы





Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.


Рецензии на книги
Как побороть нервозность и раздражительность


© upread.ru 2013-2023
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.