Статическое и динамическое связывание в операционных системах

Опубликовано: 2 Декабря, 2021

Статическое связывание:
Когда мы щелкаем .exe (исполняемый) файл программы и она запускается, все необходимое содержимое двоичного файла загружается в виртуальное адресное пространство процесса. Однако большинству программ также необходимо запускать функции из системных библиотек, и эти библиотечные функции также должны быть загружены.

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

Недостаток:
Каждая сгенерированная программа должна содержать копии точно таких же функций общей системной библиотеки. С точки зрения использования как физической памяти, так и дискового пространства, гораздо эффективнее загружать системные библиотеки в память только один раз. Динамическое связывание позволяет выполнить эту однократную загрузку.

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

После этого он отображает библиотеки в середину виртуальной памяти и разрешает ссылки на символы, содержащиеся в этих библиотеках. Мы не знаем, где в памяти фактически отображаются эти разделяемые библиотеки: они компилируются в позиционно-независимый код (PIC), который может работать по любому адресу в памяти.

Преимущество:
Уменьшены требования к памяти программы. DLL загружается в память только один раз, тогда как несколько приложений могут использовать одну DLL в данный момент, тем самым экономя место в памяти. Также снижаются затраты на поддержку и обслуживание приложений.