Учебники

Изображение процесса

Теперь, когда мы увидели, как получить основную информацию о процессе и его родительском процессе, пришло время изучить детали процесса / информации о программе.

Что именно представляет собой изображение процесса? Образ процесса — это исполняемый файл, необходимый при выполнении программы. Это изображение обычно содержит следующие разделы —

  • Сегмент кода или текстовый сегмент
  • Сегмент данных
  • Сегмент стека
  • Сегмент кучи

Ниже приведено графическое представление изображения процесса.

Обрабатывать изображения

Сегмент кода — это часть виртуального адресного пространства объектного файла или программы, состоящая из исполняемых инструкций. Обычно это сегмент данных только для чтения и имеет фиксированный размер.

Сегмент данных бывает двух типов.

  • 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 байта.