Unidade G - Gerenciamento de memória

Formas de gerência de memória

A seguir, são apresentados alguns dos métodos clássicos de gerenciamento de memória. Vale lembrar que aplicações comerciais modernas utilizam-se de variações e adaptações destes mecanismos.

Partições Fixas

Considerando sistemas multiprogramados, está é a forma mais simples de gerenciamento de memória. Quando o sistema operacional é carregado, divide a memória disponível em diversos partições fixas e de tamanho variado. Conforme os processos vão sendo alocados, as partições vão sendo ocupadas de forma aleatória. A figura G.4 mostra este esquema de divisão da memória.

Vantagens

Desvantagens

Partições variáveis

Neste mecanismo de gerenciamento todo o espaço disponível é controlado pelo sistema operacional e as partições vão sendo criadas e ocupadas por processos no tamanho exato da partição.

Vantagens

Desvantagens

A figura G.5 procura representar a dinâmica das partições variáveis. As situações são explicadas a seguir:

Um novo processo foi carregado (processo D) ocupando 100KB da lacuna gerada em b). com esta ocupação, uma lacuna de 50KB é gerada.

É necessário que o sistema tenha o controle dos espaços disponíveis e que tenha um mecanismo de escolha de “qual espaço” utilizar na locação de um novo processo. Os mecanismos possíveis são:

Este controle costuma ter um alto custo computacional, ou seja, o processador e o sistema operacional perdem muito tempo útil no controle destas estruturas.

Parágrafos

Pode-se reduzir o problema da fragmentação adotando unidades de alocação de tamanho fixo (32 bytes por exemplo). Estes blocos fixos são conhecidos como parágrafos. Quando um processo precisar de memória, irá ocupar um numero exato de parágrafos (que são blocos de 32 bytes). Isto permite ao sistema ter uma fragmentação interna máxima de 31bytes por  processo carregado, o que é bem pouco significativo.

A figura G.6 procura representar a divisão por parágrafos. A memória está dividia em n blocos de 32 bytes (parágrafos) o processo A ocupa 3 blocos;  o processo B ocupa 2 blocos; o processo C ocupa 3 blocos. Supondo que o processo B seja de 33 bytes, o maior espaço que desperdiçado será de 31 byte, que foram alocados mas não utilizados.

Este mecanismo mantem a necessidade de controle das lacunas disponíveis e por consequência ainda apresenta a desvantagem da fragmentação externa – tal qual o sistema de partições variáveis.

Paginação

A paginação é um mecanismo de gerenciamento de memória que apresenta pequena fragmentação interna e nenhuma fragmentação externa. Isto garante ao sistema que o implementa um melhor aproveitamento do hardware de memória. Páginas são blocos de alocação de tamanho fixo, que são ocupados por processos.

Basicamente, a memória física é dividia em páginas e estas páginas são mapeadas na memória lógica. Este mapeamento é feito pelo uso de uma tabela de páginas, que faz referência entre as páginas lógicas e as páginas físicas; além disso, as páginas possuem um registro de deslocamento interno, facilitando a localização da informação pelo sistema operacional.

Vale lembrar que memória lógica é a memória que o processo usa/vê e a memória física é a placa de memória efetivamente. A o interfaceamento entre as duas memórias é feito pelo hardware MMU, que no caso, irá implementar a tabela de paginas para o mapeamento. A figura G.7 procura representar este esquema.

Na figura, vemos a memoria lógica dividida em 3 páginas de 4 bytes cada e cada página com um processo (os processos estão divididos em 4 partes); vemos a memória física dividida também em n páginas. Cada página é identifiada com um endereço de 5 bits, sendo que os 3 primeiros bits (mais significativos) identificam o número da página enquanto os 2 últimos bites (menos significativos) indicam a localização (deslocamento) do byte  dentro da página.

Está sendo mostrado também uma tabela de páginas, que é montada dentro da MMU e faz a relação entre as páginas. No caso:

Para localizar a informação Y2, vemos que está na página lógica 001, com deslocamento 01. este endereço é convertido na tabela de páginas para página física 101, com deslocamento 01.

Para localizar Z3 por exemplo, verificamos que o mesmo está na página lógica 010, com deslocamento 10. Este endereço é convertido pela tabela de páginas e encontramos a página lógica 000, com deslocamento 10.

Z3 está no endereço físico 000 10.

Observa-se que não há necessidade de haver continuidade entre as páginas, ou seja, a página pode ser montada em qualquer localização da memória física.

Problemas
O problema deste mecanismo de paginação está em definir o melhor tamanho de página, uma memória dividida em páginas grandes terá uma quantidade menor de páginas, dando menos “trabalho” para o processador cuidar do mapeamento. Por outro lado, isto aumenta a fragmentação interna (em cada página). Conforme Oliveira “na prática, os tamanhos de página variam entre 1Kbyte e 8Kbytes”.

Alguns outros controles também precisam ser implementados, como um mecanismo  controle de páginas livres e controle de páginas ocupadas.

Segmentação

Outra forma de gerenciamento de memória, mais intuitiva para o programador e o compilador é a segmentação, que divide a memória em segmentos tipicamente correspondentes a: código, dados estáticos, dados dinâmicos e pilha de execução.

Neste mecanismo a memória lógica é dividida em segmentos; uma endereços desta memória passa  a ser identificado por um segmento + um deslocamento em relação ao inicio do segmento. Na carga do processo, estes segmentos são copiados para a memória física e a tabela de segmentos (também “hospedada” na MMU) é construída.

Para endereçar sua área de memória, os processos geram endereços lógicos compondo o número do segmento associado a um deslocamento dentro do segmento. A MMU recebe esta informação e procura o segmento correspondente na tabela de segmentos e o deslocamento é comparado com o limite – se exceder, há uma violação de endereço e uma interrupção de acesso ilegal a memória é gerada, encerrando o processo. Se o deslocamento é valido, a MMU soma o deslocamento ao limite base para localizar o endereço na memória física.

A figura G.8 procura demonstrar o mecanismo de segmentação.

Para localizar informações em um sistema de memória segmentada:

Segmentação paginada

Apesar de ser mais intuitiva para os programadores, a segmentação traz novamente o problema da fragmentação externa, causado pelas repetidas alocações/liberações de blocos de memória (segmentos).

A segmentação paginada resolve o problema desta fragmentação, fazendo uma associação entre segmentação e paginação.

Neste caso temos uma memória lógica que lista uma tabela de segmentos e cada segmento contém uma tabela de páginas (exclusiva do segmento). O endereço de uma informação é composto pelo conjunto número do segmento, número da página e deslocamento dentro da página.