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

Материал из Википедии — свободной энциклопедии

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

управления памятью компьютера, позволяющий выполнять программы, требующие больше оперативной памяти, чем имеется в компьютере, путём автоматического перемещения частей программы между основной памятью и вторичным хранилищем (например, жёстким диском)[1][2][3]. Для выполняющейся программы данный метод полностью прозрачен и не требует дополнительных усилий со стороны программиста
, однако реализация этого метода требует как аппаратной поддержки, так и поддержки со стороны операционной системы.

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

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

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

В настоящее время виртуальная память аппаратно поддерживается в большинстве современных процессоров

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

История

В

1950-е годы все программы, размер которых превышал объём оперативной памяти, должны были содержать логику управления оперативной и внешней памятью, такую как оверлей. В связи с этим виртуальная память была введена не только для увеличения объёма оперативной памяти, но и для того, чтобы сделать такое увеличение наиболее простым в использовании для программистов.[4] Для поддержки мультипрограммирования и многозадачности во многих ранних компьютерных системах разделение памяти между несколькими программами осуществлялось без виртуальной памяти, с помощью сегментации (например, в компьютерах PDP-10
).

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

Burroughs Corporation независимо выпустила первый промышленно производившийся компьютер с виртуальной памятью B5000, использующий сегментацию вместо подкачки страниц.[9][10]
В 1965 году виртуальная память была реализована в отечественной машине БЭСМ-6, хотя реализованный механизм не позволял расширить 15-разрядное адресное пространство процесса и ограничивал удобство программирования.[11]

Прежде чем виртуальная память смогла быть использована в распространённых операционных системах, должен был быть решен ряд проблем. Динамическая трансляция адресов требовала дорогого и сложного в изготовлении специального оборудования. Первые реализации замедляли доступ к памяти.[4] Существовали опасения, что новые общесистемные алгоритмы, использующие внешнюю память, будут менее эффективны, чем ранее использовавшиеся алгоритмы конкретных приложений. К 1969 году дебаты вокруг виртуальной памяти для промышленно выпускаемых компьютеров были завершены: команда исследователей из IBM под руководством Дэвида Сейра (англ. David Sayre) показала, что созданная ими система виртуальной памяти во всех отношениях превосходит лучшие системы, управляемые вручную.[4][12] Первым мини-компьютером, в котором была использована виртуальная память, был норвежский Norsk Data (но.) Nord-1 (но.). В 1970-е годы реализации виртуальной памяти появились в других мини-компьютерах, наиболее известным является VAX, работающий под управлением операционной системы VMS.

Виртуальная память в архитектуре

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

Страничная организация виртуальной памяти

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

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

Сегментная организация виртуальной памяти

Механизм организации виртуальной памяти, при котором виртуальное пространство делится на части произвольного размера — сегменты. Этот механизм позволяет, к примеру, разбить данные процесса на логические блоки.[15] Для каждого сегмента, как и для страницы, могут быть назначены права доступа к нему пользователя и его процессов. При загрузке процесса часть сегментов помещается в оперативную память (при этом для каждого из этих сегментов операционная система подыскивает подходящий участок свободной памяти), а часть сегментов размещается в дисковой памяти. Сегменты одной программы могут занимать в оперативной памяти несмежные участки. Во время загрузки система создает таблицу сегментов процесса (аналогичную таблице страниц), в которой для каждого сегмента указывается начальный физический адрес сегмента в оперативной памяти, размер сегмента, правила доступа, признак модификации, признак обращения к данному сегменту за последний интервал времени и некоторая другая информация. Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же участок оперативной памяти, в который данный сегмент загружается в единственном экземпляре. Система с сегментной организацией функционирует аналогично системе со страничной организацией: время от времени происходят прерывания, связанные с отсутствием нужных сегментов в памяти, при необходимости освобождения памяти некоторые сегменты выгружаются, при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический. Кроме того, при обращении к памяти проверяется, разрешен ли доступ требуемого типа к данному сегменту.

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

Недостатком данного метода распределения памяти является фрагментация на уровне сегментов и более медленное по сравнению со страничной организацией преобразование адреса.

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

См. также

Примечания

  1. 1 2 Э. Танненбаум. Архитектура компьютера = Structured Computer Organization. — 5-е изд. — СПб.: Питер, 2013. — С. 476. — 884 с. — ISBN 978-5-469-01274-0.
  2. Ч. Кэпс. Р. Стаффорд. VAX: Программирование на языке ассемблера и архитектура = VAX assembly language and architecture. — М.: Радио и связь, 1991. — С. 310. — 416 с. — ISBN 5-256-00706-8.
  3. Морс С.П., Алберт Д.Д. Архитектура микропроцессора 80286 = The 80286 architecture. — М.: Радио и связь, 1990. — С. 167. — 304 с. — ISBN 5-256-00466-2.
  4. 1 2 3 4 Peter J. Denning. Before Memory Was Virtual // In the Beginning: Recollections of Software Pioneers. — 1997. Архивировано 10 января 2017 года.
  5. Elke Jessen. Origin of the Virtual Memory Concept // IEEE Annals of the History of Computing. — 2004. — Т. 26, вып. 4. — С. 71—72.
  6. .
  7. R. J. Creasy. The origin of the VM/370 time-sharing system // IBM Journal of Research & Development. — 1981. — Т. 25, № 5. — С. 486. Архивировано 7 мая 2016 года.
  8. Atlas design includes virtual memory Архивная копия от 13 мая 2016 на Wayback Machine — Computer50, University of Manchester 1996
  9. Ian Joyner on Burroughs B5000 (англ.)
  10. Harvey G. Cragon. Memory Systems and Pipelined Processors. — Jones and Bartlett Publishers, 1996. — С. 113. — ISBN 0-86720-474-5.
  11. Королёв Л. Н. Архитектура ЭВМ БЭСМ-6. Из книги Л. Н. Королёва «Структуры ЭВМ и их математическое обеспечение» (1978). PARALLEL.RU - Информационно-аналитический центр по параллельным вычислениям:. Дата обращения: 21 ноября 2016. Архивировано 13 апреля 2001 года. ()
  12. .
  13. 1 2 Harvey G. Cragon. Memory Systems and Pipelined Processors. — Jones and Bartlett Publishers, 1996. — С. 121. — ISBN 0-86720-474-5.
  14. Patterson, Hennessy «Computer organisation and Design. Hardware Software Interface.» 4th edition. ISBN 9780080886138 Chapter 5.4, page 503  (англ.)
  15. Microsoft Windows
    сегментная адресация не используется и заменена делением памяти на секции, что в сущности почти одно и то же.

Литература

Ссылки