Please enable JavaScript.
Coggle requires JavaScript to display documents.
Capítulo 15 Uso da memória - Coggle Diagram
Capítulo 15
Uso da memória
15.1 Espaço de endereçamento virtual de um processo
A parte inicial dos endereços virtuais é reservada para uso do processo, enquanto a parte final é reservada para o núcleo do sistema operacional.
As páginas do processo são marcadas com o flag user, enquanto as páginas do núcleo não o são. Com isso, o código no espaço do usuário não pode acessar as páginas do núcleo, mas o núcleo pode acessar as páginas do processo.
O núcleo faz parte do espaço de endereçamento de cada processo, mas não é acessível ao mesmo, por conta dos flags de controle
15.2 A memória de um processo
Cada processo é implementado pelo sistema operacional como uma área de memória exclusiva que só o próprio processo e o núcleo do sistema podem acessar
A área de memória do processo contém as informações necessárias à sua execução e é dividida em seções ou segmentos, que são intervalos de endereços que o processo pode acessar. A lista de seções de memória de cada processo é mantida pelo núcleo, no descritor do mesmo.
As principais seções de memória de um processo são:
TEXT
: contém o código binário a ser executado pelo processo
DATA
: contém as variáveis estáticas inicializadas
BSS
: contém as variáveis estáticas não-inicializadas
HEAP
: usada para armazenar variáveis alocadas dinamicamente
STACK
: esta seção é usada para manter a pilha de execução do processo
15.3 Alocação de variáveis
15.3.1 Alocação estática
O espaço necessário para a variável é definido durante a compilação do programa
O espaço correspondente em memória RAM é reservado no início da execução do processo e mantido até o encerramento
São alocadas na seção de memória
DATA
, se forem inicializadas no código-fonte, ou na seção
BSS
, caso contrário.
15.3.2 Alocação automática
Por
default
, as variáveis definidas dentro de uma função são alocadas de forma automática na pilha de execução do programa
O espaço usado para armazenar essas variáveis é alocado quando a função é chamada e liberado quando a função termina
15.3.3 Alocação dinâmica
O processo requisita explicitamente blocos de memória para armazenar dados, os utiliza e depois os libera
Esses blocos de memória são alocados na seção
HEAP
, que pode aumentar de tamanho para acomodar mais alocações quando necessário.
15.4 Atribuição de endereços
Os nomes das variáveis e blocos de código devem ser traduzidos em endereços de memória em algum momento entre a escrita do código pelo programador e sua execução pelo processador. A atribuição de endereços aos nomes simbólicos pode ocorrer em diversos momentos da vida do programa:
Na edição
: o programador escolhe o endereço de cada uma das variáveis e do código do programa na memória.
Na compilação
: ao traduzir o código-fonte, o compilador escolhe as posições das variáveis na memória.
Na ligação:
na fase de compilação, o compilador traduz o código fonte em código binário, mas não define os endereços das variáveis e funções, gerando como saída um
object file
. A seguir, o
linker
pega os arquivos objetos com suas tabelas de símbolos, define os endereços de memória dos símbolos e gera o programa executável
Na carga:
um carregador (
loader
) é responsável por carregar o código do processo na memória e definir os endereços de memória que devem ser utilizados.
Na execução
: os endereços emitidos pelo processador durante a execução do processo são analisados e convertidos nos endereços efetivos a serem acessados na memória real.