Gerenciamento de Memória

Características

O gerenciamento de memória do Linux é baseando em paginação e segmentação.

Os processos possuem tabelas de páginas próprias e não podem acessar páginas de outros processos, para isto são empregados bits de verificação. Se um programa tenta acessar uma região de memória de outro programa ou do kernel o programa é interrompido com uma falha de segmentação. A troca de informações entre kernel e espaço de usuário deve ser feita através de chamadas do sistema.

O Linux utiliza a TLB do processador como cache para acelerar o processo de recuperação de endereços físicos.
Quando ocorre uma troca de contexto entre processos a TLB precisa ser esvaziada, e quando alguma página sai da memória física a TLB precisa ser atualizada.

As tabelas de páginas ficam na memória física, pois não podem estar sujeitas a paginação. O acesso a elas é feito a partir de um ponteiro guardado em um registrador do CPU.

Para remoção de páginas é utilizado bits de referência e idade das página, além da manutenção de multíplas listas como lista de páginas ativas, lista de páginas inativas, lista de páginas com idade zero.

A partir do algoritimo do relógio é feita a troca de páginas utilizando-se a lista das páginas que não possuem idade zero. É utilizada também uma lista reversa para saber os processos aos quais uma página está ligada para simplificar a alteração da tabela de páginas do processo quando da retirada da página da memória física.

Durante a criação de um processo é necessário criar uma tabela de páginas para o processos e alocar páginas necessárias para o carregamento do processo.

Na troca de contexto de processos o ponteiro que aponta para a tabela de páginas no processador deve ser atualizado com a tabela de páginas do novo processo. O escalonador de processos em sua estrutura descritora do processo contém também o endereço para a tabela de páginas do processo, de forma que este possa ser carregado no processador.

Quando ocorre uma interrupção de page-fault o gerenciador de memória deve carregar na memória física a página solicitada, utilizando para isto uma região não utilizada, se não existir uma região não utilizada o algoritimo para remoção de páginas entra em ação.

Quando da remoção de um processo suas páginas virtuais são liberadas e a tabela de páginas é liberada também.

Compartilhamento de memória

O compartilhamento de memória pode ser feito de duas formas utilizando BSD mmap ou System V IPC.

A utilização do BSD mmap é o que compreende o mapeamento de arquivos em memória virtual.

Uma vez aberto um arquivo a chamada de sistema mmap mapeia uma quantidade determinada de bytes do arquivo na memória e retorna um ponteiro que pode ser utilizado para acesso direto ao arquivo. A grande vantagem é que como o acesso é feito através de ponteiros não existem problemas relacionados com o posicionamento do cursor do arquivo que se existiriam se mais de um processo utilizasse a chamada fseek para um mesmo identificador. A atualização da area de memória compartilhada só ocorre após a chamada de sincronização msync.

O System V IPC provê um mecanismo mais robusto, podendo ter compartilhamento por fila de mensagens, semáforos ou compartilhamento de segmentos.

Este tipo de compartilhamento é baseado em chaves geradas pela chamada de sistema ftok.

Compartilhamento de segmento

É feito baseado na chamada de sistema shmget que cria um segmento compartilhado ou conecta a um segmento compartilhado já existente para a chave. Este método retorna um identificador do segmento compartilhado, para se obter um ponteiro para a area de memória do segmento utiliza-se este identificador e a chamada de sistema shmat.A chamada shmdt desconecta de um segmento compartilhado, e a chamada shmctl libera um segmento compartilhado.

Compartilhamento por fila de mensagens

Baseado na chamada msgget que cria uma nova fila ou conecta a uma fila existente para a chave passada.
Ums estrutura deve ser definida para envio das mensagens, a estrutura padrão apresenta um campo long e um campo com um vetor de caracteres de uma posição, entretanto estruturas arbitrárias podem ser utilizadas desde que seu primeiro campo seja um long. As mensagens são enviadas com a chamada msgsnd e recebidas com a chamada msgrcv. A chamada msgctl destrói uma fila de mensagens.

Compartilhamento por semáforos

A chamada de sistema semget cria um determinado número de semáforos ou conecta aos semáforos já criados para a chave passada e retorna um identificador. A manipulação dos semáforos é feita através da chamada de sistema semop atra'ves da estrutura de controle passada como argumento. A varificação de dados e liberação dos semáforos é feita pela chamada de sistema semctl

Área de Swap

A área de swap é utilizada para guardar as páginas que não estão mapeadas na memória física. O tamanho ideal da área de swap é aquele que faz com que o sistema apresente memória total (física + swap) para enfrentar picos de utilização como no carregamento de processos. Esse tamanho é considerado variavel dependendo a aplicação do computador rodando o sistema. Sistemas de usuário podem precisar de mais swap pois muitos processos rodam ao mesmo tempo. Em servidores com ações mais dedicadas a area de swap pode ser menor. Computadores com pouca memória RAM podem precisar de mais swap que computadores novos que possuem gigabytes de memória. O esgotamento da área de swap pode ocorrer podendo inclusive levar à uma situação de travamento do computador, porém somente em condições muito específicas de utilização das páginas presentes na memória física e quantidade de páginas virtuais alocadas. Pela arquitetura e utilização da memória de swap podemos perceber sua falta de segurança. Os dados ficam em uma partição em separado, e as trocas devem ocorrer de forma rápida de forma que não há encriptação dos dados. Entretanto a forma como as páginas ficam guardadas na área de swap não representa a estrutura contínua delas, e talvez nem todas estejam lá, então conseguir dados a partir de uma partição de swap pode ser uma tarefa complicada apesar da aparente facilidade de acesso aos dados.

Referências:

http://linux-mm.org/
http://ptgmedia.pearsoncmg.com/images/0131453483/downloads/gorman_book.pdf
http://www.ibm.com/developerworks/library/l-mem26/

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