69

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

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

8 ответов8

116

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

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

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

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

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

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

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

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

21

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

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

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

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

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

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 на шине памяти), ЕСЛИ ЛЮБЫЕ, в настоящее время используются для хранения данных. "ЕСЛИ ЛЮБОЙ", потому что "вообще нет" - это возможное и приемлемое состояние: в этом случае условие ошибки (так называемая "ошибка страницы") будет возникать на аппаратном уровне - и эта ошибка вызовет уровень ОС обработчик, который может, например, загружать содержимое памяти, записанное в файл подкачки, обратно в любое свободное место в физической памяти (в случае чтения) или находить фактическое место для размещения материала (в случае записи), обновлять вышеупомянутый перевод стол, и только тогда ручное управление вернулось к процессу, который пытался получить доступ к этой памяти ... и который не будет никого мудрее из того, что произошло.

0

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

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

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

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

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

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .