Você está na página 1de 4

Gerência de Memória: Conceitos e Aplicação no Sistema

Linux
Diego Garcia1, Eduardo Menna da Silva2
1
Acadêmico do Curso de Ciência da Computação – Unidade Acadêmica de Ciências,
Engenharias e Tecnologias – Universidade do Extremo Sul Catarinense (UNESC) –
Criciúma, SC - Brasil
2
Professor do Curso de Ciência da Computação – Unidade Acadêmica de Ciências,
Engenharias e Tecnologias – Universidade do Extremo Sul Catarinense (UNESC) –
Criciúma, SC – Brasil
diegogarcia1988@gmail.com, edumenna@gmail.com

Resumo. Este artigo descreve alguns conceitos de gerência de memória dos


sistemas operacionais, focando a aplicação no sistema Linux. Será discutido o
gerenciamento de memória física e memória virtual, descrevendo o conceito
de swapping e paginação e como os mesmos são aplicados no Linux.

Palavras-chave: Gerência de Memória; Linux; Memória Física; Memória Virtual.


1. Introdução
Todos os computadores possuem algum tipo de memória utilizada para a execução dos
programas. Conforme Silberschatz (2000) descreve, a memória principal é um grande
vetor de palavras ou bytes, variando em tamanhos de centenas de milhares a bilhões,
cada uma tendo seu próprio endereço. A memória principal é um repositório de dados
rapidamente acessíveis compartilhados pela CPU e dispositivos de I/O (input/output -
entrada/saída).
A maioria dos computadores, segundo Tanenbaum (2001), possui uma
hierarquia de memória, com uma pequena quantidade de cache volátil, muito rápida e de
custo elevado, dezenas de megabytes de memória principal volátil (RAM), de
velocidade e preço médios e dezenas ou centenas de gigabytes de armazenamento em
disco não-volátil, lento e de baixo custo, sendo tarefa do sistema operacional coordenar
como essas memórias são usadas.
No Linux, a gerência de memória é subdividida em dois componentes: o
primeiro, responsável pela alocação e liberação de memória física (páginas, grupos de
páginas e pequenos blocos de memória) e o segundo pela memória virtual.

2. Gerência de Memória Física


Conforme Silberschatz (2000), o gerente primário da memória física é o alocador de
páginas, responsável pela alocação e liberação de todas as páginas físicas e capaz de
disponibilizar intervalos de páginas fisicamente contíguas sob demanda, utilizando um
algoritmo buddy-heap para rastrear as páginas físicas disponíveis.
Nesse tipo de alocação, as regiões alocáveis possuem uma parceira adjacente e
sempre que duas regiões parceiras são liberadas, estas se combinam para construir uma
região maior. Solicitações de pequenos blocos de memória que não puderem ser
satisfeitas por não existir uma pequena região disponível, resultam na divisão de uma
região maior em duas outras parceiras de tamanho igual, repetindo o processo, se
necessário, até que se consiga uma região do tamanho desejado, conforme ilustra a
figura 1, para uma solicitação de 7 kilobytes de memória em um alocador que utiliza um
sistema de parceiros de tamanho binário. Nesse caso, 1 kilobyte será perdido, pois o
tamanho mínimo permitido capaz de suportar os 7 kilobytes é 8 kilobytes.
Todas as alocações de memória no kernel do Linux são feitas de maneira estática
por drivers que reservam uma área de memória contígua na inicialização do sistema, ou
de forma dinâmica pelo alocador de páginas, sendo que as funções do kernel não
precisam utilizar o mesmo alocador básico para a reserva de memória. Os sistemas de
alocação de memória mais importantes no Linux, segundo Tanenbaum (2001), são o
sistema de memória virtual, o alocador de comprimento variável kmalloc e os dois
caches de dados persistentes no kernel (cache de buffers e cache de páginas).

Figura 1: Divisão da memória em um buddy-heap

O alocador kmalloc é utilizado para solicitações de tamanho arbitrário. Esse


serviço aloca páginas inteiras sob demanda e, em seguida, divide-as em pedaços
menores para satisfazer as requisições freqüentes de pequenos blocos de memória. A
alocação de memória utilizando o kmalloc, envolve determinar uma lista, entre as listas
mantidas pelo kernel das páginas alocadas com o kmalloc e então, utilizar o primeiro
bloco disponível na lista ou alocar uma nova página e subdividí-la.
O alocador kmalloc não pode relocar ou liberar regiões de memória alocadas
pelo mesmo em resposta a uma possível falta de memória. Uma vez alocadas, essas
regiões somente poderão ser reutilizadas mediante uma liberação explícita.
Outros três subsistemas principais que tratam de sua própria gerência de páginas
físicas e que interagem intimamente entre si, segundo Silberschatz (2000) são o cache
de buffers, que é o cache principal do kernel para dispositivos orientados a bloco; o
cache de páginas que mantém em cache páginas inteiras de conteúdo de arquivos, dados
da rede etc e o sistema de memória virtual que gerencia o espaço de endereçamento
virtual de cada processo.

