#c #linux #shared-libraries
#c #linux #разделяемые библиотеки
Вопрос:
Пока я изучал разделяемую библиотеку, я прочитал заявление
Хотя код разделяемой библиотеки является общим для нескольких процессов, его переменные — нет. Каждый процесс, использующий библиотеку, имеет свои собственные копии глобальных и статических переменных, которые определены в библиотеке.
У меня просто есть несколько сомнений.
- Находится ли часть кода каждого процесса в отдельном адресном пространстве?
- Находится ли часть кода общей библиотеки в некотором глобальном (уникальном) адресном пространстве.
Я только начинающий, поэтому, пожалуйста, помогите мне понять.
Спасибо!
Комментарии:
1. Это «процесс», а не «прогресс».
2. Проверьте эту ссылку: duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory . Это очень хорошо объясняет, что такое программа в памяти. Вы можете видеть, что разделяемые библиотеки обычно отображаются в память в виртуальном адресном пространстве процесса
Ответ №1:
Общие библиотеки загружаются в процесс путем сопоставления файла с памятью в некоторой части адресного пространства процесса. Когда несколько процессов загружают одну и ту же библиотеку, ОС просто позволяет им совместно использовать одну и ту же физическую память.
Части библиотеки, которые могут быть изменены, такие как статические глобальные переменные, обычно загружаются в режиме копирования при записи, так что при попытке записи возникает ошибка страницы, ядро реагирует копированием затронутой страницы на другую физическую страницу ОЗУ (только для этого процесса), отображение перенаправляется на новую страницу, а затем, наконец, операция записи завершается.
Чтобы ответить на ваши конкретные вопросы:
- Все процессы имеют свое собственное адресное пространство. Совместное использование физической памяти между процессами невидимо для каждого процесса (если они не делают это намеренно через API общей памяти).
- Все данные и код хранятся в физической оперативной памяти, которая является своего рода адресным пространством. Однако большинство адресов, которые вы, вероятно, видите, являются адресами виртуальной памяти, принадлежащими адресному пространству того или иного процесса, даже если этот «процесс» является ядром.
Комментарии:
1. Значит, это применимо даже тогда, когда исполняемый файл создается путем статического связывания библиотеки?
2. @Sandeep Да и нет. Статические библиотеки становятся частью исполняемого файла и не используются совместно с другими программами. Однако сам исполняемый файл загружается таким же образом, как и общая библиотека, и используется совместно с другими запущенными экземплярами программы, при этом записи управляются так, как я описал.