[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Глава 30. Группа библиотек

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

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

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

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


Работа с группами библиотек

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

Выполняет поиск группы библиотек, а если она не найдена, создает ее
         Загрузчик проверяет права доступа для данной группы библиотек с целью выяснить, может ли этот процесс работать с ней. Если у процесса нет нужных прав доступа к группе библиотек (на чтение или запись), то процесс не будет связан ни с какой группой библиотек. Если же у процесса есть требуемые права доступа, система выполняет поиск указанной группы в списке существующих групп библиотек. Если нужная группа процессов не найдена, а у процесса есть требуемые права доступа, группа создается. Если же у процесса недостаточно прав доступа для создания группы процессов, системный вызов exec завершается неудачно и возвращается код ошибки.
Ограничивает область поиска данной группой библиотек
         Если процесс обращается к любой общей библиотеке, входящей в группу, то используется версия библиотеки из данной группы. Процесс всегда работает с версиями общих библиотек, входящими в группу, независимо от того, если ли в глобальной группе библиотек другие версии.
Добавляет общие библиотеки в группу
         Если процессу требуется библиотека, не входящая в данную группу, загрузчик загружает самую свежую версию этой библиотеки в образ процесса. Если у процесса есть соответствующие права доступа, эта версия библиотеки также добавляется в данную группу библиотек. Если у процесса нет прав на добавление записей, то системный вызов exec завершается неудачно и возвращается код ошибки.

Общие библиотеки можно загружать и явно, с помощью системного вызова load( ). При явной загрузке общей библиотеки данные для ее модулей, как правило, помещаются по адресу текущего прерывания процесса, если процесс 32-разрядный. Для 64-разрядных процессов данные модулей помещаются в закрытую область памяти процесса. Если процесс связан с группой библиотек, системный загрузчик помещает эти данные в область данных общей библиотеки. Виртуальный адрес явно загруженного данным процессом модуля тот же, что и для всех процессов, загрузивших его. Если у процесса есть соответствующие права доступа, библиотека также добавляется в данную группу библиотек. Если у процесса нет прав на добавление записей, то системный вызов load завершается неудачно и возвращается код ошибки.

Группу библиотек можно связать с любым обычным файлом. Важно отметить, что группа данных связывается с самим файлом, а НЕ с его (полным) именем. Режим доступа (права доступа) к файлу определяет допустимые действия над группой библиотек. Ниже перечислены права доступа к файлу, связанному с группой библиотек, и допустимые операции над группой библиотек:

Если процесс пытается создать группу библиотек или добавить в нее библиотеку, не обладая соответствующими правами доступа, то текущая операция (exec или load) завершается неудачно и возвращается код ошибки.

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


Создание и удаление групп библиотек

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

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

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


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]