Электронный учебник:


Курс лекций:


Дополнительно:

Практикум:



Наши хостеры:

ремонт в новостройке

--------------------------

Библиотеки динамической компоновки

При создании загрузочных модулей для однозадачных операционных систем, таких как  MS DOS, применяется статическая компоновка. Исходный текст приложения  оформляется  в  виде текстового файла, называемого исходным модулем. Затем  осуществляется  обработка  исходного  модуля  транслятором,  результатом  которой  является  объектный  модуль.  На  последнем  этапе  объектный  модуль обрабатывается  редактором  связей.  Редактор  связей  компонует  в  один  загрузочный  модуль  все  объектные  модули,  входящие  в  состав  проекта,  а  также  объектные  модули  из  внешних  библиотек  транслятора.  Таким  образом,  редактор  связей  записывает  в  один  исполнимый  файл  весь  код ,  который  может  понадобиться  при  выполнении  программы.  Если  для  загрузки  подобного  файла  не  хватает  оперативной  памяти,  программист  должен  самостоятельно  разрешать  эту  проблему,  создавая  программы,  имеющие   оверлейную  структуру. В  мультизадачных  операционных  системах  статическая  компоновка  оказывается  неэффективной,  так  как  приводит  к  неэкономному  использованию  одного  из  самых  дефицитных  ресурсов - оперативной   памяти.  Действительно,  если  в  системе  одновременно  работает  несколько  приложений  и  все  они  используют  некоторую  функцию,  то  при  статической  компоновке в  памяти  одновременно  будет  присутствовать  несколько  копий этой  функции.  Очевидно,  использование  памяти  было  бы  гораздо  более  эффективным,  если  бы  в  памяти  находилась  только  одна  копия  функции,  а   все  работающие   приложения могли бы ее вызывать. Практически  в  любой  мультизадачной   среде  используется  именно  такой   способ

77

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

предыдущаяследующая