Escolar Documentos
Profissional Documentos
Cultura Documentos
IOS e Android
Daniel Augusto de Souza Oliveira
1. Introdução
Gerenciamento de Memória é um complexo campo da ciência da computação e são
constantemente desenvolvidas várias técnicas para torná-la mais eficiente. A cada dia
que passa os programadores necessitam de mais memória e mais programas rodando
simultaneamente para poderem tratar cada vez mais informações. O tratamento
necessário da memória utilizada não é uma tarefa fácil de ser implementada. Existem
vários requisites que devem ser observados para o correto funcionamento, tais como,
segurança, isolamento, performance, entre outros. Para isto a função de gerenciar a
memória passa a ser do Sistema Operacional e não mais do aplicativo.
Para que uma memória funcione de maneira correta, é necessário que se tome cuidado
com vários elementos como segurança e isolamento, e para isso é utilizado o
gerenciamento de memória. Este desenvolve sua função a partir de duas tarefas, a
Alocação de Memória que pode ser tanto estática, feita quando o programa é compilado,
e a dinâmica, adiada até a execução; e a Fragmentação, desperdício de memória, por sua
vez pode ser interna, sobra na memória reservada ao programa, e externa que ocorre
quando após o termino dos programas são deixadas pequenas lacunas entre as páginas.
Para que a utilização da memória seja mais vantajosa, é utilizar a Paginação, processos
virtuais da memória, aplicados na divisão da memória física em partições menores,
chamadas de frames. O conjunto de registradores especiais rápidos chama-se
Translation Lookaside Buffer, estes são subdivididos em chave valor que lhe é dado em
todos os registradores ao mesmo tempo, e valor.
Existe uma técnica de gerenciamento de memória chamada memória virtual, que é onde
memórias principais e secundárias juntas criam a ilusão de que há muito mais memória,
com isso os programas e suas estruturas de dados não se limitam ao tamanho da
memória física, e assumem endereços na memória secundária. O gerenciamento de
memória virtual pode ocasionar vazamento de memória, ou seja, quando determinada
quantia de memória é alocada e não liberada mesmo que não sendo utilizada assim
dados perdem a referência sem ao menos terem usado a memória. O gerenciamento
automático chama-se Garbage colletor, ele retira os blocos de memória
automaticamente. Seus algoritmos são divididos em duas famílias: a identificação
direta, por contagem de referência, e a identificação indireta, pelo varrimento.
O sistema deve, portanto, assegurar que cada processo tenha seu próprio espaço na
memória, prover a proteção deste espaço para que não haja a sobrescrição e utilização
por outro processo e possibilitar que uma aplicação não utilize mais memória que a
existente fisicamente.
3.4.1. Segmentação
A Segmentação divide a memória em dois espaços distintos, o espaço do kernel (Kernel
Space) e o espaço do usuário (User Space). Dentro destes espaços temos os quatro
segmentos básicos:
Kernel Code.
Kernel Data/Stack
User Code
User Data/Stack
Desta forma podemos garantir a proteção da memória, evitando o acesso de memória
entre usuários. Garantindo principalmente que processos em modo kernel não se
misturem com processos em modo usuário e que a pilha de dados não cresça
indiscriminadamente.
3.4.2. Paginação
Somente com a segmentação teríamos blocos de memória contínuos para cada processo.
Isso sobrecarregaria a memória, copiando a imagem de um processo todo de uma vez.
Caso não haja um espaço de memória suficiente para alocar todo o processo, ou seja,
não há um segmento que o comportasse e haverá falha por falta de segmento
(segmentation fault). Para resolver tal problema é usada a paginação, onde a memória é
dividida em pedaços de tamanho fixo (páginas), e segmentos de código são alocados
nestes e mapeados utilizando-se uma tabela de páginas, ao invés de alocação de todo
código de uma única vez.
No Linux a paginação é feita em três níveis, ou seja são usadas três tabelas para mapear
a memória, a Page Directory, Page Middle Directory e Page Table. O campo directory
field é usado como índice para o diretório global, que existe em cada processo. O valor
achado nessa posição é um ponteiro para a page middle table, que é novamente indexada
e contém um ponteiro que indica para o endereço virtual de memória. Além disso, para
aumentar o desempenho do sistema é mantido um buffer com os últimos endereços
acessados, para que não haja necessidade de fazer múltiplos acessos as páginas. Este
buffer é chamado de TLB (Translation Lookaside Buffer). Logo antes de realizar a
procura do endereço utilizando as tabelas de página, o sistema busca a tradução direta
do endereço no TLB. É importante que a TLB se mantenha atualizada com relação ao
conteúdo da memória principal. Como a TLB, em geral, possui tamanho menor que a
memória principal, é necessário substituir alguma tradução armazenada por outra mais
recente.
6. Referências
Gerenciamento de Memória. Disponível:
http://pt.wikipedia.org/wiki/Gerenciamento_de_memória Acesso: julho/ 2016.
Gerenciamento de Memória. Disponível:
http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedi
a-CocoaCore/MemoryManagement.html Acesso: julho/2016.
Mobworld – “Memory Management in Android”. Disponível:
http://mobworld.wordpress.com/2010/07/05/memory-management-in-android
Acesso: julho/2016.