Как виртуальная память на самом деле увеличивает пространство памяти?


70

Я понимаю, что виртуальная память обманывает программу, отображая больше памяти, чем фактически доступно.

Но в конечном итоге он должен сопоставить логический адрес с фактически физическим адресом. Теперь, как это увеличивает память?


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

2
«Теперь, как это увеличивает память?». Это не так. Приложение не знает о физической памяти системы, оно знает только о виртуальной памяти, которая является причиной, по которой приложение жалуется на нехватку памяти, оно говорит о виртуальной памяти, а не о физической памяти
Ramhound

2
Имейте в виду, что системы виртуальной памяти довольно умны. Если n процессов имеют одну и ту же страницу только для чтения, все n процессов могут использовать одну и ту же страницу физической памяти.
Эрик Липперт

65
Не думайте о виртуальной памяти как о чем-то обманывающем . Память - это абстрактная способность хранить и извлекать данные . Виртуальная память обеспечивает реализацию этой абстракции. То, что некоторая часть этой абстракции поддерживается ОЗУ, а другая - диском, является подробностью реализации абстракции.
Эрик Липперт

4
@HagenvonEitzen Не уверен, что память «всегда» на диске ... кроме страниц, изначально считанных с диска, если только страница не выгружена, ее содержимое никогда не может быть на диске, и это особенно верно для страниц, которые закреплены в памяти, например из-за того, что критично для функциональности ядра.
Майкл

Ответы:


116

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

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

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

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

Виртуальная память также позволяет захватывать и перенаправлять доступ к памяти, что позволяет нам использовать такие функции, как файл подкачки. Это означает, что мы можем вытолкнуть части памяти, которые недавно не использовались, на диск и установить указатель, который говорит, что «этот блок памяти находится в файле x в месте y», а затем мы можем освободить физическую память область для использования другим приложением. Когда приложению требуется эта память, оно может быть считано обратно с диска, помещено в какое-то место физической ОЗУ (потенциально отличное от того, где оно было раньше) и сопоставлено с тем же расположением виртуальной памяти, что и ранее.

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

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

Файл подкачки включен в системах виртуальной памяти, но в прошлом был смущен , как быть виртуальной памяти.


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Сатьяджит Бхат

21

Объяснение дилетанта

Система должна будет сопоставлять каждый виртуальный адрес с физическим адресом, когда используется эта память, но не вся память используется одновременно . Например, предположим, у вас есть 20 вкладок в браузере, каждая из которых занимает 1 ГБ памяти. В ОС без поддержки виртуальной памяти вам потребуется 20 ГБ ОЗУ, чтобы это работало. Хитрость заключается в том, что вы не просматриваете все 20 вкладок одновременно, поэтому ОС с виртуальной памятью позволит вам использовать свой браузер с парой ГБ ОЗУ, перенося неактивные вкладки на диск.

Более сложные аспекты

Виртуальная память не используется исключительно для обмена. Его главная цель на самом деле - избежать фрагментации ОЗУ, что является большой проблемой в системах без управления виртуальной памятью: у вас может быть 1 ГБ свободной памяти, но если ее объем составляет 10 МБ, приложение, запрашивающее 100 МБ, не сможет работать ,

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


9
печально, что мы живем в мире, где каждая вкладка браузера требует 1 ГБ памяти
tbodt

9
@tbodt Я обвиняю древних египтян. Если бы они только знали, что делают, одомашнив этих надоедливых кошек!
Дмитрий Григорьев

@tbodt Это тоже немного преувеличение. Мой браузер с 8 открытыми вкладками занимает всего 500 МБ памяти.
Random832

2
@ Random832 Конечно, это преувеличение, хотя я не уверен насчет границы между преувеличением и перспективой на будущее. Мой первый компьютер имел 32 МБ оперативной памяти, и я мог легко открыть 8 вкладок в Opera без заметного обмена. Теперь он занимает 500 МБ, поэтому через 20 лет он может достичь 8 ГБ.
Дмитрий Григорьев

5

Виртуальная память не увеличивает объем памяти, в смысле фактически добавляя больше оборудования основной памяти. Но это МОЖЕТ увеличить диапазон используемых адресов . Таким образом, можно иметь работающую программу, состоящую из сегмента кода и сегмента данных (стек и куча), и оба они могут занимать диапазон виртуальных адресов, превышающий диапазон физических адресов, обеспечиваемых физически реальным пространством хранения машина. Хитрость заключается в том, что только небольшая часть этих виртуальных адресов в любой момент поддерживается физической основной памятью [но в конечном итоге все поддерживается дисковым хранилищем] . Это работает из-за феномена локальности ссылки: В любой момент выполняются только инструкции в одном или нескольких небольших смежных разделах сегмента программы, и обрабатываются только данные в одном или нескольких небольших смежных секциях сегмента данных [конечно, поведение на самом деле более сложное , но это следует за этим образцом в течение большей части времени]


