Bild verarbeiten
Nachdem wir gesehen haben, wie die grundlegenden Informationen des Prozesses und seines übergeordneten Prozesses abgerufen werden können, ist es an der Zeit, die Details der Prozess- / Programminformationen zu untersuchen.
Was genau ist ein Prozessabbild? Das Prozessabbild ist eine ausführbare Datei, die während der Ausführung des Programms erforderlich ist. Dieses Bild enthält normalerweise die folgenden Abschnitte -
- Codesegment oder Textsegment
- Datensegment
- Stapelsegment
- Heap-Segment
Es folgt die bildliche Darstellung des Prozessbildes.
Code segmentist ein Teil des virtuellen Adressraums der Objektdatei oder des Programms, der aus ausführbaren Anweisungen besteht. Dies ist normalerweise ein schreibgeschütztes Datensegment und hat eine feste Größe.
Es gibt zwei Arten von Datensegmenten.
- Initialized
- Un-initialized
Initialized data segment ist ein Teil des virtuellen Adressraums der Objektdatei oder des Programms, der aus initialisierten statischen und globalen Variablen besteht.
Un-initialized data segmentist ein Teil des virtuellen Adressraums der Objektdatei oder des Programms, der aus nicht initialisierten statischen und globalen Variablen besteht. Das nicht initialisierte Datensegment wird auch als BSS-Segment (Block Started by Symbol) bezeichnet.
Data segmentist Lese- / Schreibzugriff, da die Werte von Variablen zur Laufzeit geändert werden können. Dieses Segment hat auch eine feste Größe.
Stack segmentist ein Speicherbereich für automatische Variablen und Funktionsparameter. Es speichert auch eine Rücksprungadresse, während Funktionsaufrufe ausgeführt werden. Stack verwendet den LIFO-Mechanismus (Last-In-First-Out) zum Speichern lokaler oder automatischer Variablen, Funktionsparameter und zum Speichern der nächsten Adresse oder Rücksprungadresse. Die Rücksprungadresse bezieht sich auf die Adresse, die nach Abschluss der Funktionsausführung zurückgegeben werden soll. Diese Segmentgröße ist gemäß den lokalen Variablen, Funktionsparametern und Funktionsaufrufen variabel. Dieses Segment wächst von einer höheren Adresse zu einer niedrigeren Adresse.
Heap segmentist ein Speicherbereich, der für den dynamischen Speicher reserviert ist, z. B. für Aufrufe von malloc () und calloc (). Diese Segmentgröße ist auch gemäß Benutzerzuordnung variabel. Dieses Segment wächst von einer niedrigeren Adresse zu einer höheren Adresse.
Lassen Sie uns nun überprüfen, wie sich die Größe der Segmente (Daten- und BSS-Segmente) mit einigen Beispielprogrammen ändert. Die Segmentgröße wird durch Ausführen des Befehls "Größe" bekannt.
Erstes Programm
Datei: segment_size1.c
#include<stdio.h>
int main() {
printf("Hello World\n");
return 0;
}
Im folgenden Programm wird eine nicht initialisierte statische Variable hinzugefügt. Dies bedeutet, dass die Größe des nicht initialisierten Segments (BSS) um 4 Byte zunehmen würde.Note- Unter Linux beträgt die Größe von int 4 Byte. Die Größe des Integer-Datentyps hängt von der Unterstützung des Compilers und des Betriebssystems ab.
Datei: segment_size2.c
#include<stdio.h>
int main() {
static int mystaticint1;
printf("Hello World\n");
return 0;
}
Im folgenden Programm wird eine initialisierte statische Variable hinzugefügt. Dies bedeutet, dass die Größe des initialisierten Segments (DATA) um 4 Byte erhöht wird.
Datei: segment_size3.c
#include<stdio.h>
int main() {
static int mystaticint1;
static int mystaticint2 = 100;
printf("Hello World\n");
return 0;
}
Im folgenden Programm wird eine initialisierte globale Variable hinzugefügt. Dies bedeutet, dass die Größe des initialisierten Segments (DATA) um 4 Byte erhöht wird.
Datei: segment_size4.c
#include<stdio.h>
int myglobalint1 = 500;
int main() {
static int mystaticint1;
static int mystaticint2 = 100;
printf("Hello World\n");
return 0;
}
Im folgenden Programm wird eine nicht initialisierte globale Variable hinzugefügt. Dies bedeutet, dass die Größe des nicht initialisierten Segments (BSS) um 4 Byte zunehmen würde.
Datei: 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;
}
Ausführungsschritte
Zusammenstellung
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
Ausführung / Ausgabe
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