Gerenciamento de Memória em Sistemas Operacionais

Classificado em Computação

Escrito em em português com um tamanho de 12,92 KB

Requisitos de Gerenciamento de Memória

  • a) Relocação: Capacidade de colocar um processo em uma área diferente da memória uma vez que tenha sido recarregado para execução.
  • b) Proteção: Deve ser capaz de evitar a interferência (acidental ou intencional) entre os processos, de modo que um processo não possa se referir a posições de memória ocupadas por outro.
  • c) Compartilhamento: Quando vários processos devem acessar a mesma memória, o gerenciamento de memória deve ser capaz de permitir o acesso sem comprometer a proteção discutida no item b).
  • d) Organização Lógica: Este tópico será discutido ao longo deste material. Muitas técnicas foram desenvolvidas para essa organização, como a segmentação, que será discutida posteriormente.
  • e) Organização Física: Este aspecto será estudado na seção de hierarquia de memória.

Hierarquia de Memória

A hierarquia de memória é a organização em pirâmide dos níveis de memória em computadores. Seu objetivo é otimizar o desempenho, combinando memórias de alta velocidade (e custo) com memórias de baixa velocidade (e custo), com base no princípio da localidade de referência.

Os pontos básicos relacionados à memória podem ser resumidos como segue:

  • Quantidade
  • Velocidade
  • Custo

A questão da quantidade é simples: quanto mais memória disponível, mais se pode usar. A velocidade ideal para a memória é a velocidade com que o processador pode trabalhar, de forma que não haja tempo de espera entre a computação e o cálculo, usado para buscar operandos e armazenar resultados. Em suma, o custo da memória não deve ser excessivo para que a construção de um dispositivo acessível seja viável.

Como era de se esperar, esses três fatores são concorrentes, por isso devemos encontrar um equilíbrio. As seguintes afirmações são válidas:

  • Quanto menor o custo, maior o tempo de acesso.
  • Um custo mais elevado implica maior capacidade.
  • Uma maior capacidade tende a reduzir a velocidade.

Busca-se, então, uma capacidade de memória suficiente, com uma velocidade que atenda à demanda por desempenho e um custo que não seja excessivo. Graças ao princípio da localidade de referência, é possível usar uma mistura de diferentes tipos de memória e atingir um desempenho próximo ao da memória mais rápida.

Os níveis que compõem a hierarquia de memória são, tipicamente:

  • Nível 0: Registradores
  • Nível 1: Cache
  • Nível 2: Memória Principal
  • Nível 3: Disco Rígido (com suporte à memória virtual)
  • Nível 4: Redes (atualmente considerado um nível mais alto da hierarquia de memória)

Partições de Tamanho Fixo

Neste cenário, quando um processo precisa ser carregado na memória:

  • Se for de tamanho igual ou menor que o tamanho de uma partição disponível (ex: 8MB), ele será alocado em qualquer partição livre. Caso todas as partições estejam ocupadas, o SO irá desalocar um processo de alguma partição e carregar o novo processo pronto para execução.
  • Se for maior do que o tamanho de uma partição (ex: 8MB), apenas uma parte desse processo será carregada (programadores projetam programas com a ideia de carregar apenas partes). Sempre que outra parte for necessária, o SO será responsável por carregá-la.

Partições de Tamanho Fixo Variável

Neste caso, existem duas abordagens para atribuir um processo a uma partição:

  1. Alocação na menor partição que se ajusta (Best Fit):

    Neste caso, há uma fila de processos para cada tamanho de partição.

    Problema:

    • Pode haver partições com espaço não utilizado e outras vazias por falta de processos de tamanho similar.
  2. Alocação na primeira partição que se ajusta (First Fit):

    Neste caso, os processos são organizados em uma fila única e, por otimização, quando uma partição é liberada, a fila é pesquisada para encontrar o primeiro processo que se encaixe nela.

    Problema:

    • Processos podem demorar um longo tempo para carregar porque não há outros que atendam à exigência do tamanho.

Partições Dinâmicas

Para superar algumas das dificuldades do particionamento estático, desenvolveu-se a solução de partições dinâmicas. Com este sistema, as partições são variáveis em número e tamanho, de modo que, quando um processo é carregado na memória, é-lhe atribuída exatamente a quantidade de memória de que precisa, e nada mais.

Este método começa bem, mas eventualmente leva a uma situação em que há um grande número de pequenos "buracos" na memória. Com o tempo, a memória começa a ser fragmentada e o desempenho diminui. Para resolver isso, foram desenvolvidas técnicas como:

  • Algoritmos de alocação: Para escolher qual é o melhor local na memória para um processo que está esperando para ser carregado.
  • Algoritmos de substituição: Para escolher qual processo na memória deve ser removido para dar lugar a um novo processo.
  • Compactação ou deslocamento: Para reorganizar processos contíguos e consolidar a memória livre.

Memória Real ou Primária

É onde os programas e processos de um computador são executados, sendo o espaço real que existe na memória para os processos em execução. Esta memória é geralmente mais cara do que a memória secundária, mas o acesso à informação nela contida é o mais rápido. Apenas a memória cache é mais rápida que a memória principal, mas seu custo é significativamente maior (lembre-se da hierarquia de memória vista na introdução aos sistemas de computador).

Memória Virtual

O termo memória virtual está associado a dois conceitos principais:

  1. A utilização de armazenamento secundário para oferecer a todas as aplicações a ilusão de ter mais memória RAM do que realmente existe no sistema.
  2. Oferecer aos aplicativos a ilusão de que estão sozinhos no sistema e, portanto, podem usar o espaço de endereço completo.

Relacionados à memória virtual, existem outros conceitos importantes:

Espaço de Endereçamento

