Gerenciamento de Memória no Linux

Gerenciamento de Memória

Abaixo são dadas algumas explicações sobre os principais aspectos de gerenciamento de memória no Linux.

1.Descrição: Principais características. Paginação pura? Mecanismos de proteção?

Como sabemos, os computadores da atualidade possuem uma quantidade limitada de memória. Embora esse limite venha avançando muito nos últimos anos, a necessidade de memória por partes dos programas em geral também tem acompanhando essa tendência. Assim, temos uma necessidade de gerenciar essa demanda para que o sistema como um todo apresente um bom desempenho. O Gerenciamento de memória é justamente a procura pela otimização dessa funcionalidade.
Particularmente o Linux é um sistema que em linhas gerais não necessita de muita memória, mas que, apesar disso, gerencia muito bem e trabalha de forma muito eficiente com estados de memória em excesso. Aproveitando esse espaço na memória RAM para colocar arquivos que deveriam ser lidos do HD, mas que tem uma grande probabilidade de serem requisitados, aumentando significativamente o desempenho. Um artifício bastante utilizado para suprir essa limitação de memória é o uso de memória virtual. Parte do HD é utilizado para armazenar dados que não estão sendo utilizados, liberando espaço para que outros processos possam ser carregados. No Linux, é esse processo é chamado de paginação, e segue esse princípio. Sempre parte de processos que estão mais ociosas são deslocadas para memória virtual, aumentando assim a disponibilidade da memória RAM. No Linux para alocar e desalocar páginas é utilizado o algoritmo de Buddy, por meio de blocos que são compostos de páginas. Ao passo que cada bloco é alocado o tamanho deste aumenta, ou seja, o primeiro bloco contém uma página, o segundo duas, o terceiro três páginas e assim por diante. No linux é feito um controle de acesso a informações para checar qual processo irá utilizar qual página na memória, evitando assim acessos indevidos. Os acessos também são diferenciados pela natureza, sendo alguns em modo kernel e outros em modo user.

2.Como funciona a TLB no Linux?

A Translation Lookaside Buffer (TLB) é constituída por um conjunto de registradores muito rápidos que são utilizados para otimizar o acesso as tabelas de páginas virtuais. Ele guarda as referências das páginas mais utilizadas recentemente, melhorando muito o desempenho do sistema. Atualmente, o Linux suporta apenas TLB que trabalham com páginas cujo tamanho é de até 4KB. Existem no Linux algumas chamadas específicas para atuar na TLB, por exemplo, limpar parte ou totalmente a TLB.

3.Tabela de páginas: Onde estão localizadas? Como são acessadas?

A tabela de páginas no Linux tem uma característica que otimiza a conversão de endereços virtuais em endereços físicos. Para isso, é definida um tabela de página para cada processo iniciado, assim a tabela de página inteira pode assumir um endereço virtual de mesmo referência.
. O Linux segue um sistema de paginação que se divide em 4 níveis distintos .Um endereço virtual no Linux é composto de 5 campos. Sendo o primeiro o diretório de páginas (PGD), o segundo o diretório superior de páginas (PUD), o terceiro o diretório intermediário de páginas (PMD), o quarto o tabela de páginas (PTE) e o quinto o deslocamento (offset). Qualquer processo é um ponteiro (mm_struct -> pgd) para sua própria tabela Page Global Directory(o diretório de páginas), que é um page frame (moldura de página) alocada a cada mudança ocorrida.

4.Algoritmos e estrutura de dados para remoção de páginas.

Para remoção de páginas o Linux se baseia numa técnica que para escolher a página que deve ser removida em cada instante analisa um caráter de envelhecimento, mesclando uso e criação. Assim, a idade de uma página vai sendo atualizada a medida que ela é acessada. Ao passo que uma página foi utilizada, isso é um corte indício de que ele pode voltar a ser utilizada novamente. E com o passar do tempo, a idade dessa página vai aumentando, mas caso ela volte a ser utilizada, sua idade deve ser diminuída, uma vez que o indício volta a se tornar verdadeiro. Assim, as páginas mais velhas são as priorizadas para remoção quando necessário. São mantidas duas listas de envelhecimento, onde a primeira contém as páginas que estão atualmente em uso e a segunda contém as páginas que são candidatas a remoção. Esse processo ocorre por demanda, ou seja, quando um processo solicitar uma página, e não houver disponibilidade, a última da lista será removida.

