Понятие виртуальной памяти

      Комментарии к записи Понятие виртуальной памяти отключены

Разработчикам программного обеспечения часто приходится решать проблему размещения в памяти больших программ, размер которых превышает объем доступной оперативной памяти. Один из вариантов решения данной проблемы – организация структур с перекрытием – рассмотрен в предыдущей лекции. При этом предполагалось активное участие программиста в процессе формирования перекрывающихся частей программы. Развитие архитектуры компьютеров и расширение возможностей операционной системы по управлению памятью позволило переложить решение этой задачи на компьютер. Одним из главных достижений стало появление виртуальной памяти (virtual memory). Впервые она была реализована в 1959 г. на компьютере Атлас, разработанном в Манчестерском университете.

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

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

Возможность выполнения программы, находящейся в памяти лишь частично, имеет ряд вполне очевидных преимуществ.

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

Таким образом, возможность обеспечения (при поддержке операционной системы) для программы видимости практически неограниченной (характерный размер для 32-разрядных архитектур 232 = 4 Гбайт) адресуемой пользовательской памяти (логическоеадресное пространство) при наличии основной памяти существенно меньших размеров (физическое адресное пространство) – очень важный аспект.

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

Например, 16-разрядный компьютер PDP-11/70 с 64 Кбайт логической памяти мог иметь до 2 Мбайт оперативной памяти. Операционная система этого компьютера тем не менее поддерживала виртуальную память, которая обеспечивала защиту и перераспределение основной памяти между пользовательскими процессами.

Напомним, что в системах с виртуальной памятью те адреса, которые генерирует программа (логические адреса), называются виртуальными, и они формируют виртуальное адресное пространство. Терминвиртуальная памятьозначает, что программист имеет дело с памятью, отличной от реальной, размер которой потенциально больше, чем размер оперативной памяти.

Хотя известны и чисто программные реализации виртуальной памяти, это направление получило наиболее широкое развитие после соответствующей аппаратной поддержки.

Следует отметить, что оборудование компьютера принимает участие в трансляции адреса практически во всех схемах управления памятью. Но в случае виртуальной памяти это становится более сложным вследствие разрывности отображения и многомерности логического адресного пространства. Может быть, наиболее существенным вкладом аппаратуры в реализацию описываемой схемы является автоматическая генерация исключительных ситуаций при отсутствии в памяти нужных страниц (page fault).

Любая из трех ранее рассмотренных схем управления памятью – страничной, сегментной и сегментно-страничной – пригодна для организации виртуальной памяти. Чаще всего используется cегментно-страничная модель, которая является синтезом страничной модели и идеи сегментации. Причем для тех архитектур, в которых сегменты не поддерживаются аппаратно, их реализация – задача архитектурно-независимого компонента менеджера памяти.

Сегментная организация в чистом виде встречается редко.

Память

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

Система памяти конструируется в виде иерархии слоев, которые иллюстрируются на следующем рисунке.

Верхний слой состоит из внутренних регистров ЦП, поэтому при доступе к ним не возникает задержек. Внутренние регистры хранят 32 нс 32 бита на 32-разрядном ЦП или 64×64 бита на 64-разрядном, это составляет менее 1 Кб в обоих случаях. Программы могут управлять регистрами без вмешательства.

В следующем слое находится кэш-память, в основном контролируемая аппаратурой. Она разделена на кэш-строки по 64 байта с адресацией от 0 до 63 в нулевой строке, от 64 до 127 в первой строке и т.д. Наиболее часто используемые строки кэша хранятся в высокоскоростной кэш-памяти, расположенной внутри ЦП. Когда программа должна прочитать слово из памяти, кэш-микросхема определяет, есть ли нужная строка в кэше; если это так, то происходит результативное обращение к кэш-памяти. Запрос удовлетворяется целиком из кэша, и запрос к памяти на шину не выставляется. Удачное обращение к кэшу по времени занимает около двух тактов, а неудачных приводит к обращению к ОЗУ и существенной потере времени. Кэш-память ограничена в размере, что обусловлено ее высокой стоимостью. В некоторых машинах есть два или три уровня кэша, причем каждый последующий медленнее и больше предыдущего.

Далее следует ОЗУ (RAM — Random Acces Memory — память с произвольным доступом) — главная рабочая область запоминающего устройства машины. Все запросы ЦП, которые не могут быть выполнены кэш-памятью, поступают для обработки в ОЗУ.