Os endereços envolvidos no gerenciamento de memória são:

  • Endereço Físico: É uma posição real na memória principal.
  • Endereço Lógico: É uma referência a um local de memória independente da atribuição atual de dados para a memória. Sofre uma série de transformações executadas pelo processador (pela Unidade de Gerenciamento de Memória - MMU) antes de se tornar um endereço físico.
  • Endereço Virtual: É um tipo de endereço lógico em que o sentido é expresso como uma posição em relação a um ponto conhecido.

NOTA: Os programas do usuário sempre lidam com endereços virtuais; nunca veem os endereços físicos reais.

Unidade de Gerenciamento de Memória (MMU)

A Unidade de Gerenciamento de Memória (MMU) é uma parte do processador. Suas funções são:

  • Converter endereços lógicos emitidos pelos processos em endereços físicos.
  • Verificar se a conversão pode ser realizada.
  • Verificar se o processo que tenta acessar um determinado endereço de memória tem permissão para tal.

Fragmentação

A fragmentação é o desperdício de memória que ocorre devido aos métodos de gerenciamento de memória utilizados, especialmente nos métodos anteriores.

Tipos de Fragmentação

  • Fragmentação Externa: Ocorre quando há espaço de memória total suficiente para satisfazer uma exigência, mas ele não é contínuo.
  • Fragmentação Interna: Ocorre quando a memória alocada é ligeiramente maior do que a que foi exigida. Este espaço extra é interno à partição, mas não é utilizado.

Paginação

É uma técnica de gerenciamento de memória em que o espaço de memória física é dividido em seções de igual tamanho, chamadas quadros de página (frames). Os programas são divididos em unidades lógicas, chamadas páginas, que têm o mesmo tamanho dos quadros de página. Desta forma, é possível carregar uma página de informações em qualquer quadro de página disponível.

As páginas servem como uma unidade de armazenamento e transferência entre a memória principal e a memória auxiliar ou secundária. Cada quadro é identificado por um número de quadro, que corresponde à posição física da primeira palavra no contexto da página.

As páginas de um programa não precisam ser contíguas na memória física, embora o programador as veja dessa maneira (como um espaço contíguo virtual). Mecanismos de paginação permitem a correta correspondência entre endereços virtuais (fornecidos pelos programas) e endereços de memória real que são referenciados. Para controlar as páginas, é mantida uma tabela de memória, chamada tabela de páginas (ou Tabela de Mapeamento de Páginas - PMT), para cada processo.

NOTA: Ao usar endereços de memória virtual, eles não vão diretamente para o barramento de memória, mas sim para a Unidade de Gerenciamento de Memória (MMU).

A paginação evita o problema considerável de alocar blocos de memória de tamanhos variados, que afetava os sistemas de gerenciamento de memória anteriores. Devido às suas vantagens sobre os métodos anteriores, a paginação, em suas diversas formas, é utilizada em muitos sistemas operacionais.

Características da Paginação

  • O espaço de endereçamento lógico de um processo pode ser não contíguo.
  • Divide a memória física em blocos de tamanho fixo chamados quadros (frames).
  • A memória lógica (dos programas) é dividida em blocos de mesmo tamanho chamados páginas.
  • Mantém informações sobre os quadros livres.
  • Para executar um programa de 'n' páginas, é preciso encontrar 'n' quadros e carregar o programa.
  • Estabelece uma tabela de páginas para traduzir endereços lógicos em físicos.
  • Pode ocorrer fragmentação interna.

Vantagens da Paginação

  • É possível começar a executar um programa carregando apenas uma parte dele na memória, e o restante é carregado sob demanda.
  • As páginas não precisam ser contíguas na memória física.
  • É fácil controlar todas as páginas, uma vez que têm o mesmo tamanho.
  • O mecanismo de tradução de endereços permite distinguir os conceitos de espaço de endereçamento lógico e espaço de memória física. Todo o mecanismo é transparente para o usuário.
  • Libera o desenvolvedor das restrições de tamanho da memória física.
  • Não é necessário carregar um programa inteiro na memória para execução, o que pode aumentar o número de programas em multiprogramação.
  • Elimina o problema da fragmentação externa.

Desvantagens da Paginação

  • O custo de hardware e software aumenta devido à necessidade de gerenciar novas informações e ao mecanismo de tradução de endereços. Consome mais recursos de memória e tempo de CPU para execução.
  • É necessário reservar áreas de memória para as tabelas de páginas (PMT) dos processos.
  • O problema da fragmentação interna ainda ocorre. Por exemplo, se um programa necessita de 5KB, mas as páginas são de 4KB, serão atribuídas duas páginas (8KB), com 3KB não utilizados. A quantidade de espaço não utilizado, desta forma, pode ser considerável.

Segmentação

  • A memória é dividida em blocos de comprimento variável, chamados segmentos.
  • O endereço virtual é composto de duas partes: um segmento e um deslocamento.
  • Quando se faz referência a um segmento que não está na memória, produz-se uma falha de segmentação.
  • Isso leva à fragmentação externa.
  • Facilita a proteção da memória e evita a fragmentação interna.

Segmentação Paginada

É uma combinação de segmentação e paginação para obter as vantagens de ambos. Em vez de tratar um segmento como uma unidade contígua, ele pode ser dividido em páginas. Cada segmento pode ser descrito por sua própria tabela de páginas.

Os segmentos são geralmente múltiplos do tamanho de uma página, e nem todas as páginas de um mesmo segmento precisam estar na memória principal ao mesmo tempo. Páginas de um mesmo segmento, mesmo que contíguas na memória virtual, não precisam estar contíguas na memória real. Isso implica o uso de mais tabelas.

Entradas relacionadas: