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