Далее — магнитный диск. Дисковая память на два порядка дешевле ОЗУ в пересчете на бит и на два порядка больше по величине. У диска есть одна проблема — случайный доступ к данным на нем занимает примерно на три порядка больше времени. Причиной низкой скорости HDD — диск представляет собой механическую конструкцию, он состоит из одной или нескольких металлических пластин, вращающихся со скоростями 5400, 7200 или 10700 об/мин. Механическая вилка с магнитными головками поворачивается над дисками подобно звукоснимателю. Информация записывается на пластины в виде концентрических окружностей. Магнитная головка каждой данной позиции вилки может прочитать кольцо на пластине, называемое дорожкой. Все вместе дорожки для заданной позиции вилки формируют цилиндр. Каждая дорожка разделена на некоторое количество секторов, обычно по 512 байт на сектор. Внешние цилиндры содержат большее количество секторов, чем внутренние. Перемещение головки от одного цилиндра к другому занимает около 1 мс, а перемещение к произвольному цилиндру требует от 5 до 10 мс в зависимости от диска. Когда сектор уже находится под головкой, процесс чтения или записи происходит со скоростью 5 Мб/с для низкоскоростных дисков до 160 Мб/с для высокоскоростных.

Магнитная лента часто используется для создания резервных копий HDD или для хранения очень больших наборов данных. Для доступа к информации на ленте ее нужно поместить в устройство для чтения магнитных лент (стример). Это делает человек или робот. Затем лента перематывается до запрашиваемого блока с информацией. Процесс может длиться минуту. Большое достоинство заключается в том, что они крайне дешевы и мобильны. Это важно для резервных копий, которые нужно содержать отдельно, чтобы они сохранялись после стихийных бедствий (пожара, наводнений). Магнитная лента хранится в другой комнате от компьютера. Срок хранения — 5 лет.

Кроме описанных видов, в компьютерах есть небольшое количество постоянной памяти с произвольным доступом. В отличие от RAM, она не теряет свое содержимое при выключении питания. Она называется ПЗУ или ROM. ПЗУ программируется в процессе производства и после этого его содержимое нельзя изменить. Эта память достаточно быстра и дешева. Программы начальной загрузки компьютера, используемые при запуске, находятся в ПЗУ. Кроме этого, некоторые карты I/O содержат ПЗУ для управления низкоуровневыми устройствами.

Электрические стираемая ПЗУ EEPROM и flash-RAM также энергонезависимы, но их содержимое можно стереть и переписать. Поэтому они используются точно так же, как и ПЗУ. Однако запись данных в них требует намного больше времени, чем запись в ОЗУ. Дополнительное преимущество электрически стираемого ПЗУ и flash-памяти состоит в том, что с их помощью можно исправить ошибки, содержащиеся в программах.

Вид памяти, называемый CMOS (читается смос), является энергозависимым. CMOS используется для хранения текущей даты и времени и конфигурационных параметров, например, указания, с какого HDD производить загрузку. Эта память потребляет энергию от установленного аккумулятора.

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

Виртуальная память — устройство, позволяющее программистам рассматривать ОЗУ как логический объект, не интересуясь его физическим объемом. Принципы работы с виртуальной памятью были разработаны, чтобы задания нескольких пользователей, выполняясь параллельно, могли одновременно присутствовать в ОЗУ. Виртуальная память решает две задачи:

1) защищает программы друг от друга, а ядро ОС — от программ;

2) управляет перемещением программ в памяти.

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

Базовый регистр позволяет программе ссылаться на любую часть памяти, следующую за хранящейся в ней адресом. Предельный регистр запрещает программе обращение к памяти за границы программы. С помощью этой схемы решаются обе задачи защиты и перемещения программ. В результате проверки и преобразования адрес, сформированный программой и называемый виртуальным, переводится в адрес, используемый памятью и называемый физическим. Устройство, которое выполняет проверку и преобразование, называется диспетчером памяти — MMU (Memory Management Unit). Оно расположено в ЦП.

Более сложный диспетчер памяти содержит две пары базовых и предельных регистров. Одна пара — для текста программы, другая — для данных. Появляется возможность делить одну и ту же программу между несколькими пользователями и при этом хранить в памяти только одну копию программы.

Из-за различий в количестве памяти, требующейся для разных программ, их трудно компактно разместить в ОЗУ. Поэтому разработаны системы со страничной организацией памяти, когда программа разбивается на блоки фиксированного размера — страницы (1 страница = 4 Кб). В этом случае обращение программы к ячейке памяти происходит по виртуальной памяти, адрес которой состоит из номера страницы и смещения относительно ее начала. Страницы одной и той же программы могут быть разбросаны по всему ОЗУ. Система разбивки на страницы обеспечивает динамическое соответствие между виртуальным адресом, использующимся программой, и реальным (физическим) адресом ОЗУ. Если программа обращается к странице, отсутствующей в ОЗУ, то диспетчер памяти обнаруживает это и загружает недостающую страницу.

На характеристики памяти в основном влияют два аспекта:

1) кэш скрывает низкую скорость ОЗУ. Когда ОС переключается от одной программы к другой, кэш остается заполненным данными первой программы, а необходимые строки новой программы должны загружаться из физической памяти. Эта операция может стать главной причиной снижения производительности, если происходит слишком часто;

2) при переключении программ регистры управления памятью должны меняться. Вне зависимости от количества этих регистров эта операция занимает некоторое время. Переключение от одной программы к другой — переключение контекста.

Статьи к прочтению:

Лекция 9: Виртуальная память


Похожие статьи: