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