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