Виртуальная память: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
 
(не показано 46 промежуточных версий 27 участников)
Строка 1: Строка 1:
'''Виртуа́льная па́мять''' ({{lang-en|virtual memory}}) — метод [[управление памятью|управления памятью]] [[компьютер]]а, позволяющий выполнять программы, требующие больше [[Оперативная память|оперативной памяти]], чем имеется в компьютере, путём автоматического перемещения частей программы между основной памятью и вторичным хранилищем (например, [[жёсткий диск|жёстким диском]])<ref name="Tannenbaum">{{книга
'''Виртуа́льная па́мять''' ({{lang-en|Virtual memory}}) — технология управления памятью ЭВМ, разработанная для многозадачных операционных систем. При использовании данной технологии для каждой программы используются независимые схемы адресации памяти, отображающиеся тем или иным способом на [[физический адрес|физические адреса]] в памяти ЭВМ. Позволяет увеличить эффективность использования памяти несколькими одновременно работающими программами, организовав множество независимых {{не переведено|надо=адресное пространство (информатика)|текст=адресных пространств|есть=:en:Address space}}, и обеспечить [[защита памяти|защиту памяти]] между различными приложениями. Также позволяет программисту использовать больше памяти, чем установлено в компьютере, за счет откачки неиспользуемых [[Страничная память|страниц]] на вторичное хранилище (см. [[Подкачка страниц]]).
| заглавие = Архитектура компьютера
| оригинал = Structured Computer Organization
| автор = Э. Танненбаум
| издание = 5-е изд
| место = СПб.
| издательство = Питер
| год = 2013
| страницы = 476
| страниц = 884
| isbn = 978-5-469-01274-0
}}</ref><ref>{{книга
| автор = Ч. Кэпс. Р. Стаффорд
| заглавие = VAX: Программирование на языке ассемблера и архитектура
| оригинал = VAX assembly language and architecture
| место = М.
| издательство = Радио и связь
| год = 1991
| страницы = 310
| страниц = 416
| isbn = 5-256-00706-8
}}</ref><ref>{{книга
| заглавие = Архитектура микропроцессора 80286
| ссылка = https://archive.org/details/isbn_5256004662
| автор = Морс С.П., Алберт Д.Д.
| оригинал = The 80286 architecture
| место = М.
| издательство = Радио и связь
| год = 1990
| страницы = [https://archive.org/details/isbn_5256004662/page/n166 167]
| страниц = 304
| isbn = 5-256-00466-2
}}</ref>. Для выполняющейся программы данный метод полностью прозрачен и не требует дополнительных усилий со стороны [[программист]]а, однако реализация этого метода требует как аппаратной поддержки, так и поддержки со стороны операционной системы.


В системе с виртуальной памятью используемые программами [[Адрес (информатика)|адреса]], называемые [[виртуальный адрес|виртуальными адресами]], транслируются в [[физический адрес|физические адреса]] в памяти компьютера. Трансляцию виртуальных адресов в физические выполняет аппаратное обеспечение, называемое [[Блок управления памятью|блоком управления памятью]]. Для программы основная память выглядит как доступное и непрерывное [[адресное пространство (информатика)|адресное пространство]] либо как набор непрерывных [[Сегментная адресация памяти|сегментов]] вне зависимости от наличия у компьютера соответствующего объёма оперативной памяти. Управление виртуальными адресными пространствами, соотнесение физической и виртуальной памяти, а также перемещение фрагментов памяти между основным и вторичным хранилищами выполняет операционная система (см. [[подкачка страниц]]).
При использовании виртуальной памяти упрощается программирование, так как программисту больше не нужно учитывать ограниченность памяти или согласовывать использование памяти с другими приложениями. Для программы выглядит доступным и непрерывным все допустимое адресное пространство, вне зависимости от наличия в ЭВМ соответствующего объёма ОЗУ.
<!--
'''Виртуа́льная па́мять''' — технология, которая была разработана с целью увеличения <! — ? — -> общего объема [[память (компьютер)|памяти]], организации множества адресных пространств памяти, их [[защита памяти|защиты]] и автоматизации процесса перемещения машинного кода и данных между основной памятью [[компьютер]]а и вторичным хранилищем. -->


Применение механизма виртуальной памяти позволяет:
Применение виртуальной памяти позволяет:
* освободить программиста от необходимости вручную управлять загрузкой частей программы в память и согласовывать использование памяти с другими программами
* упростить адресацию памяти клиентским программным обеспечением;
* предоставлять программам больше памяти, чем физически установлено в системе
* рационально управлять оперативной памятью компьютера (хранить в ней только активно используемые области памяти);
* в [[Многозадачность|многозадачных]] системах изолировать выполняющиеся программы друг от друга путём назначения им непересекающихся адресных пространств (см. [[защита памяти]])
* изолировать процессы друг от друга (процесс полагает, что монопольно владеет всей памятью).


В настоящее время эта технология имеет аппаратную поддержку на всех современных бытовых процессорах. В то же время во встраиваемых системах и в системах специального назначения, где требуется либо очень быстрая работа, либо есть ограничения на длительность отклика ([[системы реального времени]]) виртуальная память используется относительно редко. Также в таких системах реже встречается многозадачность и сложные [[иерархия памяти|иерархии памяти]].
В настоящее время виртуальная память аппаратно поддерживается в большинстве современных процессоров<ref name="Tannenbaum" />. В то же время, в микроконтроллерах и в системах специального назначения, где либо требуется очень быстрая работа, либо есть ограничения на длительность отклика ([[системы реального времени]]), виртуальная память используется относительно редко. Также в таких системах реже встречается многозадачность и сложные [[иерархия памяти|иерархии памяти]].


== История ==
== История ==
Строка 18: Строка 48:
| издание=In the Beginning: Recollections of Software Pioneers
| издание=In the Beginning: Recollections of Software Pioneers
| год=1997
| год=1997
| ссылка=http://cs.gmu.edu/cne/pjd/PUBS/bvm.pdf
| ссылка=http://denninginstitute.com/pjd/PUBS/bvm.pdf
| archivedate=2017-01-10
| archiveurl=https://web.archive.org/web/20170110075743/http://denninginstitute.com/pjd/PUBS/bvm.pdf
}}</ref> Для поддержки [[Мультипрограммирование|мультипрограммирования]] и [[Многозадачность|многозадачности]] во многих ранних компьютерных системах разделение памяти между несколькими программами осуществлялось без виртуальной памяти, с помощью [[Сегментная адресация памяти|сегментации]] (например, в компьютерах [[PDP-10]]).
}}</ref> Для поддержки [[Мультипрограммирование|мультипрограммирования]] и [[Многозадачность|многозадачности]] во многих ранних компьютерных системах разделение памяти между несколькими программами осуществлялось без виртуальной памяти, с помощью [[Сегментная адресация памяти|сегментации]] (например, в компьютерах [[PDP-10]]).