4

Я понимаю, что виртуальная память обманывает программу, отображая больше памяти, чем фактически доступно.

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

Но в конечном итоге он должен сопоставить логический адрес с фактически физическим адресом. Теперь, как это увеличивает память?

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

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

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

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


3

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

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

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

Теоретически, он может просто читать данные прямо с диска. Однако есть причины, по которым это не так. Программы не хотят знать обо всех этих осложнениях. Мы можем писать программное обеспечение, которое разумно помещает данные на диск (это называется кешированием). Тем не менее, это требует много дополнительной работы. Самое быстрое, что мы можем сделать это в коде:

if data is not in memory
    read data from disk into memory
operate on data

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

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

Это приводит к тому, что мы всегда переносим данные обратно в память, а не просто читаем их с диска и оставляем на этом. Мы разбиваем память на «страницы», каждая из которых помечается как присутствующая или не присутствующая в памяти. Операционная система поддерживает эту таблицу в формате, который удобно использовать процессору напрямую. Всякий раз, когда программа обращается к имеющимся данным, аппаратное обеспечение ЦПУ предоставляет им доступ к данным в DRAM напрямую. Когда данные отсутствуют, выдается «сбой страницы», говорящий операционной системе о необходимости загрузить эту страницу с диска на некоторую физическую страницу памяти и обновить таблицу, чтобы указать ЦП на этой новой физической странице.

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


2

Это делается путем создания временных записей на карте.

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

Максимально выделяемая память - это размер пространства подкачки, который может быть намного больше, чем установленная память. Может быть полезно думать о пространстве подкачки как о «реальной» памяти, а о ОЗУ - как о высокоскоростном кеше для пространства подкачки.

(Это далеко не полное описание, оно предназначено для ответа на ближайший вопрос, не вдаваясь в важные, но ненужные подробности.)


1

Основная концепция основана на том факте, что современный ЦП может управлять таблицами перевода, отслеживая, «какие диапазоны адресов были выделены для использования определенным процессом и какие физические адреса (например, строки A00..Axx на шине памяти), ЕСЛИ ЛЮБЫЕ» , в настоящее время используются для фактического хранения данных. «ЕСЛИ ЛЮБОЙ», потому что «вообще нет» является возможным и приемлемым состоянием: в этом случае условие ошибки (так называемая «ошибка страницы») будет возникать на аппаратном уровне - и эта ошибка вызовет обработчик уровня ОС, который может, например, загрузить содержимое памяти, записанное в файл подкачки, обратно в любое свободное место в физической памяти (в случае чтения) или найти фактическое место для размещения материала (в регистр записи), обновите вышеупомянутую таблицу перевода,и только тогда ручное управление вернется к процессу, который попытался получить доступ к этой памяти ... и который не станет мудрее того, что произошло.


1

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

1) позволяет отображать большое виртуальное адресное пространство на меньший объем физической памяти, с избыточным «выгрузкой» на диск или SSD или, возможно, на NVRAM и другие устройства.

2) позволяет отображать большее виртуальное адресное пространство (например, 64-битные) в меньшее физическое адресное пространство (например, 32 или 64-битные)

3) позволяет отображать меньшее виртуальное адресное пространство (например, 32 бита) в большее физическое адресное пространство (например, 40 битов) и, таким образом, позволяет более старым приложениям использовать больше физического DRAM.

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

5) позволяет процессам получать свои собственные виртуальные адресные пространства и, следовательно, быть изолированными друг от друга.

6) позволяет различным виртуальным адресам, которые имеют одинаковые значения данных, выделять одну физическую страницу.

Это может происходить в рамках одного процесса или ОС - большинство производных ОС BSD UNIX имеют одну страницу нулей, предназначенную только для чтения, которая может быть отображена на любую заполненную нулями виртуальную страницу, обычно COW (Копировать при записи - нули только для чтения, записанные в ловушку) и страница неразделена и сделана доступной для записи).

Это может происходить между процессами - например, UNIX fork () создает дочерние процессы, которые совместно используют почти всю виртуальную память способом COW.

Это может происходить между операционными системами - например, гостевые ОС на хосте виртуальной машины могут иметь дедуплицированные страницы, совместно использовать COW и т. Д. (Некоторые недавние атаки безопасности воспользовались этим.)

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.