Imagem de Processo

Agora que vimos como obter as informações básicas do processo e de seu processo pai, é hora de examinar os detalhes das informações do processo / programa.

O que exatamente é imagem de processo? A imagem do processo é um arquivo executável necessário durante a execução do programa. Esta imagem geralmente contém as seguintes seções -

  • Segmento de código ou segmento de texto
  • Segmento de dados
  • Segmento de pilha
  • Segmento Heap

A seguir está a representação pictórica da imagem do processo.

Code segmenté uma parte do arquivo de objeto ou espaço de endereço virtual do programa que consiste em instruções executáveis. Geralmente é um segmento de dados somente leitura e tem um tamanho fixo.

O segmento de dados é de dois tipos.

  • Initialized
  • Un-initialized

Initialized data segment é uma parte do arquivo de objeto ou espaço de endereço virtual do programa que consiste em variáveis ​​estáticas e globais inicializadas.

Un-initialized data segmenté uma parte do arquivo de objeto ou espaço de endereço virtual do programa que consiste em variáveis ​​estáticas e globais não inicializadas. O segmento de dados não inicializado também é chamado de segmento BSS (bloco iniciado por símbolo).

Data segmenté leitura-escrita, uma vez que os valores das variáveis ​​podem ser alterados durante o tempo de execução. Este segmento também possui tamanho fixo.

Stack segmenté uma área da memória alocada para variáveis ​​automáticas e parâmetros de função. Ele também armazena um endereço de retorno durante a execução de chamadas de função. A pilha usa o mecanismo LIFO (Last-In-First-Out) para armazenar variáveis ​​locais ou automáticas, parâmetros de função e armazenar o próximo endereço ou endereço de retorno. O endereço de retorno se refere ao endereço a ser retornado após a conclusão da execução da função. O tamanho do segmento é variável de acordo com as variáveis ​​locais, parâmetros de função e chamadas de função. Este segmento cresce de um endereço superior para um endereço inferior.

Heap segmenté a área de memória alocada para armazenamento de memória dinâmica, como para chamadas malloc () e calloc (). O tamanho do segmento também é variável de acordo com a alocação do usuário. Este segmento cresce de um endereço inferior para um endereço superior.

Vamos agora verificar como o tamanho dos segmentos (segmentos de dados e bss) variam com alguns programas de amostra. O tamanho do segmento é conhecido executando o comando “tamanho”.

Programa inicial

Arquivo: segment_size1.c

#include<stdio.h>

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

No programa a seguir, uma variável estática não inicializada é adicionada. Isso significa que o tamanho do segmento não inicializado (BSS) aumentaria em 4 bytes.Note- No sistema operacional Linux, o tamanho do int é de 4 bytes. O tamanho do tipo de dados inteiro depende do compilador e do suporte do sistema operacional.

Arquivo: segment_size2.c

#include<stdio.h>

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

No programa a seguir, uma variável estática inicializada é adicionada. Isso significa que o tamanho do segmento inicializado (DATA) aumentaria em 4 bytes.

Arquivo: segment_size3.c

#include<stdio.h>

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

No programa a seguir, uma variável global inicializada é adicionada. Isso significa que o tamanho do segmento inicializado (DATA) aumentaria em 4 bytes.

Arquivo: segment_size4.c

#include<stdio.h>

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

No programa a seguir, uma variável global não inicializada é adicionada. Isso significa que o tamanho do segmento não inicializado (BSS) aumentaria em 4 bytes.

Arquivo: 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;
}

Etapas de execução

Compilação

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

Execução / Saída

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