Я пытаюсь выяснить последствия распределения, в котором статические двоичные файлы предпочтительнее общих. Для этого я собрал небольшой скрипт оболочки Scala , который 1) пересекает каталоги /bin
, /sbin
, /usr/bin
, /usr/sbin
, 2) находит исполняемые файлы, не являющиеся символическими ссылками, и 3) Суммирует размер файла библиотек, перечисленных в ldd
. Является ли это осуществимым подходом для вычисления необходимого дополнительного пространства?
Кроме того, что может повлиять на использование памяти во время выполнения? То есть двоичные файлы, скомпилированные для одной и той же разделяемой библиотеки, позволят ядру создавать экземпляр разделяемой библиотеки только один раз во время выполнения. В случае статических двоичных файлов каждый двоичный файл должен будет зарезервировать дополнительную память для той же самой библиотеки. С достаточным количеством пространства подкачки все еще будет проблема? (В конце концов, разве не так работает большинство приложений Windows в пользовательском пространстве?) Есть ли другие потенциальные последствия, которые я мог бы упустить?
Ключевое различие между статическими и общими библиотеками заключается в том, что при использовании статических библиотек каждая программа имеет копию частей библиотеки, которую она использует. В общей библиотеке код хранится отдельно.
Windows, как Linux, использует смесь статически связанных и общих библиотек. В Windows файлы DLL являются общими библиотеками в Linux, библиотеки обычно имеют расширение .so
Программы, написанные со статическими библиотеками, занимают больше места на диске. Кроме того, если две или более работающих программ используют одни и те же библиотечные функции, этот код будет находиться в ОЗУ несколько раз. В зависимости от сложности вызываемых функций это может означать, что используется больше ОЗУ, и поэтому может потребоваться чаще менять пространство. При вызове разделяемой библиотеки возникают накладные расходы, поэтому, если функция достаточно проста, может быть более эффективным с точки зрения оперативной памяти иметь статическую библиотеку.
Если в общей библиотеке обнаружена ошибка, необходимо обновить только общую библиотеку. Если та же ошибка обнаружена в статической библиотеке, то все программы, которые ее используют, должны быть перекомпилированы и обновлены. С другой стороны, если программа связана с использованием статических библиотек, то не стоит беспокоиться о том, доступна ли библиотека, и является ли она правильной версией.
У обоих подходов есть свои преимущества и недостатки.
Больше информации можно найти здесь
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html