Изображение процесса
Теперь, когда мы увидели, как получить основную информацию о процессе и его родительском процессе, пришло время изучить детали процесса / информации о программе.
Что именно представляет собой изображение процесса? Образ процесса - это исполняемый файл, необходимый при выполнении программы. Это изображение обычно содержит следующие разделы -
- Сегмент кода или текстовый сегмент
- Сегмент данных
- Сегмент стека
- Сегмент кучи
Ниже приведено графическое представление изображения процесса.

Сегмент кода - это часть виртуального адресного пространства объектного файла или программы, состоящая из исполняемых инструкций. Обычно это сегмент данных только для чтения и имеет фиксированный размер.
Сегмент данных бывает двух типов.
- Initialized
- Un-инициализирован
Инициализированный сегмент данных - это часть объектного файла или виртуального адресного пространства программы, которая состоит из инициализированных статических и глобальных переменных.
Неинициализированный сегмент данных - это часть объектного файла или виртуального адресного пространства программы, которая состоит из неинициализированных статических и глобальных переменных. Неинициализированный сегмент данных также называется сегментом BSS (Block Started by Symbol).
Сегмент данных предназначен для чтения и записи, поскольку значения переменных могут быть изменены во время выполнения. Этот сегмент также имеет фиксированный размер.
Сегмент стека - это область памяти, выделенная для автоматических переменных и параметров функций. Он также сохраняет адрес возврата при выполнении вызовов функций. Стек использует механизм LIFO (Last-In-First-Out) для хранения локальных или автоматических переменных, параметров функций и сохранения следующего адреса или адреса возврата. Обратный адрес относится к адресу, который необходимо вернуть после завершения выполнения функции. Этот размер сегмента является переменным в соответствии с локальными переменными, параметрами функций и вызовами функций. Этот сегмент растет от более высокого адреса к более низкому адресу.
Сегмент кучи - это область памяти, выделенная для хранения динамической памяти, например, для вызовов malloc () и calloc (). Этот размер сегмента также является переменным в соответствии с распределением пользователя. Этот сегмент растет от более низкого адреса к более высокому адресу.
Давайте теперь проверим, как изменяется размер сегментов (сегментов данных и bss) в нескольких примерах программ. Размер сегмента можно узнать, выполнив команду «размер».
Начальная программа
Файл :gment_size1.c
#include<stdio.h> int main() { printf("Hello World\n"); return 0; }
В следующей программе добавлена неинициализированная статическая переменная. Это означает, что размер неинициализированного сегмента (BSS) увеличится на 4 байта. Примечание. В операционной системе Linux размер int составляет 4 байта. Размер целочисленного типа данных зависит от поддержки компилятора и операционной системы.
Файл :gment_size2.c
#include<stdio.h> int main() { static int mystaticint1; printf("Hello World\n"); return 0; }
В следующей программе добавлена инициализированная статическая переменная. Это означает, что размер инициализированного сегмента (DATA) увеличится на 4 байта.
Файл :gment_size3.c
#include<stdio.h> int main() { static int mystaticint1; static int mystaticint2 = 100; printf("Hello World\n"); return 0; }
В следующей программе добавлена инициализированная глобальная переменная. Это означает, что размер инициализированного сегмента (DATA) увеличится на 4 байта.
Файл :gment_size4.c
#include<stdio.h> int myglobalint1 = 500; int main() { static int mystaticint1; static int mystaticint2 = 100; printf("Hello World\n"); return 0; }
В следующей программе добавлена неинициализированная глобальная переменная. Это означает, что размер неинициализированного сегмента (BSS) увеличится на 4 байта.
Файл :gment_size5.c
#include<stdio.h> int myglobalint1 = 500; int myglobalint2; int main() { static int mystaticint1; static int mystaticint2 = 100; printf("Hello World\n"); return 0; }
Шаги выполнения
компиляция
babukrishnam $ gcc segment_size1.c -o segment_size1 babukrishnam $ gcc segment_size2.c -o segment_size2 babukrishnam $ gcc segment_size3.c -o segment_size3 babukrishnam $ gcc segment_size4.c -o segment_size4 babukrishnam $ gcc segment_size5.c -o segment_size5
Исполнение / выход
babukrishnam size segment_size1 segment_size2 segment_size3 segment_size4 segment_size5 text data bss dec hex filename 878 252 8 1138 472 segment_size1 878 252 12 1142 476 segment_size2 878 256 12 1146 47a segment_size3 878 260 12 1150 47e segment_size4 878 260 16 1154 482 segment_size5 babukrishnam