виртуальная адресация физическая адресация - PullRequest
1 голос
/ 15 июля 2011

Я не совсем понимаю преимущества " нескольких независимых виртуальных адресов, которые указывают на один и тот же физический адрес ", хотя я читаю много книг и сообщений,

Например, в аналогичном вопросе Разница между физической адресацией и концепцией виртуальной адресации ,

В посте утверждается, что программа не будет сбивать друг друга, и

"в общем, конкретная физическая страница отображается только на одно приложение виртуальное пространство "

Ну, в http://tldp.org/LDP/tlk/mm/memory.html, в разделе «Общая виртуальная память» написано

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

Если один физический адрес (например, программа-оболочка) сопоставлен с двумя независимыми виртуальными адресами, как это может не произойти сбой? Разве это не то же самое, что физическая адресация?

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

Ответы [ 2 ]

4 голосов
/ 15 июля 2011

Существует два основных варианта использования этой функции.

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

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

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

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

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

2 голосов
/ 15 июля 2011

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

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

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

В цитате

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

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

...