Linux программирование в примерах | страница 51
Таблица 3.1. Сегменты исполняемой программы и их размещение
Память программы | Сегмент адресного пространства | Секция исполняемого файла |
---|---|---|
Код | Text | Text |
Инициализированные данные | Data | Data |
BSS | Data | BSS |
Куча | 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++