5.Descreva as seguintes interfaces para o gerenciamento de memória:

a.Criação de processos
No Linux, a criação de processos tem como principal ferramenta a chamada fork. Como o próprio nome sugere, é criada uma ramificação ou uma bifurcação. Um novo processo é criado exatamente do ponto onde o outro estava no momento da criação. Assim, o processo pai e o filho irão compartilhar do mesmo código e o segmento de dados do filho é uma cópia do segmento do processo pai. O filho é criado com uma cópia de todos os descritores de arquivos que o pai possui, mas dentro de cada arquivo, os ponteiros são compartilhados. Assim, uma movimento do filho dentro de arquivos compartilhados interfere no processo pai.

b.Page-fault.
Essa falha ocorre quando algum processo tenta acessar um endereço que não está referenciado nas tabelas de páginas. Assim, esse erro representa a falta da página. Após essa falha, o sistema pode buscar a informação procurada, informar o erro ao processo ou, até mesmo, finalizá-lo.

c.Remoção de processo.
Assim, quando um processo é finalizado, toda a sua estrutura é apagada. As regiões de memória são liberadas assim como os descritores utilizados no processo. Temos a chamada tskill que é responsável por finalizar processos no linux.

6.Compartilhamento de memória. Como fazer?

No Linux, o compartilhamento de memória é feito em diversas situações, pois essa prática em vários casos pode agregar uma aumento signicativo no desempenho do sistema. Há compartilhamento de memória entre buffers de blocos e página, entre páginas através de copy-on-right e entre subrotinas ao serem executadas. No compartilhamento entre páginas, em geral, temos um compartilhamento somente na leitura, e caso haja necessidade de escrita nessa página, a mesma é copiada e seu caráter é alterado para privado. Com isso, podemos evitar duplicações de páginas desnecessárias, economizando o tempo que seria gasto para realizar o processo de cópia e a memória que seria aplicada para armazenar a redundância.

7.Mapeamento de arquivos na memória virtual.

O mapeamento de arquivos na memória no Linux pode ser feito através da chamada de sistema mmap() que implementa de modo natural a paginação por demanda, uma vez que que os arquivos não utilizam a memória RAM completamente nem são lidos inteiramente do HD. Isso é muito útil, principalmente na manipulação de arquivos de grande porte, evitando por exemplo, o uso de buffers auxiliares. Essa melhora no desempenho tende a não ser tão perceptível em sistemas robustos como os computadores que dispomos, mas em sistemas com limitações de hardware, como em sistemas embarcados, esse acréscimo pode representar um aumento significativo.

8.Tratamento de áreas de memória fixas.

As áreas de memória fixa no Linux são designidas durante a inicialização do sistema. È construído um mapa destes endereços reservados. O Linux designa essas áreas em algumas situações mais críticas, como por exemplo a região que o Kernel utiliza para armazenar informações importantes, como estruturas de dados. Isto significa que estas memórias serão estáticas, e que durante a execução não podem ser transferidas nem retiradas. Por isso, em geral, para essas memórias, sempre reserva-se o começo da memória.

9.Segurança. Um processo pode invadir áreas de outros processos? Pode invadir áreas do sistema? O que acontece se um processo tentar acessar uma área não autorizada? Como é possível dados do kernel serem transferidos para processos e vice-versa?