Строка 28: Строка 60:
| выпуск=4
| выпуск=4
| год=2004
| год=2004
| страницы=71-72
| страницы=71—72
}}</ref><ref name=springer>{{статья
}}</ref><ref name=springer>{{статья
| автор=Elke Jessen
| автор=Elke Jessen
Строка 40: Строка 72:
| doi=10.1007/s002870050034
| doi=10.1007/s002870050034
| issn=0170-6012
| issn=0170-6012
}}</ref> [[Подкачка страниц]] впервые была реализована в [[Манчестерский университет|Манчестерском университете]] как способ расширения памяти компьютера [[Atlas (компьютер)|Atlas]] путём объединения его основной памяти на магнитных сердечниках объёмом 16000 слов с памятью на магнитных барабанах ёмкостью 96000 слов. Первая поставка машины Atlas состоялась в 1962 году, но работающие прототипы подкачки страниц были разработаны уже в 1959 году.<ref name="denning"/><ref>{{статья
}}</ref> [[Подкачка страниц]] впервые была реализована в [[Манчестерский университет|Манчестерском университете]] как способ расширения памяти компьютера [[Atlas (компьютер)|Atlas]] путём объединения его основной памяти на магнитных сердечниках объёмом 16000 слов с памятью на магнитных барабанах ёмкостью 96000 слов. Первая поставка машины Atlas состоялась в 1962 году, но работающие прототипы подкачки страниц были разработаны уже в 1959 году.<ref name="denning"/><ref>{{статья
| автор=R. J. Creasy
| автор=R. J. Creasy
| ссылка=http://pages.cs.wisc.edu/~stjones/proj/vm_reading/ibmrd2505M.pdf
| ссылка=http://pages.cs.wisc.edu/~stjones/proj/vm_reading/ibmrd2505M.pdf
Строка 49: Строка 81:
| год=1981
| год=1981
| страницы=486
| страницы=486
| archivedate=2016-05-07
}}</ref><ref>[http://www.computer50.org/kgill/atlas/atlas.html Atlas design includes virtual memory]</ref> В 1961 году [[Burroughs Corporation]] независимо выпустила первый промышленно производившийся компьютер с виртуальной памятью [[B5000]], использующий сегментацию вместо подкачки страниц.<ref>[http://web.archive.org/web/20080213220156/http://web.mac.com/joynerian/iWeb/Ian%20Joyner/Burroughs.html Ian Joyner on Burroughs B5000]</ref><ref>{{книга
| archiveurl=https://web.archive.org/web/20160507042836/http://pages.cs.wisc.edu/~stjones/proj/vm_reading/ibmrd2505M.pdf
}}</ref><ref>[http://curation.cs.manchester.ac.uk/computer50/www.computer50.org/kgill/atlas/atlas.html Atlas design includes virtual memory] {{Wayback|url=http://curation.cs.manchester.ac.uk/computer50/www.computer50.org/kgill/atlas/atlas.html |date=20160513174154 }} — Computer50, University of Manchester 1996</ref> В 1961 году [[Burroughs Corporation]] независимо выпустила первый промышленно производившийся компьютер с виртуальной памятью [[B5000]], использующий сегментацию вместо подкачки страниц.<ref>[https://web.archive.org/web/20080213220156/http://web.mac.com/joynerian/iWeb/Ian%20Joyner/Burroughs.html Ian Joyner on Burroughs B5000]{{ref-en}}</ref><ref>{{книга
| автор=Harvey G. Cragon
| автор=Harvey G. Cragon
| заглавие=Memory Systems and Pipelined Processors
| заглавие=Memory Systems and Pipelined Processors
Строка 55: Строка 89:
| страницы=113
| страницы=113
| год=1996
| год=1996
| ссылка=http://books.google.com/?id=q2w3JSFD7l4C|isbn=0-86720-474-5}}</ref>
| ссылка=https://books.google.ru/books?id=q2w3JSFD7l4C&pg=PA113
|isbn=0-86720-474-5}}</ref>
В 1965 году виртуальная память была реализована в отечественной машине [[БЭСМ-6]], хотя реализованный механизм не позволял расширить 15-разрядное адресное пространство процесса и ограничивал удобство программирования.<ref>{{cite web
В 1965 году виртуальная память была реализована в отечественной машине [[БЭСМ-6]], хотя реализованный механизм не позволял расширить 15-разрядное адресное пространство процесса и ограничивал удобство программирования.<ref>{{cite web| author =Королёв Л. Н.| url =http://www.parallel.ru/history/besm6.html| title =Архитектура ЭВМ БЭСМ-6| work =Из книги Л. Н. Королёва «Структуры ЭВМ и их математическое обеспечение» (1978)| publisher =PARALLEL.RU - Информационно-аналитический центр по параллельным вычислениям:| accessdate =2016-11-21| archiveurl =https://web.archive.org/web/20010413010855/http://parallel.ru/history/besm6.html| archivedate =2001-04-13}} ()</ref>
| author = Королёв Л. Н.
| url = http://www.parallel.ru/history/besm6.html
| title = Архитектура ЭВМ БЭСМ-6
| work = Из книги Л. Н. Королёва «Структуры ЭВМ и их математическое обеспечение» (1978)
| publisher = PARALLEL.RU - Информационно-аналитический центр по параллельным вычислениям:
| accessdate = 2009-08-07
| archiveurl = http://www.webcitation.org/61GH8DCpC
| archivedate = 2011-08-28
}}</ref>


Прежде чем виртуальная память смогла быть использована в распространённых операционных системах, должен был быть решен ряд проблем. Динамическая трансляция адресов требовала дорогого и сложного в изготовлении специального оборудования. Первые реализации замедляли доступ к памяти.<ref name="denning" /> Существовали опасения, что новые общесистемные алгоритмы, использующие внешнюю память, будут менее эффективны, чем ранее использовавшиеся алгоритмы конкретных приложений. К 1969 году дебаты вокруг виртуальной памяти для промышленно выпускаемых компьютеров были завершены: команда исследователей из [[IBM]] под руководством Дэвида Сейра ({{lang-en|David Sayre}}) показала, что созданная ими система виртуальной памяти во всех отношениях превосходит самые лучшие системы, управляемые вручную.<ref name="denning" /><ref>{{статья
Прежде чем виртуальная память смогла быть использована в распространённых операционных системах, должен был быть решен ряд проблем. Динамическая трансляция адресов требовала дорогого и сложного в изготовлении специального оборудования. Первые реализации замедляли доступ к памяти.<ref name="denning" /> Существовали опасения, что новые общесистемные алгоритмы, использующие внешнюю память, будут менее эффективны, чем ранее использовавшиеся алгоритмы конкретных приложений. К 1969 году дебаты вокруг виртуальной памяти для промышленно выпускаемых компьютеров были завершены: команда исследователей из [[IBM]] под руководством Дэвида Сейра ({{lang-en|David Sayre}}) показала, что созданная ими система виртуальной памяти во всех отношениях превосходит лучшие системы, управляемые вручную.<ref name="denning" /><ref>{{статья
| автор=D. Sayre
| автор=D. Sayre
| заглавие=Is automatic "folding" of programs efficient enough to displace manual?
| заглавие=Is automatic "folding" of programs efficient enough to displace manual?
Строка 75: Строка 101:
| выпуск=12
| выпуск=12
| год=1969
| год=1969
| страницы=656-660
| страницы=656—660
| doi=10.1145/363626.363629
| doi=10.1145/363626.363629
| issn=0001-0782
| issn=0001-0782
}}</ref>
}}</ref>
Первым [[миникомпьютер]]ом, в котором была использована виртуальная память, был норвежский NORD-1. В 1970-е годы реализации виртуальной памяти появились в других миникомпьютерах, наиболее известным является [[VAX]], работающий под управлением операционной системы [[OpenVMS|VMS]].
Первым [[мини-компьютер]]ом, в котором была использована виртуальная память, был норвежский [[Norsk Data]] ([[:no:Norsk Data|но.]]) [[Nord-1]] ([[:no:Nord-1|но.]]). В 1970-е годы реализации виртуальной памяти появились в других мини-компьютерах, наиболее известным является [[VAX]], работающий под управлением операционной системы [[OpenVMS|VMS]].


Виртуальная память в архитектуре [[x86]] была реализована с появлением [[Защищенный режим|защищенного режима]] процессора [[80286]], однако она использовала сегментацию памяти, и метод подкачки сегментов плохо масштабировался для больших размеров сегментов. В процессоре [[80386]] была введена поддержка подкачки страниц, не приводящая к возникновению двойной ошибки, если во время обработки другого исключения возникло исключение ошибки страницы. Поверх системы подкачки страниц работал существующий механизм сегментации памяти. Однако загрузка дескрипторов сегментов являлась дорогостоящей операцией, заставляя разработчиков операционных систем полагаться только на механизм подкачки страниц, а не на комбинацию подкачки страниц и сегментации.
Виртуальная память в архитектуре [[x86]] была реализована с появлением [[Защищенный режим|защищенного режима]] процессора [[80286]], однако она использовала сегментацию памяти, и метод подкачки сегментов плохо масштабировался для больших размеров сегментов. В процессоре [[80386]] была введена поддержка подкачки страниц, не приводящая к возникновению двойной ошибки, если во время обработки другого исключения возникло исключение ошибки страницы. Поверх системы подкачки страниц работал существующий механизм сегментации памяти. Однако загрузка дескрипторов сегментов являлась дорогостоящей операцией, заставляя разработчиков операционных систем полагаться только на механизм подкачки страниц, а не на комбинацию подкачки страниц и сегментации.
Строка 85: Строка 111:
== Страничная организация виртуальной памяти ==
== Страничная организация виртуальной памяти ==
{{main|Страничная память}}
{{main|Страничная память}}
В большинстве современных операционных систем виртуальная память организуется с помощью страничной адресации. Оперативная память делится на страницы: области памяти фиксированной длины (например, 4096 байт), которые являются минимальной единицей выделяемой памяти (то есть даже запрос на 1 байт от приложения приведёт к выделению ему страницы памяти). Процессор обращается к памяти с помощью адреса виртуальной памяти, который содержит в себе номер страницы и смещение внутри страницы. Процессор преобразует номер виртуальной страницы в адрес соответствующей ей физической страницы при помощи буфера [[Translation lookaside buffer|ассоциативной трансляции]]. Если ему не удалось это сделать, то требуется обращение к [[таблица страниц|таблице страниц]] (так называемый ''Page Walk''), что может сделать либо сам процессор, либо операционная система (в зависимости от архитектуры)<ref>Patterson&Hennessy «Computer organisation and Design. Hardware Software Interface.» 4th edition. Chap 5.4, page 503</ref>. Если страница выгружена из оперативной памяти, то операционная система подкачивает страницу с жёсткого диска (см. [[свопинг]]). При запросе на выделение памяти операционная система может «сбросить» на жёсткий диск страницы, к которым давно не было обращений. Критические данные (например, код запущенных и работающих программ, код и память [[ядро операционной системы|ядра]] системы) обычно находятся в оперативной памяти (исключения существуют, однако они не касаются тех частей, которые отвечают за обработку аппаратных прерываний, работу с таблицей страниц и использование файла подкачки).
В большинстве современных операционных систем виртуальная память организуется с помощью страничной адресации. Оперативная память делится на страницы области памяти фиксированной длины (например, 4096 байт<ref name="автоссылка1">{{книга
| автор=Harvey G. Cragon
| заглавие=Memory Systems and Pipelined Processors
| издательство=Jones and Bartlett Publishers
| страницы=121
| год=1996
| ссылка=https://books.google.ru/books?id=q2w3JSFD7l4C&pg=PA121
|isbn=0-86720-474-5}}</ref>), которые являются минимальной единицей выделяемой памяти (то есть даже запрос на 1 байт от приложения приведёт к выделению ему всей страницы памяти). Исполняемый процессором пользовательский поток обращается к памяти с помощью адреса виртуальной памяти, который делится на номер страницы и смещение внутри страницы. Процессор преобразует номер виртуальной страницы в адрес соответствующей ей физической страницы при помощи буфера [[Translation lookaside buffer|ассоциативной трансляции]] (TLB). Если ему не удалось это сделать, то требуется дозаполнение буфера путём обращения к [[Таблица страниц|таблице страниц]] (так называемый ''Page Walk''), что может сделать либо сам процессор, либо операционная система (в зависимости от архитектуры)<ref>[[Паттерсон, Дэвид|Patterson]], [[Хеннесси, Джон Лерой|Hennessy]] «Computer organisation and Design. Hardware Software Interface.» 4th edition. ISBN 9780080886138 Chapter 5.4, page 503 {{ref-en}}</ref>. Если страница была выгружена из оперативной памяти, то операционная система подкачивает страницу с жёсткого диска в ходе обработки события [[Page fault]] (см. [[свопинг]], подкачка страниц). При запросе на выделение памяти операционная система может «сбросить» на жёсткий диск страницы, к которым давно не было обращений. Критические данные (например, код запущенных и работающих программ, код и память [[ядро операционной системы|ядра]] системы) обычно находятся в оперативной памяти (исключения существуют, однако они не касаются тех частей, которые отвечают за обработку аппаратных прерываний, работу с [[Таблица страниц|таблицей страниц]] и использование файла подкачки).


== Сегментная организация виртуальной памяти ==
== Сегментная организация виртуальной памяти ==
Строка 93: Строка 126:
<!-- Благодаря этому устраняется один из крупных недостатков страничного механизма — '''внутренняя фрагментация''' памяти (то есть наличие большого количества неиспользованных участков памяти ''внутри'' страниц). Однако, сегментный механизм приводит к '''внешней фрагментации''' памяти (то есть наличию большого количества мелких неиспользованных участков памяти ''между'' сегментами). -->
<!-- Благодаря этому устраняется один из крупных недостатков страничного механизма — '''внутренняя фрагментация''' памяти (то есть наличие большого количества неиспользованных участков памяти ''внутри'' страниц). Однако, сегментный механизм приводит к '''внешней фрагментации''' памяти (то есть наличию большого количества мелких неиспользованных участков памяти ''между'' сегментами). -->
Для каждого сегмента, как и для страницы, могут быть назначены права доступа к нему пользователя и его процессов.
Для каждого сегмента, как и для страницы, могут быть назначены права доступа к нему пользователя и его процессов.
При загрузке процесса часть сегментов помещается в оперативную память (при этом для каждого из этих сегментов операционная система подыскивает подходящий участок свободной памяти), а часть сегментов размещается в дисковой памяти. Сегменты одной программы могут занимать в оперативной памяти несмежные участки. Во время загрузки система создает таблицу сегментов процесса (аналогичную таблице страниц), в которой для каждого сегмента указывается начальный физический адрес сегмента в оперативной памяти, размер сегмента, правила доступа, признак модификации, признак обращения к данному сегменту за последний интервал времени и некоторая другая информация. Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же участок оперативной памяти, в который данный сегмент загружается в единственном экземпляре. Система с сегментной организацией функционирует аналогично системе со страничной организацией: время от времени происходят прерывания, связанные с отсутствием нужных сегментов в памяти, при необходимости освобождения памяти некоторые сегменты выгружаются, при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический. Кроме того, при обращении к памяти проверяется, разрешен ли доступ требуемого типа к данному сегменту.
При загрузке процесса часть сегментов помещается в оперативную память (при этом для каждого из этих сегментов операционная система подыскивает подходящий участок свободной памяти), а часть сегментов размещается в дисковой памяти. Сегменты одной программы могут занимать в оперативной памяти несмежные участки. Во время загрузки система создает таблицу сегментов процесса (аналогичную [[Таблица страниц|таблице страниц]]), в которой для каждого сегмента указывается начальный физический адрес сегмента в оперативной памяти, размер сегмента, правила доступа, признак модификации, признак обращения к данному сегменту за последний интервал времени и некоторая другая информация. Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же участок оперативной памяти, в который данный сегмент загружается в единственном экземпляре. Система с сегментной организацией функционирует аналогично системе со страничной организацией: время от времени происходят прерывания, связанные с отсутствием нужных сегментов в памяти, при необходимости освобождения памяти некоторые сегменты выгружаются, при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический. Кроме того, при обращении к памяти проверяется, разрешен ли доступ требуемого типа к данному сегменту.


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


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

Существует также гибридная странично-сегментная организация виртуальной памяти<ref name="автоссылка1" />.


== См. также ==
== См. также ==
* [[Кеш-память|Кэш-память]]
* [[Разделяемая память]]
* [[Кэш|Кэш-память]]
* [[Менеджер виртуальной памяти]]
* [[Менеджер виртуальной памяти]]
* [[Блок управления памятью]] (Memory Management Unit)
* [[Блок управления памятью]] (Memory Management Unit)
Строка 112: Строка 148:
* ''Иртегов Д.'' Введение в операционные системы. СПб.: Питер, 2002.
* ''Иртегов Д.'' Введение в операционные системы. СПб.: Питер, 2002.
* ''Bruce Jacob, Trevor Mudge.'' Virtual Memory: Issues of Implementation. — Los Alamitos, CA, USA: IEEE Computer Society Press, 1998. ISSN:0018-9162
* ''Bruce Jacob, Trevor Mudge.'' Virtual Memory: Issues of Implementation. — Los Alamitos, CA, USA: IEEE Computer Society Press, 1998. ISSN:0018-9162
* [http://www.intuit.ru/studies/courses/2192/31/lecture/984 Лекция 9: Виртуальная память. Архитектурные средства поддержки виртуальной памяти] / Основы операционных систем - Академия Intel, Московский физико-технический институт, 2004 - Интуит ISBN 978-5-9556-0044-4


== Ссылки ==
== Ссылки ==
* [http://portal.acm.org/citation.cfm?id=621004 Virtual Memory: Issues of Implementation] {{ref-en}}
* [http://portal.acm.org/citation.cfm?id=621004 Virtual Memory: Issues of Implementation] / Computer Volume 31 Issue 6, June 1998 [[doi:10.1109/2.683005]] {{ref-en}}
* [http://www.acc.umu.se/~bosse/ Драйвер виртуальной памяти, использующий Linux swap раздел] {{ref-en}}
* Bo Brantén, [http://www.acc.umu.se/~bosse/ Windows driver examples: SwapFs] - Драйвер виртуальной памяти для Windows, использующий Linux swap раздел {{ref-en}}
* [http://pcfresh.ru/uvelichenie-razmera-fajla-podkachki.html Увеличение файла подкачки в Microsoft Windows XP/Vista/7]
* [http://www.winblog.ru/2007/09/04/04090701.html FAQ по файлу подкачки на WinBlog.ru], 2007

* [http://www.winblog.ru/2007/09/04/04090701.html FAQ по файлу подкачки на WinBlog.ru]
{{Аспекты операционных систем}}


[[Категория:Виртуальная память| ]]
[[Категория:Виртуальная память| ]]

Текущая версия от 13:12, 6 августа 2024

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

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

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

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

В настоящее время виртуальная память аппаратно поддерживается в большинстве современных процессоров[1]. В то же время, в микроконтроллерах и в системах специального назначения, где либо требуется очень быстрая работа, либо есть ограничения на длительность отклика (системы реального времени), виртуальная память используется относительно редко. Также в таких системах реже встречается многозадачность и сложные иерархии памяти.

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

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

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

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

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

[править | править код]

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

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

[править | править код]

Механизм организации виртуальной памяти, при котором виртуальное пространство делится на части произвольного размера — сегменты. Этот механизм позволяет, к примеру, разбить данные процесса на логические блоки.[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. Elke Jessen. Die Entwicklung des virtuellen Speichers // Informatik-Spektrum. — Springer-Verlag, 1996. — Т. 19, вып. 4. — С. 216–219. — ISSN 0170-6012. — doi:10.1007/s002870050034.
  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. 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.
  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 сегментная адресация не используется и заменена делением памяти на секции, что в сущности почти одно и то же.

Литература

[править | править код]