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

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

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

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

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

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

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

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

  • 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