Image de processus

Maintenant que nous avons vu comment obtenir les informations de base du processus et de son processus parent, il est temps d'examiner les détails des informations de processus / programme.

Qu'est-ce que l'image de process exactement? L'image de processus est un fichier exécutable requis lors de l'exécution du programme. Cette image contient généralement les sections suivantes -

  • Segment de code ou segment de texte
  • Segment de données
  • Segment de pile
  • Segment de tas

Voici la représentation picturale de l'image de processus.

Code segmentest une partie du fichier objet ou de l'espace d'adressage virtuel du programme qui se compose d'instructions exécutables. Il s'agit généralement d'un segment de données en lecture seule et de taille fixe.

Le segment de données est de deux types.

  • Initialized
  • Un-initialized

Initialized data segment est une partie du fichier objet ou de l'espace d'adressage virtuel du programme qui se compose de variables statiques et globales initialisées.

Un-initialized data segmentest une partie du fichier objet ou de l'espace d'adressage virtuel du programme qui se compose de variables statiques et globales non initialisées. Le segment de données non initialisé est également appelé segment BSS (Block Started by Symbol).

Data segmentest en lecture-écriture, car les valeurs des variables peuvent être modifiées pendant l'exécution. Ce segment a également une taille fixe.

Stack segmentest une zone de mémoire allouée aux variables automatiques et aux paramètres de fonction. Il stocke également une adresse de retour lors de l'exécution des appels de fonction. Stack utilise le mécanisme LIFO (Last-In-First-Out) pour stocker les variables locales ou automatiques, les paramètres de fonction et stocker l'adresse suivante ou l'adresse de retour. L'adresse de retour fait référence à l'adresse à renvoyer une fois l'exécution de la fonction terminée. Cette taille de segment est variable selon les variables locales, les paramètres de fonction et les appels de fonction. Ce segment passe d'une adresse supérieure à une adresse inférieure.

Heap segmentest la zone de mémoire allouée pour le stockage de mémoire dynamique, comme pour les appels malloc () et calloc (). Cette taille de segment est également variable selon l'allocation des utilisateurs. Ce segment passe d'une adresse inférieure à une adresse supérieure.

Voyons maintenant comment la taille des segments (données et segments bss) varie avec quelques exemples de programmes. La taille du segment est connue en exécutant la commande «taille».

Programme initial

Fichier: segment_size1.c

#include<stdio.h>

int main() {
   printf("Hello World\n");
   return 0;
}

Dans le programme suivant, une variable statique non initialisée est ajoutée. Cela signifie que la taille du segment non initialisé (BSS) augmenterait de 4 octets.Note- Dans le système d'exploitation Linux, la taille de int est de 4 octets. La taille du type de données entier dépend du compilateur et de la prise en charge du système d'exploitation.

Fichier: segment_size2.c

#include<stdio.h>

int main() {
   static int mystaticint1;
   printf("Hello World\n");
   return 0;
}

Dans le programme suivant, une variable statique initialisée est ajoutée. Cela signifie que la taille du segment initialisé (DATA) augmenterait de 4 octets.

Fichier: segment_size3.c

#include<stdio.h>

int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

Dans le programme suivant, une variable globale initialisée est ajoutée. Cela signifie que la taille du segment initialisé (DATA) augmenterait de 4 octets.

Fichier: segment_size4.c

#include<stdio.h>

int myglobalint1 = 500;
int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

Dans le programme suivant, une variable globale non initialisée est ajoutée. Cela signifie que la taille du segment non initialisé (BSS) augmenterait de 4 octets.

Fichier: segment_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;
}

Étapes d'exécution

Compilation

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

Exécution / Sortie

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