Что такое виртуальная память?

27

Я дважды проверил свои записи на предмет «Виртуальной памяти», и определение в моем учебнике таково:

Процесс выделения раздела вторичного хранилища для работы как часть основной памяти

Где, как говорит Википедия :

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

и (Википедия также говорит)

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

Кто-нибудь может предложить какие-либо разъяснения относительно того, что является правильным?

Yacoby
источник
Я полагаю, что примечание из Википедии включает некоторые уточнения относительно того, что используется в терминах смежных вещей.
JB King
Этот вопрос, вероятно, получит лучший ответ на SO.
Капитан Сегфо
2
Не путайте виртуальную память с тем, как она используется. 1-е предложение Википедии определяет, что это такое. Ваша книга говорит о том, как она обычно используется. Когда люди говорят о «страницах», они говорят о конкретной реализации виртуальной памяти.
Тони Ли
2
Ваш учебник просто неправильно. Есть много машин с виртуальной памятью и вообще без вторичного хранилища. Точно так же когда-то было много машин, которые могли использовать вторичное хранилище как часть основной памяти, но не поддерживали виртуальную память. «Виртуальная память» - это не память, а доступ к ней, как к памяти. Ваш учебник определяет обмен или пейджинг.
Дэвид Шварц
1
Учебник определяет его совершенно неправильно, вторичное хранилище не является частью определения. И даже утверждение Википедии о «больше, чем дисковом пространстве» вводит в заблуждение, поскольку оно может вообще не включать диск - это утверждение звучит так, будто оно «расширяет память на диск» плюс что-то еще.
Кельвин

Ответы:

41
Note that "virtual memory" is more than just "using disk space to extend physical memory size"

Виртуальная память - это уровень абстракции, предоставляемый каждому процессу. Компьютер имеет, скажем, 2 ГБ физической памяти, адресованной от 0 до 2 ГБ. Процесс может увидеть адресное пространство 4 ГБ, которое он имеет полностью для себя. Отображение из виртуальных адресов в физические адреса обрабатывается блоком управления памятью, который управляется операционной системой. Обычно это делается в 4КБ «страницах».

Это дает несколько возможностей:

  1. Процесс не может видеть память в других процессах (если ОС этого не хочет!)
  2. Память по данному виртуальному адресу не может быть расположена по тому же физическому адресу
  3. Память по виртуальному адресу может быть «выгружена» на диск, а затем «выгружена» при повторном обращении к ней.

Ваш учебник определяет виртуальную память (неправильно) просто как № 3.

