Виртуальная память

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 14:19, 18 марта 2017.
Схема устройства виртуальной памяти

В вычислительной технике виртуальная память это метод управления памятью, которая реализуется используя одновременно аппаратные и программные средства. При этом адреса памяти, используемые программами - "виртуальные адреса" транслируются в адреса физической памяти компьютера. В этом случае память с точки зрения процессов и программ представляется как непрерывное адресное пространство или набор непрерывных сегментов. Операционная система управляет виртуальными адресными пространствами и создаёт связь между физической и виртуальной памятью. Для управления адресами в ЦПУ есть устройство управления памяти (англ. memory managment unit - MMU), которое автоматические транслирует виртуальные адреса в физические.Программное обеспечение в операционной системе может расширять данную функциональность, предоставляя виртуальные адресные пространства большие, чем может вместить реальная оперативная память компьютера.

Основные плюсы при использовании виртуальной памяти:

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

Свойства

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

Использование

Виртуальная память это неотъемлемая часть современной компьютерной архитектуры. Реализация виртуальной памяти зачастую требует поддержку аппаратными средствами, часто в виде устройства управления памятью встроенного в ЦПУ (Эмуляторы и виртуальные машины могут использовать аппаратную поддержку, чтобы увеличить производительность их реализации виртуальной памяти.[Источник 1]). В следствии этого, старые операционные системы, например те, что использовались для мейнфреймов 1960-ых годов или персональных компьютеров до середины 80-ых годов (Dos),[Источник 2] в целом не имели поддержки виртуальной памяти. Исключения были для мейнфреймов 1960-ых годов:

Операционная система для компьютера Apple Lisa - пример операционной системы 80-ых имевшей поддержку виртуальной памяти.

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

Большинство современных операционных систем, использующий виртуальную память, запускают каждый процесс в отдельном адресном пространстве. Тем не менее, некоторые старые операционные системы (такие как OS/VS1 и OS/VS2 SVS) и даже некоторые современные (например IBM i) запускают все процессы едином адресном пространстве виртуальной памяти.

Встроенные системы и другие компьютерные системы специального назначения, которые требуют очень быстрого или/и строго определённого времен отклика могут не использовать виртуальной память, чтобы повысить детерменизм операций: системы с виртуальной память могут активировать непредсказуемые события, которые могут вызвать джиттер, во время операций ввода/ввывода.

История

В 1940-ых и 50-ых все крупные программы должны были реализовывать логику управления памятью - оверлеи. Виртуальная предназначалась не только, чтобы расширить реальную оперативную память, но и облегчить использование памяти программистам.[Источник 3] Чтобы использовать мультипрограммирование и многозадачность многие ранние системы разделяли память между множеством программ без использования виртуальной памяти (например ранние модели PDP-10 через регистры).

Концепция виртуальной памяти впервые была разработана немецким физиком Fritz-Rudolf Güntsch в Берлинском техническом университете в его докторской диссертации "Логическое построение цифровых компьютеров несколькими асинхронными вращающимеся барабанами и автоматическими высокоскоростными операциями с памятью" (англ. Logical Design of a Digital Computer with Multiple Asynchronous Rotating Drums and Automatic High Speed Memory Operation). В диссертации описывалась машина с 6 блоками по 100 машинным слов основной памяти и адресное пространство из 1000 блоков по 100 машинных слов, с специальными аппаратными средствами автоматические перемещающие блоки между основной и вторичной памятью. Подкачка страниц впервые была реализована в Манчестерском университете как способ расширить реальную оперативную память компьютера Atlas совместив 16 тысяч слов основной памяти с дополнительными 96 тысячами слов вторичной памяти. Первый Atlas был введён в эксплуатацию в 1962-ом году, но рабочие прототипы подкачки страниц были реализованы к 1959-му году. [Источник 4][Источник 5] В 1961-ом году, Burroughs Corporation самостоятельно выпустила первый коммерческий компьютер с виртуальной памятью - B5000, с сегментной адресацией памяти, но без подкачки страниц.

Перед тем как виртуальная память могла быть реализована в основным популярных операционных системах, много проблем должны были быть решены. Динамическая трансляция адресов требовала дорогого и трудно реализуемого специализированного оборудования (первые реализации несколько замедляли доступ к памяти).[Источник 3] Так же существовало беспокойство, что новые общесистемные алгоритмы будут не так эффективно использовать вторичную память, как ранее используемые специальные алгоритмы реализуемые каждым приложением в отдельности. В 1969-ом году дебаты касающиеся использования виртуальной памяти в коммерческих компьютерах закончились,[Источник 3] исследовательская команда IBM, возглавляемая David Sayre показала, что их система виртуальной памяти работает лучше, чем любая управляемая вручную система. Первый миникомпьютер использующий виртуальную память был Норвежский NORD-1, в течении 1970-ых годов, появились другие компьютеры реализующие виртуальную память (например компьютер VAX с системой VMS).

