Я изучал эти темы и прочитал много статей и книг, но во всех них не хватает дополнительной информации, и они сбили меня с толку еще больше. Итак, здесь я хотел бы объяснить, что я знаю, когда задаю свои вопросы. Надеюсь, эта тема будет полезна многим вроде меня. Также хотелось бы узнать обоснованность моих знаний и исправления при необходимости.
Виртуальная память
В некоторых статьях говорится: «Виртуальная память - это некоторое пространство на жестком диске, которое имитирует физическую память, поэтому у нас может быть больше памяти, чем есть на самом деле». В некоторых других статьях говорится: «Виртуальная память - это комбинация физической памяти (ОЗУ), раздела жесткого диска, который действует как физическая память и таблицы страниц». Однако это разные вещи, и я не понимаю, почему существуют такие разные объяснения.
Давайте перейдем ко второму объяснению, поскольку именно так Википедия описывает виртуальную память. На этом этапе виртуальный адрес имеет смысл, поскольку мы используем адрес в виртуальной памяти, а не напрямую в физической памяти.
Кстати, мой Mac говорит, что у меня 8 ГБ физической памяти и 8 ГБ виртуальной памяти. В этом случае включает ли виртуальная машина физическую память или это объем места на жестком диске, используемого в качестве памяти? Доступно ли мне 16 ГБ памяти для моих программ?
Вопрос 1:
Intel i5 имеет 36-битную адресную шину, а это означает, что вы можете адресовать 64 ГБ памяти. Допустим, я установил на свой компьютер 4 ГБ ОЗУ. Однако мои программы могут не знать о размере установленной памяти, поскольку она будет использоваться во многих различных системах с разными объемами памяти. Вот где виртуальная память становится удобной. Он абстрагирует фактический размер установленной памяти.
Однако что происходит, когда мои программы хотят получить доступ к адресу памяти 0xFFFFFFFFF? У меня установлено только 4 ГБ и, возможно, немного места в памяти HD.
У меня есть две теории на этот вопрос:
1. Поскольку таблицы страниц обслуживаются ОС, ОС декодирует этот адрес и определяет, какая это страница, и проверяет эту страницу в таблице страниц, чтобы узнать, связан ли с ней физический адрес (действительный и недопустимые флаги), если да, то переходит на физический адрес, на который указывает страница входа в физической памяти + смещение, определенное в виртуальном адресе, и возвращает это значение. В противном случае происходит сбой страницы, и ОС ищет эту страницу во вторичном хранилище, извлекает ее и помещает в память и обновляет таблицу страниц.
2. Он вызывает исключение типа OutOfMemory, в котором говорится, что у меня нет памяти, к которой может обращаться данный адрес.
Недостатком первой теории является то, что что происходит, когда программа хочет использовать 64 ГБ памяти? Тогда нам нужно иметь 60 ГБ памяти в HD, поскольку у нас есть только 4 ГБ. Однако на снимке экрана ниже MAC говорит мне, что виртуальной памяти всего 8 ГБ.
Вопрос 2:
Как процессы помещаются в виртуальную память? Я имею в виду, имеет ли каждый процесс доступное пространство виртуальной памяти 0x0 - 0xFFFFFFFFF или существует только одно адресное пространство виртуальной памяти, в котором размещены все процессы?
Если каждый процесс предполагает, что у них есть вся доступная для них память, то воспоминания выглядят следующим образом:
Если есть только одна концепция виртуальной памяти, то она будет выглядеть так:
Таблица страниц
Таким образом, таблица страниц - это структура данных, которая находится между физическими адресами и виртуальными адресами. Это ассоциативный массив (или как словарь), в котором для каждой страницы (ключа) есть связанный физический адрес (значение).
ОС использует MMU (модуль управления памятью) для преобразования виртуального адреса в физический.
Вопрос 3:
Есть ли одна большая гигантская таблица страниц, которая включает все страницы для каждого процесса, или каждый процесс имеет свою собственную таблицу страниц?
Пейджинг
Пейджинг - это метод управления памятью. Виртуальная память и физическая память разделяются на страницы (которые представляют собой блоки фиксированного размера и одинакового размера) блоком управления памятью. Этот метод полезен, когда вы переключаете страницы между памятью и вторичным хранилищем, чтобы вы могли переключать страницы между ними. Например, ваша программа запрашивает данные, расположенные по адресу. Однако этот адрес, который использует ваша программа, является виртуальным адресом, и MMU преобразует его с помощью таблицы страниц. Во время этого MMU проверяет, присутствует ли запрошенная таблица страниц, и ОС получает ее из вторичного хранилища, если нет, и обновляет таблицу страниц.
Вопрос 4:
Допустим, процесс запрашивает данные с адреса, который преобразуется в физический адрес, по которому уже есть некоторые данные. Откуда известно, что данные не принадлежат процессам запрашивающей стороны и должны быть заменены данными из вторичного хранилища?
Например, есть грязный бит, который используется независимо от того, записывать эту страницу обратно на жесткий диск или нет, но я не думаю, что это то, что определяет процесс владельца.