Em geral, processos não podem invadir áreas destinadas a outros processos, uma vez que esses acessos são supervisionados pelo kernel. Porém, o que pode ocorrer é processos que compartilham uma mesma área de memória. O acesso de um processo a uma determinada área está estreitamente ligado com suas permissões. Então, se um processo não tem autorização para acessar áreas do sistema, ele não o fará. Sempre que ele tenta acessar uma área não autorizada, além de não conseguir, acontece uma referência inválida de memória, sendo enviado um sinal SIGSEGV (Signal Segmentation Violation). O Linux disponibiliza uma série de chamadas de sistemas que possibilitam o acesso indireto aos dados do Kernel para o trabalho no espaço do usuário.

10.Área de swap. Como ela é utilizada? Qual é o tamanho ideal da área de swap? A área de swap é protegida?

A área de swap é a região do disco rígido utilizada para implementar a memória virtual. Essa região pode ser definida como um arquivo ou como uma partição. A vantagem de utilizar um arquivo é que podemos facilmente definir um tamanho desejado e alterá-lo a medida que a necessidade mude. Mas com isso perdemos um pouco de desempenho no acesso ao arquivo. Uma forma de melhorar esse desempenho é destinar uma partição para área de troca(Swap). Claro que desta forma não será possível alterar tão facilmente o tamanho da área de troca, mas em contrapartida obtemos um melhora significativa no desempenho do uso da memória virtual. O Linux utiliza como área de troca uma partição que é definida durante a instalação. O tamanho da área de Swap no Linux depende diretamente da quantidade de memória RAM que seu computador dispõe. Existe uma lenda de que o recomendado é sempre o dobro da quantidade de memória RAM disponível. Obviamente que esta corrente não passa de uma balela completamente inepta. Suponha que um computador possua uma quantidade de memória RAM igual a 4GB. Podemos perceber claramente que reservar uma quantidade de memória de 8 GB no disco rígido seria um total absurdo, uma vez que essa área nunca seria usada. Por outro lado, suponha que um outro computador possua uma memória RAM de 128MB. Podemos também concluir que reservar 256 MB para área de troca seria totalmente inaceitável, pois seria muito pouco. Logo, podemos concluir que a área de troca é algo bem sensível ao tipo de usuário mas que possui alguns limites que atendem ao bom censo. Assim, para escolher, devemos nos basear na quantidade de memória RAM, analisando-a com o contexto em que está inserida. Se essa quantidade for considerada pequena, devemos tentar atingir um nível considerado como bom acrescentando memória na área de troca. Já se a referida quantidade for considerada grande ou satisfatória, devemos utilizar uma pequena área de troca, mas não nula, uma vez que é importante a existência dessa área, mesmo que pequena. Pois imprevistos podem acontecer com a memória RAM, e tendo a memória virtual no linux tem um caráter mais estático, problemas que poderiam ser evitados vão aparecer.

11.Criar experimentos que explorem os limites do sistema. Quantos processos podem ser criados? Qual é o maior tamanho de processo? Qual é a maior área de heap? Qual é a maior área de pilha? A área de swap pode ser esgotada?

Uma maneira de gerar experimentos que explorem os limites do sistema é utilizar comandos que demandem uso de memória de maneira exageradamente alta. Por exemplo, podemos criar uma thread ou processo que ocupe uma certa quantidade de memória no Linux. Tudo o que essa thread tem que fazer é se multiplicar, em um loop, por meio de fork. Rapidamente podemos assim, esgotar toda a memória do sistema e começar a alocar memória com o disco rígido, por meio da área de swap.

12.Referências utilizadas.
http://pt.wikipedia.org/wiki/Gerenciamento_de_mem%C3%B3ria
http://www.guiadohardware.net/comunidade/funciona-gerenciamento/765467/
http://comunidade-linux-brasil.info/content/view/41/21/
http://pt.wikipedia.org/wiki/Linux_(kernel)
http://homepages.dcc.ufmg.br/~scampos/cursos/so/aulas/aula16.html
http://blog.jorgepereira.com.br/2008/10/09/utilizando-mmap-para-mapear-arquivos-na-memoria/
http://kernel10.wikidot.com/tabelas
http://www.linux-mips.org/wiki/TLB
http://kernel10.wikidot.com/gerenciamento-de-memoria-no-linux

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License