#linux #shared-libraries #.so
#linux #общие библиотеки #.so
Вопрос:
Это из файла smaps:
b750d000-b76bc000 r-xp 00000000 08:01 918842 /lib/i386-linux-gnu/libc-2.23.so
p
r-xp
Я полагаю, что in указывает, что он загружен как частный. Почему это так? Разве это не противоречит назначению общих библиотек, если копия каждого файла .so загружается в разные адреса памяти для разных процессов? Какое преимущество дает эта частная загрузка?
Ответ №1:
p
соответствует MAP_PRIVATE
. man mmap
утверждает, что:
MAP_PRIVATE
: Создайте частное сопоставление копирования при записи. Обновления сопоставления не видны другим процессам, отображающим тот же файл, и не передаются в базовый файл. […]
Страницы физической памяти для этой виртуальной машины будут использоваться всеми процессами до тех пор, пока не будут внесены изменения (они также используются совместно с кэшем ядра). Когда виртуальная страница изменяется в данном процессе, страница дублируется (не разделяется) для этого процесса (копирование при записи).
Давайте посмотрим на:
$ cat /proc/self/maps 00400000-0040c000 r-xp 00000000 08:11 529223 /bin/cat 0060b000-0060c000 r--p 0000b000 08:11 529223 /bin/cat 0060c000-0060d000 rw-p 0000c000 08:11 529223 /bin/cat [...]
-
Первая и вторая виртуальные машины доступны только для чтения. Они (обычно) не будут изменены и будут (обычно) использоваться всеми процессами.
-
Третья VMA (
rw-p
) доступна для записи, но изменения в одном процессе не должны быть видны в других процессах. Эта виртуальная машина содержит (изменяемые) глобальные переменные, которые не являются общими для разных процессов.