Настройка разделяемой библиотеки
В этом разделе мы приведем ряд советов по настройке разделяемой библиотеки с целью достижения наибольшей эффективности ее использования. Они основаны на опыте разработки разделяемой библиотеки языка C и касаются систем со страничной организацией виртуальной памяти, например ОС UNIX V версия 3.1.
Архивная библиотека языка C содержит несколько разнородных групп функций. Процессы могут использовать различные функции из этих групп, поэтому трудно определить заранее характер страничного обмена, возникающего при работе любой разделяемой библиотеки C. Вероятно, использование разделяемой библиотеки дает более занчительное преимущество при более однородном ее составе. Например, применение разделяемой библиотеки для управления базами данных могло бы существенно уменьшить страничный обмен, если бы можно было предварительно определить статические и динамические зависимости между ее функциями.
Постройте временной профиль программы [см. profil(2)]
Выясните предварительно временной профиль функций, которые можно было бы включить в разделяемую библиотеку.
Определите содержимое библиотеки
Основываясь на информации, полученной на предыдущем шаге, определите, что именно следует включить в разделяемую библиотеку. Размер выполняемого файла - статическая характеристика, а интенсивность страничного обмена - динамическая. Вытекающие отсюда требования могут противоречить друг другу, поэтому Вам, возможно, придется решать, оправдана ли экономия дисковой памяти на фоне ухудшения показателей времени выполнения. См. выше раздел Какие функции целесообразно включать в библиотеку?.
Группируйте взаимосвязанные функции
Будучи помещенной в выполняемый файл, функция может оказаться на одной странице с более часто используемыми функциями (см. выше рекомендацию "не включать редко используемые подпрограммы"). Старайтесь свести вместе одновременно используемые функции. Если каждый вызов funcA порождает обращения к funcB и funcC, постарайтесь разместить все три функции на одной странице. Информацию о такого рода статических зависимостях выдает cflow(1) (см. Справочник пользователя). Используйте ее, наряду с информацией о структуре библиотечных функций, для определения, какие функции действительно вызываются, в отличие от тех, которые только могли бы вызываться.
Выравнивайте на границы страниц
Важно так организовать об, ектные файлы для разделяемой библиотеки, чтобы каждая часто вызываемая функция, по возможности, размещалась бы внутри одной страницы. Организуя об,ектные файлы для разделяемой библиотеки выполнения, не забудьте отделять данные от команд. Порядок следования об,ектных файлов с командами можно изменить без ущерба для совместимости, что неверно для об,ектных файлов, в которых определяются глобальные данные. Опять-таки, лучше всего пояснить это на примере:
Когда мы создавали разделяемую библиотеку языка C... |
У нас был компьтер со страницами размером 2K. Изучив таблицы перекрестных ссылок и результаты дизассемблирования разделяемой библиотеки выполнения, мы определили, где будут находиться границы страниц. |
Следующий пример показывает, как изменился порядок следования объектных файлов в библиотеке (слева приведен первоначальный порядок, справа - модифицированный):
#objects #objects . . . . . . printf.o strcmp.o fopen.o malloc.o malloc.o printf.o strcmp.o fopen.o . . . . . .
Учитывайте особенности оборудования
Изучение особенностей используемой аппаратуры может обеспечить дальнейшее повышение эффективности. Например, следует принять во внимание способ управления виртуальной памятью. Частью соответствующего оборудования является кэш для преобразования виртуального адреса в физический. Следует добиваться того, чтобы выполнение типичного процесса не вызывало конфликтов по использованию кэша.