Gerenciamento de memória
O sistema de gerenciamento de memória do Mach é baseado em páginas e também é dividido em 3 partes:
• pmap: esse módulo realiza as tarefas de mais baixo nível do gerenciamento de páginas e se comunica diretamente com o hardware (o MMU). Esse módulo deve ser rescrito a cada vez que o sistema á portado para uma outra máquina.
• código independente de máquina: é a parte do kernel que trata os sinais de page-fault, gerência o espaço de endereçamento e troca as páginas.
• memory manager: é um processo que roda no espaço do usuário e gerência a memória de forma a manter as informações de páginas que estão carregadas e o lugar no disco onde encontram-se as páginas fora da memória.
Essa arquitetura permite que o kernel fique ainda menor e mais simples, visto que muitas funções foram transformadas em processos do usuário. Outra vantagem nesse tipo de sistema é que o usuário pode escrever seu próprio gerenciador de memória, uma vez que o protocolo que funciona entre o kernel e o memory manager é conhecido. Por outro lado, o kernel teve que adquirir funções para se proteger de gerenciadores de memória maliciosos ou até mesmo mal feitos.
Memória Virtual
Conceitualmente, o sistema Mach permite ao usuário ver uma grande memória linear virtual, gerenciando-a a partir de páginas. Entretanto, os programas podem usar essa memória de forma muito esparsa, aumentando assim a quantidade de informações que deveriam ser guardadas no kernel para gerenciar todas essas páginas.
Para isso, o sistema Mach utiliza o conceito de regiões que determinam um endereço base e um tamanho do espaço de memória usado.
Um conceito bastante interessante nesse tópico é o de objeto de memória, que pode ser uma página ou um conjunto de páginas, ou ainda um arquivo mapeado. Um objeto de memória deve ser mapeado para uma região de memória virtual não utilizada. Arquivos mapeados dessa forma podem ser acessados com as instruções normais de leitura e escrita na memória. Quando um processo termina, seus arquivos mapeados aparecem no disco.
Compartilhamento de memória
O compartilhamento de recursos entre threads no sistema Mach é automático e não precisa ser programado. Dessa forma, se uma thread quer acessar o espaço de endereçamento de outra, basta fazê-lo, pois é o mesmo que o seu. Entretanto, esse compartilhamento não ocorre entre processos, principalmente quando esses estão localizados em processadores diferentes.
Assim, o Mach fornece três tipos de compartilhamento de memória entre processos pais e filhos:
• a região não pode ser usada pelo processo filho: indica que o processo pai não quer compartilhar aquela região e qualquer acesso a ela será tratado como um acesso a uma área não alocada
• a região é compartilhada: o compartilhamento acontece normalmente, e qualquer modificação em uma cópia acarreta na atualização da outra.
• a região no filho é uma cópia da do pai: a região é copiada e qualquer modificação será feita somente na cópia local. Essa opção é implementada utilizando-se um artifício de copiar-na-escrita, ou seja, a cópia física somente é realizada se houver alguma modificação na cópia. Isso economiza preciosos ciclos de CPU no caso de regiões que nunca são acessadas.
Gerenciadores de Memória Externos
No Mach, é possível criar gerenciadores de memória customizados e que funcionam no lugar do gerenciador de memória padrão do sistema. Esse sistema dá maior flexibilidade ao Mach.
Cada objeto de memória possui um gerenciador próprio. Assim, é possível implementar políticas diferentes para cada tipo de objeto diferenciando, por exemplo, o lugar onde as páginas de memória serão armazenadas e as regras de o que será feito com o objeto após ter sido usado.
Para isso, o gerenciador de memória necessita de 3 portas:
• object port: é criada pelo gerenciador de memória e é usada pelo kernel para informar ao gerenciador eventos como page fault e outros.
• control port: é criada pelo kernel para que o processo possa responder ao kernel em função desses eventos.
• name port: é usada como um tipo de nome que identifica o objeto.
Quando o gerenciador de memória mapeia um objeto, ele envia uma mensagem ao kernel contendo algumas as informações do objeto. Em seguida, o kernel responde com a criação das outras duas portas (control e name ports) e notifica essa ação ao processo. Esse último responde com uma mensagem de resposta contendo os demais atributos do objeto. Inicialmente, todas as páginas de um objeto mapeado estão marcadas como unreadable/unwritable para forçar um evento no primeiro acesso.
Memória Compartilhada Distribuída
O sistema de gerenciamento de memória do Mach permite perfeitamente que se implemente um esquema de memória compartilhada distribuída sem que o kernel precise ser alterado. A idéia é ter um espaço de endereçamento global e linear que é compartilhado por várias máquinas diferentes. Quando uma thread faz um acesso a uma página que não está carregada, é gerado um page fault. Quem trata esse page fault é o gerenciador de memória, que deve prover a página ao kernel. Entretanto, não há restrições quanto à maneira como essa tarefa é realizada.
Como o Mach possui diferentes gerenciadores de memória para diferentes tipos de objetos, é natural que se crie um novo tipo para atender a essa classe de aplicações. Pode-se ainda criar gerenciadores de memória com características diferentes. Por exemplo, um garante sempre a consistência dos dados, e outro garante somente que os dados são os mais recentes dentro de um intervalo de alguns segundos. Claramente o primeiro é bastante mais complicado de se implementar, mas alguns algoritmos podem não necessitar de tanta qualidade de serviço. Dessa forma, pode-se economizar processamento utilizando-se uma política mais flexível.
Pode-se ainda ter um processo gerenciador único de memória em todo cluster, pois o sistema de mensagens do Mach é transparente em relação à rede. Isso facilita bastante o trabalho no caso de se ter um gerenciador de memória central.
Nenhum comentário:
Postar um comentário