Библиотеки динамической компоновки
При создании загрузочных модулей для однозадачных операционных систем, таких как MS DOS, применяется статическая компоновка. Исходный текст приложения оформляется в виде текстового файла, называемого исходным модулем. Затем осуществляется обработка исходного модуля транслятором, результатом которой является объектный модуль. На последнем этапе объектный модуль обрабатывается редактором связей. Редактор связей компонует в один загрузочный модуль все объектные модули, входящие в состав проекта, а также объектные модули из внешних библиотек транслятора. Таким образом, редактор связей записывает в один исполнимый файл весь код , который может понадобиться при выполнении программы. Если для загрузки подобного файла не хватает оперативной памяти, программист должен самостоятельно разрешать эту проблему, создавая программы, имеющие оверлейную структуру. В мультизадачных операционных системах статическая компоновка оказывается неэффективной, так как приводит к неэкономному использованию одного из самых дефицитных ресурсов - оперативной памяти. Действительно, если в системе одновременно работает несколько приложений и все они используют некоторую функцию, то при статической компоновке в памяти одновременно будет присутствовать несколько копий этой функции. Очевидно, использование памяти было бы гораздо более эффективным, если бы в памяти находилась только одна копия функции, а все работающие приложения могли бы ее вызывать. Практически в любой мультизадачной среде используется именно такой способ
77
обращения к функциям , необходимым параллельно работающим приложениям. При этом совместно используемые функции объединяются в библиотеки динамической компоновки ( Dynamic-Link Libraries - DLL). При использовании динамической компоновки код совместно используемых приложениями функций помещается в отдельные файлы - DLL-библиотеки, загружаемые в память в единственном экземпляре. Главным отличием динамической компоновки от статической является то, что при динамической компоновке связывание объектных модулей производится не на этапе формирования загрузочного модуля, а уже после загрузки модуля в оперативную память. При использовании механизма динамической компоновки в загрузочном модуле приложения обычно располагаются только те функции, которые являются специфическими для данной программы. Совместно используемые функции объединяются в другом загрузочном модуле - библиотеке DLL (обычно это файл * . dll , хотя может быть использовано любое другое расширение). DLL - библиотека обычно загружается в память в тот момент , когда какому-то приложению потребуется функция из этой библиотеки, хотя возможна и явная загрузка библиотеки при помощи функции LoadLibrary. DLL-библиотека располагается в собственном виртуальном адресном пространстве, недоступном другим процессам. Сегмент кода библиотеки отображается в адресное пространство “заинтересованных” процессов при помощи механизма проецирования файлов в память, который мы кратко рассмотрим в следующей главе. Для каждого процесса, использующего библиотеку, в ее адресном пространстве создается копия сегмента данных библиотеки, которая отображается в адресное пространство соответствующего процесса описанным выше способом. После этого функции DLL-библиотеки будут доступны всем использующим их приложениям. Отметим, что DLL-библиотека не имеет сегмента стека и ее функции пользуются стеком вызвавшего их потока. Существуют также библиотеки, которые не имеют сегментов кода и данных, а включают в себя только ресурсы, доступные нескольким приложениям.
предыдущаяследующая