Даже без какой-либо подкачки вам особенно нужно знать о виртуальной памяти, если вы пишете драйвер устройства для устройства, которое выполняет DMA (прямой доступ к памяти). Код вашего драйвера запускается на CPU, что означает, что доступ к памяти осуществляется через MMU (виртуальный). Устройство, вероятно, не проходит через MMU, поэтому оно видит необработанные физические адреса. Поэтому, как писатель, вы должны обеспечить:

  1. Любые необработанные адреса памяти, которые вы передаете оборудованию, являются физическими, а не виртуальными.
  2. Любые большие (многостраничные) блоки памяти, которые вы отправляете, являются физически смежными. Массив 8K может быть практически непрерывным (через MMU), но двумя физически отдельными страницами. Если вы скажете устройству записать 8K данных на физический адрес, соответствующий началу этого массива, оно запишет первые 4K, где вы ожидаете, но вторые 4K повредят где-то память. :-(
Капитан сегфо
источник
4

Я постараюсь начать медленно, а затем соберу все это для вас. Это вот так:

Виртуальная память, как обычно используется, относится к «пейджингу». Как следует из названия, пейджинг похож на блокнот для человека.

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

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

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

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

Теперь все усложняется тем, что современные системы поддерживают отображение памяти и защиту памяти, которые обычно обрабатываются одной и той же аппаратной системой компьютера: блоком управления памятью или MMU.

На (современном) многозадачном компьютере, который может запускать много программ одновременно и имеет защиту памяти, каждая программа обычно отделена от других программ, работающих в той же системе. Таким образом, одна программа не может изменить другую программу, просто обращаясь к ее памяти - MMU физически отделяет адресное пространство одной программы от адресного пространства других. Другими словами, программы пользователя не видят программы других пользователей или даже другие программы. Они не видят «реальную память» - они видят свою собственную «виртуальную память».

Теперь эта концепция изоляции памяти и концепция файла подкачки - это две концептуально разные вещи, поэтому, вероятно, вы запутались. Тем не менее, ключ в том, что они оба работают, используя MMU - модуль управления памятью, который разделяет память на страницы и отображает страницы в виртуальное адресное пространство.

Таким образом, когда программа запрашивает память по определенному «адресу памяти», на самом деле происходит то, что страницы памяти для этой программы и их соответствующие адреса («адресное пространство» программы) ищутся, и страница, которая соответствует этот блок памяти найден. Эта страница может быть либо загружена где-то в реальной памяти, в этом случае программе предоставляется доступ, либо она может быть выгружена на диск. Если он выгружен, то он вызывает «сбой страницы» - доступ к диску и страница загружаются в память. Таким образом, программа работает даже тогда, когда не хватает памяти, но работает МЕДЛЕННО, если ей приходится использовать диск для того, что обычно обеспечивает очень быстрый доступ к памяти.

Теперь, если недостаточно места для загрузки этой страницы в память, у вас есть проблема. В этом случае некоторую ДРУГУЮ страницу, которая уже находится в памяти, необходимо «переставить» на диск, чтобы можно было загрузить страницу первой программы. Или это могут быть страницы из одной и той же программы. Это иногда можно увидеть в графических программах, например, в сильно загруженных системах, когда часть изображения загружается медленно и рисуется быстро, затем следующая часть загружается одинаково медленно и рисуется быстро, и когда вы возвращаетесь к работе с первым часть, она медленная СНОВА. Это потому, что они загружаются для дальнейшей работы, а затем снова заменяются, так что можно заняться чем-то другим. Очевидно, это очень медленный способ работы, и вам действительно нужно больше РЕАЛЬНОЙ памяти.

Ли Б
источник
Я на 100% не согласен с этим ответом. Если «виртуальная память» относится к пейджингу, то система, которая не выполняет пейджинг (скажем, система, в которой нет подкачки или файлов подкачки) не может поддерживать виртуальную память. Но это явно безумие.
Дэвид Шварц
@DavidSchwartz - у меня изначально была реакция, подобная вашей, но читая ответ более подробно, я не думаю, что это так плохо. Рассмотрим Wikipedia / virtual memory / Paged : «Почти все реализации виртуальной памяти делят виртуальное адресное пространство на страницы, блоки смежных адресов виртуальной памяти». То есть «пейджинг» в широком смысле не требует файла подкачки , но относится к отображению виртуальных адресов в физические адреса.
ToolmakerSteve
1
Хм, с другой стороны, Ли говорит: «Все страницы информации не помещаются в памяти, поэтому некоторые страницы помещаются на диск и загружаются снова позже», поэтому Дэвид прав: в этом ответе пропущен существенный факт, что пейджинг - это не просто пейджинг на диск . С другой стороны, Ли продолжает упоминать и другие преимущества виртуальной памяти (изоляция памяти). Если бы этот ответ был перефразирован, чтобы не путать «отображение страниц виртуальной памяти» с «подкачкой на диск», это было бы более полезно.
ToolmakerSteve
@ToolmakerSteve Проблема в том, что это очень распространенное заблуждение, и все, что усиливает это заблуждение, является, IMO, плохой вещью. Особенно плохо здесь, когда этот ответ пытается объяснить самые базовые понятия в очень простом вопросе - там очень важно не закладывать основы, основанные на распространенном заблуждении!
Дэвид Шварц
@DavidSchwartz - согласен. Вы правы, он не определяет «виртуальную память», он определяет «как работает файл подкачки». Сначала я думал, что проблема была просто в том, что Ли не смог различить «пейджинг = отображение страниц памяти от виртуальной к физической» и «файл страниц = отображение страниц на диск», но после перечитывания он действительно говорил только о отображении на диск. (Как мы видим, из цитаты из учебника, из всех других ответов, кроме «Капитана», и из поиска в Google, это смешение двух понятий очень широко распространено. Я уверен, что я виновен в этом.)
ToolmakerSteve
0

Я знаю, что уже слишком поздно ... но все же подумал, что это полезно.

  • Все правильно на основе разных точек зрения.
  • Виртуальная память - это метод управления памятью, тогда как область подкачки была областью на диске. Память подкачки обычно называется пространством подкачки. Пространство подкачки относится к части виртуальной памяти, которая зарезервирована как место временного хранения. Пространство подкачки используется, когда доступная RAM не в состоянии удовлетворить требования системной памяти
  • Вы можете обратиться к ссылке ниже для более подробной информации
sivaramaraju
источник
-2

Хорошо, если мы понимаем слово виртуальное, я думаю, мы можем понять, как оно относится к памяти.

«Виртуальный», как определено на Dictionary.com: «временно смоделирован или расширен компьютерным программным обеспечением: виртуальный диск в ОЗУ; виртуальная память на жестком диске».

В случае виртуальной памяти система имитирует системную память, используя более медленные ресурсы памяти (например, жесткий диск, флэш-накопитель и т. Д.). Когда требуется дополнительная память, система выгрузит данные в системную память, которые не нужны жесткому диску. диск или ресурс у вас есть настройки. Это освобождает системную память, чтобы ваше приложение могло продолжить выполнение задачи, которую оно выполняло.

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

Racter
источник
-2

Виртуальная память - это функция операционной системы (ОС), которая позволяет компьютеру компенсировать нехватку физической памяти путем временной передачи страниц данных из оперативной памяти (ОЗУ) в дисковое хранилище.

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

Эрик Буэнавентура
источник
Нет, это пейджинг.
Дэвид Шварц
-4

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

Это сложно, а иногда и медленно, потому что Windows НЕ дефрагментирует эту часть вашего жесткого диска.

Лучшие 2 совета, которые я могу предложить: 1) Виртуальная память должна быть установлена ​​как минимальная, так и максимальная приблизительно в 1,5 раза вашей физической памяти. ех. 2 ГБ ОЗУ = 3070 МБ Вирт. 2) При дефрагментации отключите файл подкачки. Дефрагментируйте 2 раза и вернитесь к исходному номеру. Это дает чистый кусок диска и увеличит скорость файла подкачки.

Anarkie
источник
1
Это не совсем так - современные диспетчеры памяти виртуализируют ВСЕ системную память. Это то, что позволяет разделять процессы - каждый процесс может касаться только своей собственной памяти. Диспетчер памяти отвечает за сопоставление этих виртуальных страниц с реальным хранилищем и, возможно, с фиксированным диском.
Энтони Джорджио
1
«Windows НЕ дефрагментирует эту часть вашего жесткого диска». просто обнулите файл pagefile.sys, перезагрузите компьютер, выполните дефрагментацию диска и снова включите подкачку, вуаля, свежий и непрерывный файл подкачки! однако PageDefrag от Sysinternals работает лучше, так как он также поместит файл подкачки в начало диска / раздела для повышения производительности.
1
Если этот ответ был правильным, то система Windows без настроенных файлов подкачки не могла бы обеспечить поддержку виртуальной памяти. Но это, очевидно, неправильно. Такая система может, например, по-прежнему отображать файлы в адресное пространство процесса, превышающее физическую оперативную память, что является примером виртуальной памяти.
Дэвид Шварц