.RU

3 Библиотеки динамической компоновки - Аннотация


3 Библиотеки динамической компоновки
Библиотеки динамической компоновки DLL (Dynamic Link Libraries) являются стержневым компонентом операционной системы Windows NT и многих приложений Windows. Без преувеличения можно сказать, что вся операционная система Windows, все ее драйверы, а также другие расширения есть ни что иное, как набор библиотек динамической компоновки. Редкое крупное приложение Windows не имеет собственных библиотек динамической компоновки, и ни одно приложение не может обойтись без вызова функций, расположенных в таких библиотеках. В частности, все функции программного интерфейса Windows NT находятся именно в библиотеках динамической компоновки DLL.

В 13 томе “Библиотеки системного программиста”, который называется “Операционная система Microsoft Windows 3.1 для программиста. Часть третья” мы уже рассказывали о создании и использовании библиотек DLL в среде операционной системы Microsoft Windows версии 3.1. Что же касается операционных систем Microsoft Windows NT и Microsoft Windows 95, то в них библиотеки DLL создаются и работают по-другому.
^ Статическая и динамическая компоновка
Прежде чем приступить к изучению особенностей использования библиотек динамической компоновки в операционной системе Microsoft Windows NT, напомним кратко, чем отличаются друг от друга статическая и динамическая компоновка.

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

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

В среде мультизадачной операционной системы статическая компоновка неэффективна, так как приводит к неэкономному использованию очень дефицитного ресурса - оперативной памяти. Представьте себе, что в системе одновременно работают 5 приложений, и все они вызывают такие функции, как sprintf, memcpy, strcmp и т. д. Если приложения были собраны с использованием статической компоновки, в памяти будут находится одновременно 5 копий функции sprintf, 5 копий функции memcpy, и т. д (рис. 3.1).



Рис. 3.1. Вызов функций при использовании статической компоновки

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

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

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

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



Рис. 3.2. Вызов функции при использовании динамической компоновки

В операционной системе Windows NT файлы библиотек динамической компоновки имеют расширение имени dll, хотя можно использовать любое другое, например, exe. В первых версиях Windows DLL-библиотеки располагались в файлах с расширением имени exe. Возможно поэтому файлы krnl286.exe, krnl386.exe, gdi.exe и user.exe имели расширение имени exe, а не dll, несмотря на то, что перечисленные выше файлы, составляющие ядро операционной системы Windows версии 3.1, есть ни что иное, как DLL-библиотеки. Наиболее важные компоненты операционной системы Microsoft Windows NT расположены в библиотеках с именами kernel32.dll (ядро операционной системы), user32.dll (функции пользовательского интерфейса), gdi32.dll (функции для рисования изображений и текста).

Механизм динамической компоновки был изобретен задолго до появления операционных систем Windows и OS/2 (которая также активно использует механизм динамической компоновки). Например, в мультизадачных многопользовательских операционных системах VS1, VS2, MVS, VM, созданных для компьютеров IBM-370 и аналогичных, код функций, нужных параллельно работающим программам, располагается в отдельных библиотеках и может загружаться при необходимости в специально выделенную общую область памяти.
^ DLL-библиотеки в операционной системе Windows NT
В операционной системе Microsoft Windows версии 3.1 после загрузки DLL-библиотека становилась как бы частью операционной системы. DLL-библиотека является модулем и находится в памяти в единственном экземпляре, содержит сегменты кода и ресурсы, а так же один сегмент данных (рис. 3.3). Можно сказать, что для DLL-библиотеки создается одна копия (instance), состоящая только из сегмента данных, и один модуль, состоящий из кода и ресурсов.



Рис. 3.3. Структура DLL-библиотеки в памяти

DLL-библиотека, в отличие от приложения, не имеет стека и очереди сообщения. Функции, расположенные в модуле DLL-библиотеки, выполняются в контексте вызвавшей их задачи. При этом они пользуются стеком копии приложения, так как собственного стека в DLL-библиотеке не предусмотрено. Тем не менее, в среде операционной системы Microsoft Windows версии 3.1 функции, расположенные в 16-разрядной DLL-библиотеке, пользуются сегментом данных, принадлежащей этой библиотеке, а не копии приложения.

