Разделяемая библиотека

Из Википедии, бесплатной энциклопедии

Разделяемая библиотека или общая библиотека — это файл, который предназначен для совместного использования программами. Модули, используемые программой, загружаются из отдельных общих объектов в память, а не копируется компоновщиком, когда он копирует один исполняемый файл для программы.

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

Некоторые старые системы, например, Burroughs MCP[en], Multics, также имеют только один формат для исполняемых файлов, независимо от того, являются ли они общими. Они имеют файлы общей библиотеки того же формата, что и исполняемые файлы. Это даёт два основных преимущества: во-первых, для каждого из них требуется только один загрузчик, а не два (наличие отдельного загрузчика приносит дополнительную сложность). Во-вторых, он также позволяет использовать исполняемые файлы в качестве разделяемых библиотек, если у них есть таблица символов. Типичные форматы комбинированных исполняемых и совместно используемых библиотек: ELF и Mach-O (оба в Unix) и PE (Windows).

В некоторых более старых средах, таких как 16-битная Windows или MPE[en] для HP 3000, в коде с общей библиотекой допускались только данные на основе стека (локальные), или другие существенные ограничения были наложены на код разделяемой библиотеки.

Разделяемая память[править | править код]

Код библиотеки может совместно быть в памяти вместе c процессами, а также на диске. Если используется виртуальная память, процессы будут выполнятся в физической странице ОЗУ, которая отображается в разные адресные пространства процессов. Это имеет свои преимущества. Например, в системе OpenStep приложения часто имеют размер всего несколько сотен килобайт и быстро загружаются; большая часть их кода находилась в библиотеках, которые уже были загружены операционной системой для других целей.

Программы могут осуществлять совместное использование ОЗУ с помощью независимого кода, как в Unix, что приводит к сложной, но гибкой архитектуре. Это гарантирует, что с помощью различных приёмов, таких как предварительное отображение адресного пространства и резервирование страниц для каждой разделяемой библиотеки, имеет большую вероятность совместного использования. Третьим вариантом является одноуровневое хранилище[en], используемое IBM System/38[en] и его преемниками.

В некоторых случаях разные версии разделяемых библиотек могут вызывать проблемы, особенно когда библиотеки разных версий имеют одинаковые имена файлов, и используется для разных приложений, установленных в системе, для каждой требуется определённая версия. Такой сценарий известен как DLL hell, названный в честь Windows и OS/2 DLL. Большинство современных операционных систем после 2001 года имеют методы очистки для устранения таких ситуаций или использования «частных» библиотек для конкретных приложений.

См. также[править | править код]

Примечания[править | править код]