Перейти к содержанию

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

Эта статья написана в рамках энциклопедии Руниверсалис и находится в стадии проработки и развития
Материал из энциклопедии Руниверсалис

Виртуа́льная па́мять (англ. virtual memory) — компьютерная память, сформированная операционной системой (ОС) на базе основной (оперативной памяти) и внешней памяти, размещённой на накопителе прямого доступа [напр., на твёрдотельном накопителе SSD (Solid State Drive), жёстком диске HDD (Hard Disk Drive) и др.].

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

Основы технологии

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

Применение виртуальной памяти позволяет повысить производительность компьютера за счёт увеличения числа одновременно выполняющихся процессов. Повышение надёжности функционирования достигается путём изолирования одновременно выполняющихся программ, процессам которых ОС выделяет непересекающиеся части виртуального адресного пространства.[1][2][3][4].

История

До изобретения виртуальной памяти программы, размер которых превышал объём доступной оперативной памяти, должны были содержать описание управления оперативной и внешней памятью. Изобретение виртуальной памяти устранило необходимость такого описания и создало предпосылки для повышения производительности труда программистов.[5]

Понятие «виртуальная память» было введено в 1956 году немецким физиком Фрицем-Рудольфом Гюнтшем (нем. Fritz-Rudolf Güntsch) из Берлинского технического университета в его докторской диссертации «Логическое проектирование цифровой вычислительной машины с несколькими асинхронными вращающимися барабанами и автоматическим высокоскоростным управлением памятью». В ней описывается машина с 6 блоками памяти на магнитных сердечниках ёмкостью 100 слов каждый и адресным пространством в 1000 блоков по 100 слов. Аппаратное обеспечение машины автоматически перемещает блоки между основной и внешней памятью на магнитных барабанах.[6][7] Подкачка страниц впервые была реализована в Манчестерском университете как способ расширения памяти компьютера Atlas путём объединения его основной памяти на магнитных сердечниках объёмом 16000 слов с памятью на магнитных барабанах ёмкостью 96000 слов. Первая поставка машины Atlas состоялась в 1962 году, но работающие прототипы подкачки страниц были разработаны уже в 1959 году.[5][8][9] В 1961 году Burroughs Corporation независимо выпустила первый промышленно производившийся компьютер с виртуальной памятью B5000, использующий сегментацию вместо подкачки страниц.[10][11] В 1965 году виртуальная память была реализована в отечественной машине БЭСМ-6, хотя реализованный механизм не позволял расширить 15-разрядное адресное пространство процесса и ограничивал удобство программирования.[12]

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

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

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

В большинстве современных операционных систем виртуальная память организуется с помощью страничной адресации. Оперативная память делится на страницы: области памяти фиксированной длины (например, 4096 байт[14]), которые являются минимальной единицей выделяемой памяти (то есть даже запрос на 1 байт от приложения приведёт к выделению ему страницы памяти). Исполняемый процессором пользовательский поток (процесс) обращается к памяти с помощью адреса виртуальной памяти, который делится на номер страницы и смещение внутри страницы. Процессор преобразует номер виртуальной страницы в адрес соответствующей ей физической страницы при помощи буфера ассоциативной трансляции (TLB). Если ему не удалось это сделать, то требуется дозаполнение буфера путём обращения к таблице страниц (так называемый Page Walk), что может сделать либо сам процессор, либо операционная система (в зависимости от архитектуры)[15]. Если страница была выгружена из оперативной памяти, то операционная система подкачивает страницу с жёсткого диска в ходе обработки события Page fault (см. свопинг, подкачка страниц). При запросе на выделение памяти операционная система может «сбросить» на жёсткий диск страницы, к которым давно не было обращений. Критические данные (например, код запущенных и работающих программ, код и память ядра системы) обычно находятся в оперативной памяти. Исключения существуют, но они не касаются тех частей, которые отвечают за обработку аппаратных прерываний, работу с таблицей страниц и использование файла подкачки.

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

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

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

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

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

См. также

Примечания

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

Литература

Ссылки