Создавая приложения для операционной системы Microsoft Windows версии 3.1, вы делали DLL-библиотеки для коллективного использования ресурсов или данных, расположенных в сегменте данных библиотеки. Функции, входящие в состав 16-разрядной DLL-библиотеки, могут заказывать блоки памяти с атрибутом GMEM_SHARE. Такой блок памяти не принадлежит ни одному приложению и поэтому не освобождается автоматически при завершении работы приложения. Так как в Windows версии 3.1 все приложения используют общую глобальную память, блоки памяти с атрибутом GMEM_SHARE можно использовать для обмена данными между приложениями. Управлять таким обменом могут, например, функции, расположенные в соответствующей DLL-библиотеке.

Когда разные приложения, запущенные в среде операционной системы Microsoft Windows версии 3.1, обращались к одной и той же функции DLL-библиотеки, то они все использовали для этого один и тот же адрес. Это и понятно - так как все приложения работали на одной виртуальной машине, то все они находились в одном адресном пространстве.

В операционной системе Microsoft Windows NT каждое приложение работает в рамках отдельного адресного пространства. Поэтому для того чтобы приложение могло вызывать функции из DLL-библиотеки, эта библиотека должна находиться в адресном пространстве приложения.

Здесь мы обращаем ваше внимание на первое отличие механизма динамической компоновки в среде Microsoft Windows NT от аналогичного механизма для Microsoft Windows версии 3.1.
^ Отображение страниц DLL-библиотеки
В среде Microsoft Windows NT DLL-библиотека загружается в страницы виртуальной памяти, которые отображаются в адресные пространства всех “заинтересованных” приложений, которым нужны функции из этой библиотеки. При этом используется механизм, аналогичный отображению файлов на память, рассмотренный в первой главе нашей книги.

На рис. 3.4 схематически показано отображение кода и данных DLL-библиотеки в адресные пространства двух приложений.



Рис. 3.4. Отображение DLL-библиотеки в адресные пространства двух процессов

На этом рисунке показано, что в глобальном пуле памяти находится один экземпляр кода DLL-библиотеки, который отображается в адресные пространства приложений (процессов). Что же касается данных DLL-библиотеки, то для каждого приложения в глобальном пуле создается отдельная область. Таким образом, различные приложения не могут в этом случае передавать друг другу данные через общую область данных DLL-библиотеки, как это можно было делать в среде операционной системы Microsoft Windows версии 3.1.

Тем не менее, принципиальная возможность создания глобальных областей памяти DLL-библиотеки, доступных разным процессам, существует. Для этого необходимо при редактировании описать область данных DLL-библиотеки как SHARED.

Заметим, что одна и та же функция DLL-библиотеки может отображаться на разные адреса в различные адресные пространства приложений. Это же относится к глобальным и статическим переменным DLL-библиотеки - они будут отображаться на разные адреса для различных приложений.

Когда первое приложение загрузит DLL-библиотеку в память (явно или неявно), эта библиотека (точнее говоря, страницы памяти, в которые она загружена) будет отображена в адресное прстранство этого приложения. Если теперь другое приложение попытается загрузить ту же самую библиотеку еще раз, то для него будет создано новое отображение тех же самых страниц. На этот раз страницы могут быть отображены уже на другие адреса.

Кроме того, для каждой DLL библиотеки система ведет счетчик использования (usage count). Содержимое этого счетчика увеличивается при очередной загрузке библиотеки в память и уменьшается при освобождении библиотеки.

Когда содержимое счетчика использования DLL-библиотеки станет равным нулю, библиотека будет выгружена из памяти.
^ Обмен данными между приложениями через DLL-библиотеку
В среде операционной системы Microsoft Windows версии 3.1 существовала возможность обмена данными между различными работающими параллельно приложениями через область локальной кучи (local heap) DLL-библиотеки. Эта область находилась в сегменте данных DLL-библиотеки и потому была доступна всем приложениям.

