как файл общей библиотеки вызывается двумя разными процессами в Linux? - PullRequest
17 голосов
/ 11 декабря 2010

В Linux, У меня есть файл общей библиотеки с именем foo.so Когда я выполняю 2 разных процесса p1, p2, оба используют foo.so. Этот foo.so перекрывается этими двумя процессами?

Ответы [ 2 ]

36 голосов
/ 11 декабря 2010

В системах на основе Unix (включая Linux) сегмент кода (.text) может совместно использоваться несколькими процессами, поскольку он неизменен.Вы упомянули это перекрытие?

По сути, каждая общая библиотека, которая содержит статические данные (например, глобальные переменные), имеет глобальную таблицу смещений (GOT) .В разделяемых библиотеках все ссылки на статические данные (например, глобальные переменные) происходят через GOT (они косвенные).Таким образом, даже если сегмент кода совместно используется несколькими процессами, каждый процесс имеет свое исключительное отображение других сегментов совместно используемой библиотеки, включая соответствующий GOT, чьи записи перемещаются соответствующим образом.

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

Я также рекомендую главу 10, Динамическое связывание и загрузка , из следующей книги: Компоновщики и загрузчики .

5 голосов
/ 11 декабря 2010

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

Затем ОС предоставляет каждому из процессов доступ к этой одной копии в памяти.

Возможно, что каждый из процессов "увидит" копию как адрес, отличающийся от другого. Это решается блоком управления памятью ЦП.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...