Как применение разделяемых библиотек может привести к увеличению расхода памяти?
Использование разделяемой библиотеки сборки при редактировании связей может привести к увеличению размера выполняемого файла. Напомним, что в ОС UNIX V версии 3.1 редактирование связей является статическим, что означает необходимость разрешения всех внешних ссылок программы к моменту ее выполнения. Напомним также, что разделяемая библиотека может обращаться к внешним (импортируемым) именам, которые в ней не определяются. Эти имена порождают при редактировании связей внешние ссылки, для разрешения которых редактор связей включает в выполняемый файл соответствующие секции .text и .data, что увеличивает размер файла.
Разделяемая библиотека выполнения может увеличить размер процесса. Напомним, что в разделе Как ОС UNIX работает с разделяемыми библиотеками? указывалось, что к процессу присоединяются секции команд и данных разделяемой библиотеки выполнения. Секция команд разделяется между всеми процессами, которым она нужна, однако это не касается секции данных. Каждый процесс, использующий библиотеку, получает свою собственную копию всей секции данных библиотеки. Это, разумеется, увеличивает объем памяти, нужной процессу. В результате, если процессу в действительности нужна лишь малая часть функций и данных разделяемой библиотеки, он может занять больше памяти, чем если бы он создавался с архивной библиотекой. Так, неразумно было бы использовать разделяемую библиотеку языка C, если Вам нужна только функция strcmp(3S). Хотя разделяемое использование самой strcmp(3S) и экономит память, в этом случае перевешивают потери, связанные с необходимостью копирования в процесс всей секции данных разделяемой библиотеки языка C, поэтому лучше использовать архивную версию библиотеки.
Отметим, что приведенные соображения важны, на наш взгляд, лишь с теоретической точки зрения. Полезно понимать, как ОС UNIX работает с разделяемыми библиотеками, как размещаются процессы в памяти. Собственно накладные расходы, связанные с использованием разделяемых библиотек, как правило, малы по сравнению с размером секции данных выполняемой программы.