Понимание виртуального адреса, виртуальной памяти и подкачки
Я изучал эти темы и прочитал много статей и книг, но все они не имеют некоторой дополнительной информации и смутили меня еще больше. Поэтому здесь я хотел бы объяснить, что я знаю, пока я задаю свои вопросы. Надеюсь, эта тема будет полезна для многих, как меня. Я также хотел бы узнать обоснованность моих знаний и исправлений, если это необходимо.
Виртуальный
некоторые статьи говорят: "Виртуальная память-это некоторое пространство жесткого диска, которое эмулирует физическую память, чтобы у нас было больше памяти, чем у нас есть на самом деле.". В некоторых других статьях говорится: "Виртуальная память-это комбинация физической памяти (ОЗУ), раздел жесткого диска, который действует как физическая память и таблицы страниц."Однако это разные вещи, и я не понимаю, почему существуют разные объяснения.
давайте перейдем ко второму объяснению, так как Википедия также описывает виртуальную память. На данный момент виртуальный адрес имеет смысл, поскольку мы используем адрес в виртуальной памяти вместо физической памяти напрямую.
кстати, мой Mac говорит, что у меня есть физическая память 8GB и виртуальная память 8GB. В этом случае VM включает физическую память или это объем пространства в HD, используемый в качестве памяти? У меня есть память 16GB для моих программ?
Вопрос 1:
Intel i5 имеет 36-битную адресную шину, и это означает, что вы можете обратиться к памяти 64GB. Давайте скажем, я установил 4GB RAM на свой компьютер. Однако мои программы могут не знать о размере установленной памяти, поскольку она будет использоваться на многих разных системах с разными размерами памяти. Здесь виртуальная память становится удобной. Он абстрагирует фактический размер установленной памяти.
однако, что происходит, когда мои программы хотят получить доступ к адресу памяти 0xFFFFFFFFF? У меня установлен только 4GB и, возможно, некоторое пространство памяти в HD.
У меня есть две теории на этот вопрос:
1. поскольку таблицы страниц поддерживаются ОС, ОС декодирует этот адрес и выясняет, какая страница является и проверяет эту страницу в таблице страниц, чтобы увидеть, имеют ли они физический адрес, связанный с ней (допустимые и недопустимые флаги), если да, то переходит к физическому адресу точки входа страницы в физической памяти + смещение, определенное в виртуальном адресе, и приносит это значение. В противном случае происходит ошибка страницы, и ОС ищет эту страницу в вторичное хранилище, извлекает его и помещает в память и обновляет таблицу страниц.
2. он выдает исключение типа OutOfMemory, которое говорит, что у меня нет памяти, к которой может обратиться данный адрес.
недостатком первой теории является то, что происходит, когда программа хочет использовать память 64GB? Тогда нам нужно иметь пространство памяти 60GB в HD, так как у нас есть только 4GB. Однако на снимке экрана ниже MAC говорит мне, что есть только 8GB Virtual Память.
Вопрос 2:
Как процессы помещаются в виртуальную память? Я имею в виду, есть ли у каждого процесса пространство виртуальной памяти 0x0 - 0xfffffffffff или есть только одно адресное пространство виртуальной памяти, где размещены все процессы?
Если каждый процесс предполагает, что у них есть вся доступная для них память, то воспоминания выглядят следующим образом:
Если есть только одна виртуальная память концепция, тогда она будет выглядеть так:
Таблица Страницы
таким образом, таблица страниц-это структура данных, которая находится между физическими адресами и виртуальными адресами. Это ассоциативный массив (или как словарь), который для каждой страницы (ключа) связан с физическим адресом (значением).
OS использует MMU (блок управления памятью) для выполнения этого перевода с виртуального адреса на физический адрес.
Вопрос 3:
есть один большой гигантский таблицы страниц, которая включает в себя все страницы для каждого процесса или каждый процесс имеет свою таблицу страниц?
пейджинговая
подкачки-это метод управления памятью. Виртуальная память и физическая память разделяются на страницы (которые являются фиксированными и одинаковыми блоками) блоком управления памятью. Этот метод полезен при обмене страниц между памятью и вторичное хранилище, чтобы вы могли обмениваться страницами между ними. Например, ваша программа запрашивает данные, расположенные в адресе. Однако этот адрес, используемый вашей программой, является виртуальным адресом, и MMU переводит его с помощью таблицы страниц. Во время этого MMU проверяет таблицу страниц, присутствует ли запрошенное в таблице страниц, и ОС получает его из вторичного хранилища, если нет, и обновляет таблицу страниц.
Вопрос 4:
предположим, процесс запрашивает данные из адрес, который преобразуется в физический адрес, который уже имеет некоторые данные. Откуда известно, что данные не относятся к процессам запроса и должны быть заменены на те, которые находятся во вторичном хранилище?
есть грязный бит, например, который используется для записи этой страницы обратно на жесткий диск или нет, но я не думаю, что это то, что определяет процесс владельца.
2 ответов
некоторые люди используют термин " виртуальная память "как синоним файла страницы, поскольку файл страницы представляет собой часть выделенной памяти, которая не является" реальной " памятью (т. е. ОЗУ). Но большинство людей считают, что "виртуальная память" - это весь уровень абстракции, который операционная система дает программам, объединяющим ОЗУ и файл страницы.
Я не уверен, какое из этих определений предпочитает Mac OS, хотя кажется маловероятным, что ваш компьютер не будет есть любой выделена выгружаемая память, поэтому я предполагаю, что она, вероятно, добавляет 8 ГБ выгружаемой памяти к 8 ГБ фактической оперативной памяти, в общей сложности 16 ГБ доступной (виртуальной) памяти.
помните, что, поскольку операционная система управляет выделением памяти и запросами на освобождение, она может делать все, что захочет. Я понимаю, что большинство операционных систем имеют разные таблицы распределения памяти для каждого процесса, поэтому они могут буквально дать то же самое адрес виртуальной памяти для нескольких программ, но эти адреса памяти будут сопоставляться с различными фактическими блоками в памяти. Таким образом, 64-разрядная операционная система может выделить максимальное количество 32-разрядных адресов нескольким 32-разрядным программам-они не ограничены одними и теми же 32-разрядными адресами памяти.
тем не менее, есть ограничения: операционная система может иметь ограничения, установленные на размер файла страницы разрешено расти. Поэтому, если вы намеренно не сказали своей операционной системе сделать это, вероятно, у него не будет 64 ГБ общей виртуальной памяти. И даже если это так, он не может выделить все 64 ГБ для каждой программы, поэтому у вас, скорее всего, будет OutOfMemory
ошибка перед тем, как ОС выделяет виртуальный адрес в 0xFFFFFFFFF
в вашей программе. (На самом деле, я бы не удивился, узнав, что 0xFFFFFFFFF
на самом деле является зарезервированным местоположением кода ошибки, подобным 0x0
.) Но поскольку адреса, о которых знает ваша программа, не имеют корреляции с истинными адресами памяти, есть вероятность, что вы закончите до выделения адреса памяти, который ваша программа считает 0xFFFFFFFFF
, даже если операционная система не использует почти столько памяти.
есть один большой гигантский таблицы страниц, которая включает в себя все страницы для каждого процесса или каждый процесс имеет свою таблицу страниц?
скорее всего, оба... и еще кое-что.
- каждый процесс имеет свою таблицу частной памяти, и ОС будет активно препятствовать доступу вашей программы к памяти адрес, который не был выделен для этой таблицы.
- существует также такая вещь, как общая память, поэтому два процесса, которые должны использовать одну и ту же информацию, могут создавать область общей памяти и иметь адреса в этом пространстве памяти, доступные обоим.
- сама операционная система, очевидно, должна иметь какой-то способ отслеживать, сколько общей памяти доступно, какие адресные пространства свободны/используются, и какие блоки виртуальной памяти были выделены для которых расположение в ОЗУ или в файле страницы.
Итак, предположим, что процесс был выделен памяти по адресу 0x00000002
, когда он идет, чтобы загрузить значение из этого адреса памяти, операционная система может признать, что это на самом деле сопоставляется с реальным адресом памяти 0x00000F23
, и это адрес памяти, значение которого будет фактически извлечено в регистр процессора. Или он может понять, что он переместил страницу, содержащую этот адрес, на диск где-то, и в этом случае операционная система найдет пустую часть памяти и сначала загрузит данные страницы с диска в эту память. (Опять же, этот адрес памяти не имеет никакой корреляции с исходным адресом памяти, который запросила программа.)
если нет пустой памяти, чтобы вытащить страницу из, ОС сначала придется переместить некоторые данные из памяти и в файл страницы. Он пытается разумно определить, какая память наименее вероятно будет использоваться в ближайшем будущем. Но иногда вы в конечном итоге память постоянно запрашивается вскоре после ее замены на диск, только чтобы заменить следующий кусок памяти, который программа собиралась запросить. Эта "трепка" - это то, что заставляет компьютеры с недостаточной памятью идти действительно медленный, так как доступ к диску на порядок медленнее, чем доступ к памяти.
прежде чем я отвечу на ваши вопросы (надеюсь), вот несколько вводных замечаний:
Примечания
проблема здесь в том, что" виртуальная память " имеет два смысла. "Виртуальная память "как технический термин, используемый программистами низкого уровня, не имеет (почти) ничего общего с" виртуальной памятью", как объяснили потребителям.
в техническом смысле "виртуальная память" - это система управления памятью, в которой каждый процесс имеет свое виртуальное адресное пространство и память адреса в этом адресном пространстве сопоставляются с адресами физической памяти ядром ОС с аппаратной поддержкой (использует такие термины, как TLB, многоуровневые таблицы страниц, ошибки страниц и прогулки и т. д.). Это чувство VM, которое вас интересует (описано ниже).
в нетехническом смысле "виртуальная память" - это дисковое пространство, используемое вместо ОЗУ (использует такие термины, как swap, backing store и т. д.). Это чувство VM, которое вас не особенно интересует, но кажется, что вы видели некоторые материалы, которые имеют дело в основном с этим смыслом термина или путает два.
Вопрос 1
что происходит, когда мои программы хотят получить доступ к адресу памяти 0xfffffffffff? У меня есть только 4GB
в этом случае, ваша "теория 1" ближе.
ВМ отделяет адресов, что программа "видит" и работает с виртуальными адресами - от физических адресов. Ваш 4GiB памяти может быть физическое адреса от 0x0 до 0xFFFFFFFF (8 F), но адрес 0xfffffffffff (9 F) находится в пользовательском пространстве (в каноническом макете)виртуальные адреса. При условии, что 0xfffffffffff находится в блоке, выделенном процессу, процессор и ядро (совместно) переведут адрес страницы 0xFFFFFF000 (предполагая страницу 4k, мы просто отрежем нижние 12 бит) на реальную физическую страницу, которая может иметь (почти) любой физический базовый адрес. Предположим физический адрес этой страницы 0xeac000 (отношения установлено, когда ядро дало вам виртуальную страницу 0xFFFFFF000), то байт по виртуальному адресу 0xFFFFFFFFF находится по физическому адресу 0x00eacfff.
когда вы разыменовываете 0xfffffffffff (предполагая 4K страниц), ядро "просит" ЦП получить доступ к этому виртуальному адресу, и ЦП отсекает нижние 12 бит и просматривает страницу в dTLB (буферы lookaside перевода-это кэш сопоставления виртуальных и физических страниц; есть по крайней мере один для данных и один для инструкций). Если есть хит, CPU создает реальный физический адрес и извлекает значение. Если есть промах TLB, процессор вызывает ошибку страницы, которая заставляет ядро консультироваться (или "ходить") с таблицами страниц, чтобы определить правильную физическую страницу, и "возвращает" это значение процессору, который кэширует его в dTLB (он, скорее всего, будет повторно использован почти сразу). Затем ядро запрашивает у ЦП этот адрес снова и на этот раз он будет успешным без запуска ходьбы.
Я признаю что это описание довольно паршивое (отражающее мой собственный уровень знаний). В частности, точный способ, которым конкретный думаю основная причина этого заключается в том, что многие виртуальные физические сопоставления являются n:1, а не 1:1, поскольку все они 1: 1 в значительной степени победят главную цель VM: подумайте об общих страницах readonly, содержащих инструкции для библиотек типа libc
, или копировать-на-запись страниц данных, разделяемых между родителем и дочерним после вилки. Дублирование этих записей для каждого процесса в таблицах страниц каждого процесса менее эффективно, чем добавление/удаление записей конкретного процесса в/из общего набора таблиц страниц при создании/выходе процесса.
Где Диск Входит
Как только у вас есть система VM, становится почти тривиальным добавить возможность извлечения страницы с диска при возникновении ошибки страницы и реализуйте "старение" для PTEs, чтобы наименее недавно использованные страницы можно было поместить на диск. Хотя это важная функция в системах с ограниченной памятью, она практически не имеет отношения к пониманию того, как работает система виртуальной машины.