Могут ли два разных процесса иметь один и тот же адрес?

Это вопрос для собеседования, который я нашел на веб-сайте: «В виртуальной памяти могут ли два разных процесса иметь один и тот же адрес? Когда вы отвечаете« Нет », что является правильным, как один процесс может получить доступ к другому процессу» память, например, отладчик может обращаться к переменным и изменять их во время отладки? "

Я понимаю следующее:

  1. Процесс 2 diff может иметь один и тот же адрес виртуальной памяти. Это потому, что каждый процесс имеет свою собственную таблицу страниц. Каждый процесс считает это 4 Гб памяти на 32-битной машине. Таким образом, и P1, и P2 могут обращаться к адресу 0xabcdef, но физическая память может быть разной. Разве это не правильно?

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

14
задан Joachim Sauer 24 August 2010 в 11:10
поделиться

4 ответа

1)

  • Одинаковый адрес физической памяти одновременно: НЕТ
  • Одинаковый адрес виртуальной памяти одновременно : ДА (каждый из них соответствует разным физическим адресам или пространству подкачки)

2) Я думаю, что отладчики не имеют прямого доступа к другому отлаживаемому процессу, но взаимодействуют со средой выполнения в отлаживаемом процессе, чтобы внести эти изменения.

Тем не менее, возможно, инструкции ОС или процессора обеспечивают доступ / изменение доступа к чужой памяти, если у вас есть на это право. Это не означает, что у него ОДИН адрес, это только говорит, что процесс 1 может сказать «доступ к памяти @ адрес1 в Процессе2». Кто-то (процессор / ОС / среда выполнения) сделает это для процесса 1.

9
ответ дан 1 December 2019 в 07:05
поделиться

Иногда я чувствую себя «старшим» в рекламе Minolta ... 1960-е годы Multics были созданы с использованием виртуальной памяти. Последняя система Multics была остановлена ​​30 октября 2000 г. в 17: 08Z.

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

Когда я смотрю в диспетчер задач Windows и вижу несколько копий программы (например, svchost.exe), я задаюсь вопросом, почему и как были утеряны революционные концепции Multics.

1
ответ дан 1 December 2019 в 07:05
поделиться

Каждый процесс имеет адресное пространство 4 ГБ в 32-битной системе. Где эти настоящие 4гб управляет ОС. Таким образом, в принципе, два разных процесса могут иметь одинаковые адреса, локальные по отношению к процессу.

Теперь, когда один процесс должен прочитать память другого процесса, он должен либо взаимодействовать с другим процессом (файлы с отображением памяти и т. Д.), Либо использовать API отладки, например OpenProcess / ReadProcessMemory.

Я уверен, что один процесс не может напрямую пойти и прочитать виртуальную память другого процесса, по крайней мере, в Win32 без помощи ОС.

1
ответ дан 1 December 2019 в 07:05
поделиться

Теоретически каждый процесс, выполняемый пользователем в любой из существующих популярных операционных систем (Win, Linux, Unix, Sol и т. д.), изначально может использовать диапазон адресов 4 гигабайта (0x00000000 t0 0xffffffff на 32-битной платформе) , будь то простая программа hello world или сложный веб-контейнер, на котором размещается сайт stackoverflow. Это означает, что каждый процесс имеет свой диапазон, начинающийся с одного и того же начального адреса и заканчивающийся одним и тем же адресным пространством ВИРТУАЛЬНО. Таким образом, очевидно, что каждый процесс имеет одни и те же виртуальные адреса в соответствующем диапазоне виртуального адресного пространства. Итак, ответ на ваш первый вопрос - ДА.

Разница возникает, когда ОС выполняет какой-либо процесс, современные ОС являются многозадачными ОС, и они выполняют больше, чем процесс в любой момент времени. Таким образом, размещение 4 ГБ каждого процесса в основной памяти вообще невозможно. Итак, операционные системы используют систему пейджинга, в которой они делят диапазон виртуальных адресов (от 0x00000000 до 0xffffffff) на страницу размером 4k (не всегда). Таким образом, перед запуском процесса он фактически загружает необходимые страницы, которые требовались в начальный момент времени, в основную память, а затем загружает другие диапазоны виртуальных страниц по мере необходимости.Таким образом, загрузка виртуальной памяти в физическую память (основную память) называется отображением памяти. В этом процессе вы сопоставляете диапазон виртуальных адресов страницы с диапазоном физических адресов (например, диапазон виртуальных адресов от ox00000000 до ox00001000 с диапазоном физических адресов от 0x00300000 до 0x00301000) на основе свободного слота в основной памяти. Таким образом, в любой момент времени только один виртуальный адрес диапазон будет сопоставлен с этим конкретным диапазоном физических адресов, поэтому ответ на ваш второй вопрос - НЕТ.

НО

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

Например, в Linux каждый исполняемый файл требует библиотеки libc.so для выполнения исполняемого файла программы. Каждый процесс загружает свои необходимые библиотеки и выделяет им некоторые диапазоны виртуальных адресных страниц в своем адресном пространстве. Итак, теперь рассмотрим сценарий, в котором вы выполняете сотни процессов, где каждому процессу требуется эта библиотека libc.so. Итак, если ОС выделяет виртуальное адресное пространство в каждом процессе для этой библиотеки libc.so, то вы можете себе представить уровень дублирования для библиотеки libc.so и весьма вероятно, что в любой момент времени вы получите несколько экземпляров адреса libc.so. диапазон страниц в основной памяти. Таким образом, чтобы создать избыточность, ОС будет загружать libc.so в определенный диапазон виртуального адресного пространства каждого процесса, который сопоставлен с фиксированным диапазоном физических адресов в основной памяти. Таким образом, каждый процесс будет ссылаться на этот фиксированный физический адрес диапазон для выполнения любого кода в libc.so.Таким образом, в этом случае каждый процесс также использует некоторые диапазоны физических адресов.

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

Надеюсь, это поможет.

25
ответ дан 1 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: