Imagen de proceso

Ahora que hemos visto cómo obtener la información básica del proceso y su proceso principal, es el momento de examinar los detalles de la información del proceso / programa.

¿Qué es exactamente la imagen de proceso? La imagen de proceso es un archivo ejecutable necesario al ejecutar el programa. Esta imagen generalmente contiene las siguientes secciones:

  • Segmento de código o segmento de texto
  • Segmento de datos
  • Segmento de pila
  • Segmento de montón

A continuación se muestra la representación pictórica de la imagen del proceso.

Code segmentes una parte del archivo de objeto o del espacio de direcciones virtuales del programa que consta de instrucciones ejecutables. Suele ser un segmento de datos de solo lectura y tiene un tamaño fijo.

El segmento de datos es de dos tipos.

  • Initialized
  • Un-initialized

Initialized data segment es una parte del archivo de objeto o del espacio de direcciones virtuales del programa que consta de variables estáticas y globales inicializadas.

Un-initialized data segmentes una parte del archivo de objeto o del espacio de direcciones virtuales del programa que consta de variables estáticas y globales no inicializadas. El segmento de datos no inicializado también se denomina segmento BSS (bloque iniciado por símbolo).

Data segmentes de lectura-escritura, ya que los valores de las variables se pueden cambiar durante el tiempo de ejecución. Este segmento también tiene un tamaño fijo.

Stack segmentes un área de memoria asignada para variables automáticas y parámetros de función. También almacena una dirección de retorno mientras ejecuta llamadas a funciones. Stack utiliza el mecanismo LIFO (Last-In-First-Out) para almacenar variables locales o automáticas, parámetros de función y almacenar la siguiente dirección o dirección de retorno. La dirección de retorno se refiere a la dirección a la que se devolverá después de completar la ejecución de la función. Este tamaño de segmento es variable según variables locales, parámetros de función y llamadas a funciones. Este segmento crece de una dirección superior a una dirección inferior.

Heap segmentes un área de memoria asignada para el almacenamiento de memoria dinámica, como las llamadas a malloc () y calloc (). Este tamaño de segmento también es variable según la asignación de usuarios. Este segmento crece de una dirección más baja a una dirección más alta.

Veamos ahora cómo varía el tamaño de los segmentos (segmentos de datos y bss) con algunos programas de muestra. El tamaño del segmento se conoce ejecutando el comando "tamaño".

Programa inicial

Archivo: segmento_size1.c

#include<stdio.h>

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

En el siguiente programa, se agrega una variable estática no inicializada. Esto significa que el tamaño del segmento no inicializado (BSS) aumentaría en 4 bytes.Note- En el sistema operativo Linux, el tamaño de int es 4 bytes. El tamaño del tipo de datos enteros depende del compilador y del soporte del sistema operativo.

Archivo: segmento_size2.c

#include<stdio.h>

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

En el siguiente programa, se agrega una variable estática inicializada. Esto significa que el tamaño del segmento inicializado (DATOS) aumentaría en 4 bytes.

Archivo: segmento_size3.c

#include<stdio.h>

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

En el siguiente programa, se agrega una variable global inicializada. Esto significa que el tamaño del segmento inicializado (DATOS) aumentaría en 4 bytes.

Archivo: segmento_size4.c

#include<stdio.h>

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

En el siguiente programa, se agrega una variable global no inicializada. Esto significa que el tamaño del segmento no inicializado (BSS) aumentaría en 4 bytes.

Archivo: segmento_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;
}

Pasos de ejecución

Compilacion

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

Ejecución / Salida

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