Какие функции целесообразно включать в библиотеку?
Включайте большие, часто используемые функции
Они являются основными кандидатами для разделенного использования, которое уменьшит размер выполняемых файлов и сэкономит оперативную память за счет работы нескольких процессов с одним экземпляром подпрограммы. Хорошим примером являются функции семейства printf(3S) из библиотеки языка C (см. Справочник программиста).
Когда мы создавали разделяемую библиотеку языка C... |
Функции из семейства printf(3S) используются часто, поэтому мы включили их в разделяемую библиотеку. |
Не включайте редко используемые функции
Их включение в библиотеку может уменьшить эффективность работы компьютера, особенно в системах со страничной организацией виртуальной памяти. Выполняемые файлы, созданные без применения разделяемой библиотеки, содержат в себе все необходимые им подпрограммы, а память процесса в какой-то степени соответствует содержимому выполняемого файла. Поэтому, если процесс обращается к функции, велика вероятность того, что она уже находится в оперативной памяти. Если же функция находится в разделяемой библиотеке, она, вероятно, к этому моменту будет вытеснена из оперативной памяти. Вряд ли одному выполняемому файлу понадобится все содержимое разделяемой библиотеки. Если же несколько процессов будут случайным образом вызывать функции библиотеки, интенсивность страничного обмена с диском, скорее всего, возрастет. См. также пункт "увеличивайте локальность обращений".
Когда мы создавали разделяемую библиотеку языка C... |
Мы удалили из первоначального варианта разделяемой библиотеки несколько небольших, редко используемых функций. Дело в том, что разделенное использование функций, нужных немногим выполняемым файлам, не приведет к значительной экономии на размерах файлов, и в то же время может понизить эффективность выполнения за счет более интенсивного страничного обмена. |
Не включайте функции, которым нужно много статических данных
Такие функции увеличивают объем памяти процессов. В разделах Как ОС UNIX работает с разделяемыми библиотеками? и Использовать ли разделяемую библиотеку? отмечалось, что каждый процесс получает свою копию секции данных разделяемой библиотеки, независимо от того, какая ее часть действительно необходима. Данные не используются процессами совместно и не могут предоставляться выборочно.
Например, getgrent(3C) (см. Справочник программиста) редко применяется в стандартных утилитах ОС UNIX. Некоторые ее версии требуют более 1400 байт данных. Такие функции лучше не включать в разделяемую библиотеку. Можно импортировать глобальные, но не локальные (статические) данные.
Не включайте функции, затрудняющие сопровождение библиотеки
Адреса всех имен, доступных для внешнего использования, должны быть постоянными. Таблица переходов обеспечивает это для функций, однако подобный механизм для данных отсутствует. Чем больше переменных определяется в библиотеке, тем больше вероятность того, что длину некоторых из них придется когда-нибудь изменить, а любое изменение размеров каких-либо экспортируемых переменных может привести к изменению адресов других. В результате библиотека станет несовместимой со своими предыдущими версиями.
Включайте функции, используемые другими функциями библиотеки
Лучше, чтобы библиотека была замкнутой. Например, printf(3S) обращается ко многим подпрограммам стандартной библиотеки ввода/вывода. Разделяемая библиотека, содержащая printf(3S), должна содержать и эти подпрограммы.
Примечание
Из перечисленных в этом разделе, эта рекомендация - наименьшая по значимости. Основываясь на других рекомендациях, Вы, возможно, исключите некоторые нужные библиотеке функции, сделав их внешними (импортируемыми).