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