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