Будет ли использование разделяемой библиотеки вместо статической библиотеки влиять на использование памяти? - PullRequest
2 голосов
/ 05 марта 2011

Я ссылаюсь на 10 статических библиотек.

Размер моего двоичного файла уменьшается, когда я использую динамическую библиотеку.

Как я знаю, использование динамической библиотеки не уменьшит использование памяти.

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

Это утверждение верно?

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

Когда процесс запускается, получается 10 детей. Так будет ли использование динамической библиотеки вместо статической библиотеки уменьшать общее использование памяти?

Ответы [ 3 ]

8 голосов
/ 05 марта 2011

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

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

4 голосов
/ 05 марта 2011

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

С другой стороны, другие процессы небыть в состоянии поделиться кодом, если они статически связаны.Рассмотрим libc, с которой практически все двоичные ссылки ссылаются ... если бы все они были статически связаны, у вас получилось бы несколько десятков копий printf в памяти.если у вас нет веских причин для этого.

2 голосов
/ 05 марта 2011

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

Здесь есть сообщение на эту тему:

http://www.linuxquestions.org/linux/articles/Technical/Understanding_memory_usage_on_Linux

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