Именованные области общей библиотеки

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

Для 32-разрядных процессов эта область состоит из одного сегмента для текста общей библиотеки (сегмент 0xD) и одного сегмента для предварительно перемещенных данных библиотеки (сегмент 0xF). Использование общего текста и предварительное перемещение данных увеличивает производительность в системах с большим числом процессов, работающих с общими библиотеками.

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

Для того, чтобы обойти данное ограничение глобальной области общей библиотеки, AIX 5.3 поддерживает именованные области общей библиотеки, которые имеют следующие преимущества:

  • Именованная область общей библиотеки замещает глобальную область общей библиотеки для группы процессов.
  • Именованная область общей библиотеки предоставляет группе процессов полный объем общей библиотеки в том же расположении в эффективном адресном пространстве, что и глобальная область общей библиотеки (сегменты 0xD и 0xF).
  • Функцию именованной области общей библиотеки можно включить с помощью переменной среды LDR_CNTRL. При этом не требуется вносить какие-либо изменения в существующий двоичный код.
  • В системе могут быть одновременно активны несколько именованных областей общей библиотеки.
  • Процессы указывают определенную именованную область общей библиотеки с помощью уникального имени. Это имя выбирается процессом, вызвавшим создание области.
  • Именованные области общей библиотеки доступны только для 32-разрядных процессов.

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

Альтернативная модель памяти (doubletext32)

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

Interface

Права доступа

Процесс запрашивает использование именованной области общей библиотеки с помощью переменной среды LDR_CNTRL с опцией NAMEDSHLIB в своей среде во время выполнения. Новая опция имеет следующий синтаксис:

NAMEDSHLIB=имя[,атрибут][,атрибут2]...[,атрибутN]

Допустимое имя может быть любой строкой, соответствующей регулярному выражению, [A-Za-z0-9_\.]+ (содержащая только алфавитно-цифровые символы, символы подчеркивания и точки).

Допустимая строка имени должна завершаться одним из следующих символов:

  • @ (собачка): Ограничитель для нескольких опций LDR_CNTRL
  • , (запятая): Ограничитель для атрибутов NAMEDSHLIB
  • \0 (нуль): Терминатор строки среды LDR_CNTRL

Если указана недопустимая строка имени, вся опция NAMEDSHLIB игнорируется. Если задан недопустимый атрибут, то игнорнируется только этот атрибут. В настоящее время поддерживается только один атрибут: doubletext32.

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

Создание

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

Очистка

Система удаляет неиспользуемые библиотеки из именованной области общих библиотек с помощью тех же механизмов, которые применяются для глобальной области общих библиотек:
  • Автоматическое удаление неиспользуемых библиотек выполняется при заполнении области.
  • Принудительное удаление неиспользуемых библиотек можно выполнить с помощью команды slibclean.

Уничтожение

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

Атрибуты

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

Примеры

  1. Запускается пара приложений, использующих именованную область общих библиотек с именем XYZ, в которой один сегмент выделен для текста общей библиотеки и один сегмент выделен для предварительно перемещенных данных библиотеки. Для этого используются следующие команды:
    $ export LDR_CNTRL=NAMEDSHLIB=XYZ
    $ xyz_app
    $ xyz_app2
  2. Запускается пара приложений, использующих именованную область общих библиотек с именем more_shtext, в которой оба сегмента выделены для текста общих библиотек. Для этого используются следующие команды:
    $ export LDR_CNTRL=NAMEDSHLIB=more_shtext,doubletext32
    $ mybigapp
    $ mybigapp2