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