Immagine di processo
Ora che abbiamo visto come ottenere le informazioni di base del processo e del suo processo genitore, è tempo di esaminare i dettagli delle informazioni sul processo / programma.
Cos'è esattamente l'immagine di processo? L'immagine di processo è un file eseguibile richiesto durante l'esecuzione del programma. Questa immagine di solito contiene le seguenti sezioni:
- Segmento di codice o segmento di testo
- Segmento di dati
- Segmento dello stack
- Segmento di heap
Di seguito è la rappresentazione pittorica dell'immagine di processo.
Code segmentè una porzione del file oggetto o dello spazio degli indirizzi virtuali del programma che consiste in istruzioni eseguibili. Questo è in genere un segmento di dati di sola lettura e ha una dimensione fissa.
Il segmento di dati è di due tipi.
- Initialized
- Un-initialized
Initialized data segment è una parte del file oggetto o dello spazio degli indirizzi virtuali del programma che consiste di variabili statiche e globali inizializzate.
Un-initialized data segmentè una parte del file oggetto o dello spazio degli indirizzi virtuali del programma che consiste in variabili statiche e globali non inizializzate. Il segmento di dati non inizializzato è anche chiamato segmento BSS (Block Started by Symbol).
Data segmentè di lettura-scrittura, poiché i valori delle variabili potrebbero essere modificati durante il runtime. Anche questo segmento ha una dimensione fissa.
Stack segmentè un'area di memoria assegnata alle variabili automatiche e ai parametri delle funzioni. Memorizza anche un indirizzo di ritorno durante l'esecuzione delle chiamate di funzione. Stack utilizza il meccanismo LIFO (Last-In-First-Out) per memorizzare variabili locali o automatiche, parametri di funzione e memorizzare l'indirizzo successivo o l'indirizzo di ritorno. L'indirizzo di ritorno si riferisce all'indirizzo da restituire dopo il completamento dell'esecuzione della funzione. Questa dimensione del segmento è variabile in base alle variabili locali, ai parametri di funzione e alle chiamate di funzione. Questo segmento cresce da un indirizzo più alto a un indirizzo più basso.
Heap segmentè l'area di memoria assegnata per l'archiviazione dinamica della memoria come per le chiamate malloc () e calloc (). Anche la dimensione del segmento è variabile in base all'allocazione dell'utente. Questo segmento cresce da un indirizzo più basso a un indirizzo più alto.
Vediamo ora come variano le dimensioni dei segmenti (dati e segmenti bss) con alcuni programmi di esempio. La dimensione del segmento è nota eseguendo il comando "size".
Programma iniziale
File: segment_size1.c
#include<stdio.h>
int main() {
printf("Hello World\n");
return 0;
}
Nel seguente programma, viene aggiunta una variabile statica non inizializzata. Ciò significa che la dimensione del segmento non inizializzato (BSS) aumenterebbe di 4 byte.Note- Nel sistema operativo Linux, la dimensione di int è di 4 byte. La dimensione del tipo di dati intero dipende dal compilatore e dal supporto del sistema operativo.
File: segment_size2.c
#include<stdio.h>
int main() {
static int mystaticint1;
printf("Hello World\n");
return 0;
}
Nel seguente programma, viene aggiunta una variabile statica inizializzata. Ciò significa che la dimensione del segmento inizializzato (DATA) aumenterebbe di 4 byte.
File: segment_size3.c
#include<stdio.h>
int main() {
static int mystaticint1;
static int mystaticint2 = 100;
printf("Hello World\n");
return 0;
}
Nel seguente programma viene aggiunta una variabile globale inizializzata. Ciò significa che la dimensione del segmento inizializzato (DATA) aumenterebbe di 4 byte.
File: segment_size4.c
#include<stdio.h>
int myglobalint1 = 500;
int main() {
static int mystaticint1;
static int mystaticint2 = 100;
printf("Hello World\n");
return 0;
}
Nel seguente programma viene aggiunta una variabile globale non inizializzata. Ciò significa che la dimensione del segmento non inizializzato (BSS) aumenterebbe di 4 byte.
File: 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;
}
Fasi di esecuzione
Compilazione
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
Esecuzione / output
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