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

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


Глава 8. Поддержка программ большого объема

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

Примечание: В данной главе обсуждаются только 32-разрядные процессы. Информация о модели 32-разрядного адресного пространства, используемой по умолчанию, и о модели 64-разрядного адресного пространства приведена в разделах Адресное пространство программы - Обзор и Выделение памяти в системе с помощью подсистемы malloc.

Аппаратное обеспечение системы подразделяет все виртуальное пространство 32-разрядных адресов на 16 независимых сегментов, для каждого из которых существует отдельный сегментный регистр. Сегмент 2 (виртуальный адрес 0x20000000) рассматривается операционной системой как на частный сегмент процесса. Этот сегмент содержит большую часть информации о процессе, включая пользовательские данные, пользовательский стек, стек ядра и пользовательский блок.

Так как система размещает пользовательские данные и пользовательский стек внутри одного сегмента, то максимальный объем стека и данных получается немного меньшим 256 Мб. Такой объем достаточен для большинства приложений. Стек ядра и пользовательский блок имеют относительно небольшой, фиксированный размер. Однако для работы некоторых приложений в разделе данных программы требуется разместить большие инициализированные и неинициализированные области данных. Кроме того, большие области данных могут запрашиваться динамически с помощью функции malloc, brk или sbrk.

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


Описание модели большого адресного пространства

Модель большого адресного пространства применяется в приложениях, работающих с большими объемами данных. Небольшие программы по прежнему работают с обычной моделью памяти. Для того чтобы программа могла использовать модель большого адресного пространства, необходимо указать в поле o_maxdata заголовка XCOFF программы необходимый объем данных.

В модели большого адресного пространства данные программы размещаются, начиная с третьего сегмента при условии, что в поле заголовка указано ненулевое значение. (Данные размещаются, начиная с сегмента 3, даже если указанное значение меньше размера сегмента.) Программа использует столько сегментов, сколько необходимо для размещения данных, объем которых задан в поле o_maxdata, но не более 8 сегментов. Следовательно, в программе может быть до двух гигабайт данных.

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

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

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


Описание модели сверхбольшого адресного пространства

Модель сверхбольшого адресного пространства во многом схожа с моделью большого адресного пространства. Однако существует несколько различий. Для того чтобы программа могла использовать модель сверхбольшого адресного пространства, необходимо указать в поле o_maxdata заголовка XCOFF программы необходимый объем данных, а также установить флаг F_DSA в заголовке файла.

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

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

В модели сверхбольшого адресного пространства применяется измененный алгоритм выполнения системных запросов, таких как shmat() и mmap(). Эти системные вызовы начинают размещение файлов с 14 сегмента и занимают сегменты в порядке уменьшения номеров (в других моделях размещение файлов начинается с 3 сегмента и идет в порядке возрастания номеров сегментов). Системные вызовы могут использовать все сегменты, за исключением тех, что выделены под кучу данных.

В модели сверхбольшого адресного пространства для MAXDATA допустимы значения вплоть до 0x80000000, при этом программы могут пользоваться любыми доступными сегментами, начиная с третьего (кроме сегментов, выделенных под кучу). В модели большого адресного пространства все сегменты с номерами больше 3 выделяются под кучу данных в момент запуска программы.


Применение моделей большого адресного пространства

Модель большого адресного пространства применяется в том случае, когда в ключевом слове maxdata указано ненулевое значение. Модель сверхбольшого адресного пространства применяется в случае, если ключевому слову maxdata присвоено ненулевое значение, и задано ключевое слово dsa. Опцию -bmaxdata следует указывать только в том случае, когда для программы требуются очень большие области данных.

Для активизации модели большого адресного пространства выполните команду ld с флагом -bmaxdata.

Например, компоновка программы, для которой должно быть зарезервировано 8 сегментов, выполняется с помощью следующей команды:

cc sample.o -bmaxdata:0x80000000

Компоновка программы, для которой должно быть зарезервировано 8 сегментов, в модели сверхбольшого адресного пространства, выполняется с помощью следующей команды:

cc sample.o -bmaxdata:0x80000000/dsa

0x80000000 - это число байтов (в шестнадцатеричном формате), равное 8 х 256 Мб. Хотя можно указывать и большее число, оно будет игнорироваться, поскольку может быть зарезервировано только 8 сегментов. Значение, указываемое с флагом -bmaxdata, можно также задавать в десятичном и восьмеричном виде.

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

/usr/bin/echo '\0200\0\0\0'|dd of=имя_исполняемого_файла bs=4 
count=1 seek=19 conv=notrunc

Примечание: Нужно ввести полное имя команды echo (т.е. /usr/bin/echo), чтобы избежать ошибочного вызова подкоманд echo оболочки. Кроме того, эти команды оболочки нельзя применять для модели сверхбольшого адресного пространства. Для этого нужно перекомпоновать программу.

Строка echo генерирует двоичное значение 0x80000000. Команда dd находит нужную позицию в исполняемом файле и изменяет поле o_maxdata. Не вызывайте команду dd для неисполняемых файлов, загрузочных модулей и общих библиотек.


Выполнение программ с большими областями данных

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

Иногда значения, указанного в поле o_maxdata, недостаточно для размещения инициализированных и неинициализированных данных программы. В этом случае процесс завершается, и выдается сообщение об ошибке.

Программу не удастся запустить и в том случае, когда гибкое ограничение для процесса превышает жесткое ограничение. Например, процесс входа в систему обычно присваивает жесткому ограничению бесконечно большое значение. Однако если вызывающий процесс изменил это жесткое ограничение с помощью команды ulimit оболочки Bourne или команды limit оболочки C, заново установленное гибкое ограничение может превысить жесткое ограничение для процесса. В этом случае процесс будет убит. При этом будет отправлено единственное сообщение о том, что процесс убит (killed).

Дополнительная информация о команде ulimit оболочки Bourne приведена в разделе Особые команды оболочки Bourne книги Руководство пользователя AIX 5L версии 5.1: Операционная система и устройства. Дополнительная информация о команде limit в оболочке C приведена в разделах Подстановка команд в оболочке C и Подстановка имен файлов в оболочке C книги Руководство пользователя AIX 5L версии 5.1: Операционная система и устройства.

После размещения инициализированных и неинициализированных данных программы в сегментах, начиная с третьего, система вычисляет положение разделителя. Разделитель отделяет статические данные процесса от данных, память для которых выделяется динамически. Процесс может переместить разделитель в конец сегмента, указанного в поле maxdata файла a.out, с помощью функций malloc, brk и sbrk.

Например, если в поле maxdata заголовочного файла a.out задано значение 0x80000000, то разделитель может быть передвинут в конец сегмента 10, то есть в позицию с адресом 0xafffffff. Функция brk может перенести разделитель за границу сегмента, но не дальше точки, заданной в поле maxdata.

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

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

Особые рекомендации

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

Отладка программ с большим объемом данных выполняется так же, как и отладка других программ. Команда dbx может выполнять отладку большой программы, когда она активна, либо на основании дампа памяти. Не следует создавать полный дамп памяти, так как крупные программы генерируют дампы большого объема, занимающие много места в файловой системе.

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

Связанная информация

Команды cc, dd и ld

Формат объектного файла XCOFF (a.out)

Функции brk, sbrk, exec, fork, malloc, setrlimit.

Особые команды оболочки Bourne в книге Руководство пользователя AIX 5L версии 5.1: Операционная система и устройства

Адресное пространство программы - Обзор


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