Linux программирование в примерах | страница 51



в памяти только для чтения. Сводка взаимоотношений различных сегментов приведена в табл. 3.1.


Таблица 3.1. Сегменты исполняемой программы и их размещение

Память программыСегмент адресного пространстваСекция исполняемого файла
КодTextText
Инициализированные данныеDataData
BSSDataBSS
КучаData
СтекStack

Программа >size распечатывает размеры в байтах каждой из секций text, data и BSS вместе с общим размером в десятичном и шестнадцатеричном виде. (Программа >ch03-memaddr.с показана далее в этой главе; см. раздел 3.2.5 «Исследование адресного пространства».)

>$ cc -o ch03-memaddr.с -о ch03-memaddr /* Компилировать программу */

>$ ls -l ch03-memaddr /* Показать общий размер */

>-rwxr-xr-x 1 arnold devel 12320 Nov 24 16:45 ch03-memaddr

>$ size ch03-memaddr /* Показать размеры компонентов */

>text data bss dec  hex filename

>1458 276  8   1742 6ce ch03-memaddr


>$ strip ch03-memaddr /* Удалить символы */

>$ ls -l ch03-memaddr /* Снова показать общий размер */

>-rwxr-xr-x 1 arnold devel 3480 Nov 24 16:45 ch03-memaddr

>$ size ch03-memaddr /* Размеры компонентов не изменились */

>text data bss dec  hex filename

>1458 276  8   1742 6ce ch03-memaddr

Общий размер загруженного в память из файла в 12 320 байтов всего лишь 1742 байта. Большую часть этого места занимают символы (symbols), список имен переменных и функций программы. (Символы не загружаются в память при запуске программы.) Программа >strip удаляет символы из объектного файла. Для большой программы это может сохранить значительное дисковое пространство ценой невозможности отладки дампа ядра[40], если таковой появится (На современных системах об этом не стоит беспокоиться, не используйте >strip.) Даже после удаления символов файл все еще больше, чем загруженный в память образ, поскольку формат объектного файла содержат дополнительные данные о программе, такие, как использованные разделяемые библиотеки, если они есть.[41]

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

3.2. Выделение памяти

Четыре библиотечные функции образуют основу управления динамической памятью С Мы опишем сначала их, затем последуют описания двух системных вызовов, поверх которых построены эти библиотечные функции. Библиотечные функции С, в свою очередь, обычно используются для реализации других выделяющих память библиотечных функций и операторов C++