3. Memória Virtual
No Linux, o responsável pela manutenção do espaço de endereçamento visível para cada
processo é o sistema de memória virtual. A criação das páginas de memória virtual sob
demanda e a gerência do carregamento dessas páginas para o disco, ou o
descarregamento de volta para o disco, é responsabilidade desse sistema.
Conforme Silberschatz (2000) descreve, o gerente de memória virtual mantém
duas perspectivas do espaço de endereçamento de um processo. A primeira, é a visão
lógica, que descreve as instruções recebidas pelo sistema de memória virtual referentes
ao layout do espaço de endereçamento, que consiste em um conjunto de regiões não-
superpostas, com cada uma representando um subconjunto contínuo e alinhado por
página do espaço de endereçamento e sendo descrita internamente por uma única
estrutura vm_area_struct1, que define as propriedades da região.
A segunda visão é a visão física de cada espaço de endereçamento, armazenada
nas tabelas de páginas do hardware para o processo e é gerenciada por um conjunto de
rotinas. Cada vm_area_struct na descrição do espaço de endereçamento contém um
campo que aponta para uma tabela de funções que implementam as funções básicas de
gerência de página para qualquer região dada da memória virtual.
Existem diferentes tipos de regiões de memória virtual no Linux e as
propriedades que as caracterizam são o tipo de armazenamento secundário associado e
sua reação a escritas. O tipo de armazenamento secundário associado às regiões,
descreve a origem das páginas da região, sendo que a maior parte das regiões possuem
um ou nenhum arquivo de apoio como armazenamento secundário.
Uma região para o espaço de endereçamento de um processo pode ser privada ou
compartilhada. Quando um processo tentar escrever em uma região privada de outro
processo, o paginador efetuará a operação de copy-on-write2, que copia o conteúdo da
região para uma outra região nova e efetua as alterações na região recém-criada,
preservando a região privada. Se a escrita for feita em uma região compartilhada, o
objeto mapeado para tal região é atualizado, de modo que as alterações ficam visíveis de
imediato para todos os processos que estiverem mapeando tal objeto.
A criação de um novo espaço de endereçamento pelo kernel, conforme
Silberschatz (2000) descreve, ocorre em duas situações: na execução, por um processo,
de um novo programa através da chamada ao sistema exec, no qual o processo recebe
um espaço de endereçamento novo, completamente vazio, cabendo às rotinas
carregarem o programa para ocupar esse espaço, ou pela criação de um novo processo
via fork, que implica na criação de uma cópia integral do espaço de endereçamento
virtual do processo existente.

3.1. Swapping e paginação


Segundo Tanembaum (2001), com os sistemas de tempo compartilhado ou
computadores pessoais orientados graficamente, às vezes a memória principal não é
suficiente para manter todos os processos ativos, então os processos excedentes devem
ser colocados no disco e voltar à execução na memória principal dinamicamente, pois
conforme Silberschatz (2000), os processos precisam estar na memória para serem
executados. Nesse contexto, duas técnicas de gerenciamento de memória podem ser
utilizadas, dependendo, em parte, do hardware disponível.
A técnica mais simples, é o swapping usada para algoritmos de escalonamento,
baseando-se em prioridades. Se um processo de prioridade mais alta necessitar ser
carregado, o gerenciador de memória poderá descarregar um outro com prioridade mais
baixa para o disco, para que o de maior prioridade possa ser executado. Quando for

1 Vm_area_struct é uma estrutura de dados utilizada para descrever uma área da memória virtual para um processo.
2 Copy-on-write é a operação onde uma região privada é copiada para uma nova região a fim de preservar essa
região contra escritas a partir de outro processo (SILBERSCHATZ, 2000).
finalizado, o processo descarregado pode então, ser carregado novamente para a
memória principal.
Segundo Silberschatz (2000), quando o escalonador de CPU executar um
processo, ele chama o dispatcher3, que verifica se o próximo processo na fila está na
memória. Se o processo não estiver na memória e não houver região de memória livre, o
dispatcher descarrega um processo que está na memória (swap out) e carrega o processo
desejado em seu lugar (swap in), recarregando, então, os registradores de forma usual e
transferindo o controle para o processo selecionado.
No Linux, o processo de paginação pode ser dividido em duas seções: o
algoritmo de políticas, primeiramente, que decide que páginas são gravadas no disco e
quando esse processo será feito, por meio de uma versão modificada do algoritmo de
relógio, que emprega um relógio de passagens múltiplas.
A segunda seção, é o mecanismo de paginação, que suporta tanto partições e
dispositivos dedicados, quanto arquivos, sendo que no último, o processo pode ser mais
lento devido ao custo adicional provocado pelo sistema de arquivos. O algoritmo
utilizado para a gravação das páginas é o algoritmo next-fit, para tentar gravar páginas
em carreiras contínuas de blocos de disco, visando um melhor desempenho.

4 Considerações Finais
Com o desenvolvimento desse artigo pôde-se compreender melhor o funcionamento do
sistema de gerência de memória dos sistemas operacionais, e sua aplicação prática no
Linux. Foi possível também compreender as técnicas usadas para permitir que o sistema
possa executar diversas tarefas mesmo quando a memória principal não possui
capacidade suficiente para isso, como o processo de swapping que representa um
avanço nos sistemas Linux frente a outros sistemas operacionais, pois este efetua a
movimentação de páginas individuais ao invés de processos inteiros como os sistemas
UNIX mais antigos
Outra melhoria que o Linux possui na técnica de swap é quanto a sua utilização.
Enquanto os sistemas Windows efetuam swapping mesmo quando existe memória
disponível, no Linux, o swapping é feito somente quando necessário, aumentando o
desempenho do sistema, pois reduz a quantidade de operações de I/O de disco.

5 Referências
Silberschatz, Abraham; Galvin, Peter; Gagne, Greg. (2000), Sistemas Operacionais:
Conceitos e Aplicações. Tradução de Adriana Rieche. Rio de Janeiro: Editora
Campus.
Stallings, William. (2004), Operating Systems Internals and Design Principles, Prentice
Hall, 4th edition.
Tanenbaum, Andrew S. (2001), Modern Operating Systems. 2nd edition, Upper Saddle
River, N.J.: Prentice Hall.

3 Dispatcher, também chamado de agendador de curto prazo, conforme Stallings (2004) descreve, decide qual dos
processos na memória, prontos para a execução, será executado pelo processador.

Você também pode gostar