Что же касается операционной системы Microsoft Windows NT, то в ее среде DLL-библиотеки не имеют собственных областей данных, а отображаются в адресные пространства приложений, загружающих эти библиотеки. Как результат, приложения не могут получать адреса статических и глобальных переменных и использовать эти переменные для обмена данными - ведь адрес, верный в контексте одного приложения, не будет иметь никакого смысла для другого приложения.

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

Если по какой-либо причине вы не можете использовать для обмена данными между приложениями файлы, отображаемые на память, можно создать DLL-библиотеку с данными, имеющими атрибут SHARED.

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

#pragma data_seg (“.shar”)

После этого в файле определения модуля для DLL-библиотеки необходимо указать атрибуты секции данных, как это показано ниже:

SECTIONS .shar READ WRITE SHARED

Можно также указать ключ редактору связей:

-SECTION:.shar,RWS

Строка RWS определяет атрибуты секции: R - READ, W - WRITE, S - SHARED.

При обращении к глобальным переменным, расположенным в секции с атрибутом SHARED, процессы должны выполнять взаимную синхронизацию с использованием таких средств, как критические секции, объекты-события, семафоры.

3-refleksivnost-na-valyutnom-rinke-biblioteka-kompanii-smart-trading-systems.html
3-reformirovanie-socialnoj-sferi-i-socialnaya-rabota-v-kontekste-sistemnoj-transformacii-v-stranah-vostochnoj-evropi-i-sng.html
3-reklamnie-teksti-i-stati-kurs-daet-predstavlenie-o-vazhnejshem-komponente-reklamnoj-deyatelnosti-sozdanii-reklamnogo.html
3-rekomendacii-po-sovershenstvovaniyu-ucheta-materialno-proizvodstvennih-zapasov-oao-vvedenskoe-drsu-avtodorstroj.html
3-rekomenduemaya-literaturai-metodicheskie-ukazaniya-po-ee-ispolzovaniyu.html
3-remont-kontrolno-kassovoj-tehniki-spravochnik-soderzhit-informaciyu-o-strukture-nalogovih-organov-kraya-kratkuyu.html
  • doklad.bystrickaya.ru/vladimir-bryuhanov-stranica-32.html
  • urok.bystrickaya.ru/priklyucheniya-erasta-fandorina-v-xix-veke-stranica-40.html
  • credit.bystrickaya.ru/perevod-s-angl-o-vishmidt-stranica-7.html
  • composition.bystrickaya.ru/poisk-legkih-otvetov-na-samie-slozhnie-voprosi-vsegda-bil-izlyublennoj-nashej-nacionalnoj-zabavoj-stranica-8.html
  • report.bystrickaya.ru/habarovskij-spasatel-budet-predstavlen-k-pooshreniyu-ia-vostok-media-28042010.html
  • klass.bystrickaya.ru/abstracts-submitted-at-international-and-national-conferences-stranica-5.html
  • uchebnik.bystrickaya.ru/uchebnoe-posobie-adresovano-studentam-fakultetov-i-otdelenij-po-podgotovke-i-perepodgotovke-specialistov-po-socialnoj-reabilitacii-detej-s-ogranichennimi-vozmozhnostyami-stranica-6.html
  • shkola.bystrickaya.ru/osnovnoe-obshee-obrazovanie-soderzhanie-poyasnitelnaya-zapiska.html
  • doklad.bystrickaya.ru/uchebno-metodicheskoe-posobie-2016-trebovaniya-k-oformleniyu-tekstovih-uchebnih-dokumentov-yaroslavl-gpou-yao-yaroslavskij-avtomehanicheskij-kolledzh.html
  • assessments.bystrickaya.ru/chelovek-v-svete-sovremennogo-estestvoznaniya-uchebno-metodicheskij-kompleks-po-discipline-koncepcii-sovremennogo.html
  • tasks.bystrickaya.ru/35-analiz-prichin-vozniknoveniya-bronhopnevmonii-telyat-v-hozyajstve-2-1-opredelenie-etiologii-bronhopnevmonii-telyat-4.html
  • books.bystrickaya.ru/bolezn-lenina-i-ego-smert-kniga-lenin-krasnij-diktator.html
  • otsenki.bystrickaya.ru/rezultati-pismennogo-ekzamena-osvoivshih-programmi-osnovnogo-obshego-obrazovaniya-volskogo-rajona-saratovskoj.html
  • university.bystrickaya.ru/gabriel-garsiya-markes-osen-patriarha-stranica-12.html
  • textbook.bystrickaya.ru/k-uchebniku-prekrasnoe-ryadom-s-toboj-oa-kurevina-ea-lutceva-i-k-uchebniku-informatika-i-ikt-av-goryachev.html
  • composition.bystrickaya.ru/osnovnaya-obrazovatelnaya-programma-osnovnogo-obshego-obrazovaniya-mbou-bolshekokuzskaya-sosh.html
  • credit.bystrickaya.ru/polozhenie-lyuboj-chastici-zhidkosti-otnositelno-nekotoroj-proizvolnoj-linii-nulevogo-urovnya-0-0.html
  • essay.bystrickaya.ru/chast-pervaya-vvedenie-v-prakticheskuyu-psihologiyu-obrazovaniya-uchebnik-dlya-studentov-visshih-i-srednih-specialnih.html
  • esse.bystrickaya.ru/referat-cel-raboti.html
  • literature.bystrickaya.ru/doklad-sdelan-na-seminare-modelirovanie-populyacionnih-processov.html
  • esse.bystrickaya.ru/referat-po-discipline-bibliotechnoe-delo.html
  • universitet.bystrickaya.ru/sravnitelnij-analiz-pokazatelej-smertnosti-naseleniya-promishlennih-monogorodov-sverdlovskoj-oblasti.html
  • knowledge.bystrickaya.ru/naimenovanie-raboti-na-pravo-zaklyucheniya-gosudarstvennogo-kontrakta-na-postavku-kontrolno-izmeritelnih-priborov.html
  • znanie.bystrickaya.ru/ak-74.html
  • student.bystrickaya.ru/12-sushnost-i-celi-mezhdunarodnogo-audita-planirovanie-audita-32-moshennichestvo-i-oshibki-32-uchet-zakonov-i-inih.html
  • urok.bystrickaya.ru/programma-disciplini-issledovanie-sistem-upravleniya-dlya-napravleniya-521500-menedzhment-vtoroj-uroven-visshego-professionalnogo-obrazovaniya-bakalavriat-moskva-2000-g.html
  • desk.bystrickaya.ru/polozhenie-o-provedenii-konkursa-sochinenij-ekologicheskoj-tematiki.html
  • klass.bystrickaya.ru/analiz-kreditorskoj-i-debitorskoj-zadolzhnosti-organizacii-na-primere-ooo.html
  • doklad.bystrickaya.ru/urok-istorii-rossii-10-11-klass-ili-vneklassnoe-meropriyatie.html
  • college.bystrickaya.ru/4-cel-i-zadachi-disciplini-rabochaya-programma-klinicheskoj-ordinaturi-po-terapii-oblast-primeneniya.html
  • learn.bystrickaya.ru/glava-i-iniciativnost-kniga-vtoraya.html
  • abstract.bystrickaya.ru/22-soznanie-i-samosoznanie-rol-yazika-i-obsheniya-v-formirovanii-soznaniya-lichnosti.html
  • thesis.bystrickaya.ru/primechanie-o-transliteracii-sanskritskih-slov-stranica-46.html
  • occupation.bystrickaya.ru/novosti-yanvar-fevral-3.html
  • spur.bystrickaya.ru/metodicheskie-rekomendacii-po-discipline-dokumentacionnoe-obespechenie-upravleniya-dlya-studentov-zaochnogo-otdeleniya-specialnostej.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.