Виртуальная память была реализована в архитектуре x86 вместе с защищённым режимом в процессоре Intel 80286, но его способ подкачки сегментов плохо масштабировался для сегментов большего размера. В процессор Intel 80386 была реализована подкачка страниц под существующем слоем сегментации, позволяя исключение подкачки страниц связывать с другими исключениями не вызывая двойного сбоя. Однако, загрузка дескриптора сегмента была дорогостоящей операции, в результате чего, разработчики операционных систем полагались только на подкачку страниц, а не на комбинацию сегментации и подкачки страниц.

Подкачка страниц

Практические все реализации виртуальной памяти делят виртуальное адресное пространство на страницы: блоки непрерывных виртуальных адресов. Размер страницы на современной системе[1] обычно не меньше 4 килобайт, системы с большим диапазоном виртуальных адресов или количеством реальной оперативной памяти обычно используют более большие размеры страниц.

Таблица страниц

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

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

Супервизор страниц

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

Когда вся реальная оперативная память уже использована, супервизор страниц должен выгрузить какую-либо страницу во вторичную память, чтобы загрузить нужную. Супервизор использует алгоритм замещения страниц (например LRU), чтобы определить какую именно страницу можно выгрузить.

Закреплённые страницы

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

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

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

V=R режим

В OS/VS1 и похожих операционных системах, некоторые части системной памяти работают в режиме "Virtual-Real", часто сокращаемый до "V=R". В этом режиме каждый виртуальный адрес соответствует такому же реальному адресу. Этот режим используется для механизма прерываний, для супервизора страниц и таблицы страниц в старых операционных системах, и для приложений использующих не стандартное управление вводом/выводом.

Пробуксовка

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

Сегментирование памяти

Сегментирование памяти - это разделение основной памяти компьютера на сегменты (секции). Если компьютерная система использует сегментирование, то адрес на определённое место в памяти состоит из идентификатора сегмента и смещения внутри этого сегмента.

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

Аппаратная реализация

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

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

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

Сегментирование [2] может служить одним из методов реализации защиты памяти.. В обще говоря размер сегмента не фиксирован и может быть равен одному байту.

Сегментирование может быть реализовано различными способами на различном оборудовании, с подкачкой страниц и без неё. Сегментная реализация памяти процессоров Intel x86 не соответствует ни одной из этих моделей.

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

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

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

Сегментирование с подкачкой страниц

Информация ассоциированная с сегментом содержит не действительный адрес сегмента в памяти, а адрес на таблицу страниц этого сегмента. Когда программа ссылается на место в памяти, смещение транслируется в реальный адрес используя таблицу страниц. Сегмент может быть очень просто расширен добавляя ещё одну страницу в таблицу страниц сегмента.

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

Примечания

  1. DOS/VS и OS/VS1 поддерживали страницы размером в 2 килобайта.
  2. А так же подкачка страниц, или сегментирование и подкачка страниц вместе.

Источники

  1. AMD [Электронный ресурс]: AMD-V™ Nested Paging / Дата обращения: 05.03.2017. Режим доступа: http://developer.amd.com/wordpress/media/2012/10/NPT-WP-1%201-final-TM.pdf.
  2. Microsoft [Электронный ресурс]: История версий Windows / Дата обращения: 05.03.2017. Режим доступа: http://support.microsoft.com/kb/32905.
  3. 3,0 3,1 3,2 DenningInstitute.com [Электронный ресурс]: In the Beginning: Recollections of Software Pioneers / Дата обращения: 05.03.2017. Режим доступа: http://denninginstitute.com/pjd/PUBS/bvm.pdf.
  4. pages.cs.wisc.edu [Электронный ресурс]: The origin of the VM/370 time-sharing system / Дата обращения: 05.03.2017. Режим доступа: http://pages.cs.wisc.edu/~stjones/proj/vm_reading/ibmrd2505M.pdf.
  5. computer50.org [Электронный ресурс]: Atlas design includes virtual memory / Дата обращения: 05.03.2017. Режим доступа: http://www.computer50.org/kgill/atlas/atlas.html.