Sistemas Operacionais - Gerência de Memória - Gerenciamento de Memória A organização e a gerência de memória são fatores importantes no projeto de sistemas operacionais Um dos objetivos é desenvolver um SO que não ocupe muita memória e, ao mesmo tempo, otimize sua utilização Memória desejável Infinitamente grande Rápida Não volátil Custo baixo Com a tecnologia atual não é possível o desenvolvimento de tal memória É usada uma hierarquia de memória Hierarquia de Memória Gerenciamento de Memória O sistema operacional deve abstrair esta hierarquia em um modelo útil e gerenciá-la O gerenciador de memória deve: Manter o controle de quais partes da memória estão em uso e quais não estão Alocar memória quando há necessidade por parte dos processos Liberar memória quando os processos terminarem Este capítulo trata do gerenciamento da memória principal do computador Gerenciamento de Memória Requisitos que devem ser satisfeitos Realocação Proteção Compartilhamento Organização lógica Organização Física Realocação Em um sistema multiprogramável a MP é compartilhada entre vários processos O programador não deve se preocupar com o endereço de memória onde o programa será carregado para execução Durante a execução um processo pode sair da MP e ao retornar ser alocado em uma posição diferente O sistema deve ser capaz de traduzir as referências de memória encontradas no código do programa para endereços físicos reais, levando em consideração a localização corrente do programa na MP Realocação Problema quando não existe abstração de memória Realocação Uma solução: Usar uma abstração de memória onde cada processo possua seu espaço de endereçamento definidos por registradores base e limite Cada vez que um processo referencia a memória, o HW acrescenta o valor base ao endereço gerado pelo processo Ex. JMP 28 JMP 16412 32768 16384 Proteção Os processos não podem referenciar áreas de memória de outros processos sem permissão Todas as referências de memória devem ser verificadas em tempo de execução Na solução que utiliza registradores base e limite o HW deve verificar se o endereço referenciado pelo processo encontra-se no intervalo entre os valores indicados nos registradores Caso a referência esteja fora do intervalo o acesso é abortado Compartilhamento Mecanismos de proteção devem ser flexíveis para permitir que vários processos acessem a mesma área de memória quando necessário Processos que cooperam em alguma tarefa podem ter que compartilhar as mesmas estruturas de dados Organização Lógica Programas são normalmente separados em módulos, que podem ser escritos e compilados separadamente Se o HW e o SO lidarem com os programas na forma de módulos, algumas vantagens podem ser obtidas: Módulos podem ser escritos e compilados independentemente e as referências de um módulo pra outro podem ser resolvidas durante a execução Graus diferentes de proteção podem ser atribuídos aos módulos Compartilhamento de módulos, com a vantagem de ser definido pelo usuário Organização Física A memória é organizada como uma hierarquia O fluxo de informação entre a memória principal e secundária é um ponto de grande importância no desenvolvimento do sistema gerenciador de memória Se um programa precisa de mais memória do que o disponível na MP, a a memória secundária deve ser utilizada Os módulos do programa devem ser trazidos e tirados da MP quando necessário Este gerenciamento deverá ser feito de forma transparente pelo SO Gerenciamento de Memória O esquema mais simples: Alocação Contígua Simples A memória é dividida em apenas duas partes: uma para o SO e outra para o programa do usuário Memória Principal Sistema Operacional Área para programa Registrador Alocação Contígua Simples Esta organização é fácil de implementar, porém, não permite a utilização eficiente do processador e da memória Apenas um programa pode estar residente na memória Caso o programa do usuário não preencha a memória totalmente, existirá um espaço sem utilização A princípio, os programas do usuário eram limitados pelo tamanho da memória principal disponível A solução foi dividir o programa em módulos que pudessem ser executados independentemente, utilizando uma mesma área de memória (overlay) Overlay Suponha um programa com módulo principal, de cadastramento e de impressão 4 Kb 3 Kb Módulo Principal Impressão 2 Kb Cadastramento Os módulos de cadastramento e de impressão são independentes O tamanho da memória é insuficiente para armazenar todo o programa O módulo principal deve permanecer na memória por toda a execução A técnica de overlay utiliza uma área de memória comum para os módulos de impressão e cadastramento Overlay Cada vez que o módulo de cadastramento ou impressão for referenciado pelo módulo principal este deve ser carregado na memória principal Memória Principal A área de overlay terá o tamanho do maior módulo Permite ao programador expandir os limites da MP A utilização desta técnica exige cuidado: deve-se evitar a transferência excessiva entre módulos 2 Kb Sistema Operacional Cadastramento 3 Kb Módulo principal 4 Kb 4 Kb Área de overlay 1 Kb Área livre Impressão 2 Kb Área não utilizada 2 Kb Gerenciamento de Memória Com a multiprogramação a memória foi dividida em várias partes Alocação Particionada Alocação Estática Partições de tamanhos idênticos Partições de tamanhos distintos Alocação Dinâmica Alocação Particionada Estática Nos primeiros sistemas a memória foi dividida em tamanhos fixos Operating system 8M Operating system 8M 2M 8M 4M 6M O tamanho das partições era estabelecido na fase de inicialização do sistema 8M 8M 8M 8M 8M Se fosse necessária a alteração do tamanho da partição, o sistema deveria ser reconfigurado e reinicializado 8M 12M 8M 16M 8M (a) Equal-size partitions Tamanho Idêntico (b) Unequal-size partitions Tamanho Variável Alocação Particionada Estática Partições de tamanho idêntico Processos menores que o tamanho da partição podem ser carregados em qualquer partição disponível Duas dificuldades: 1. Se um programa for muito grande para ser colocado em uma partição, deve ser usada a técnica de overlay 2. Caso um programa seja pequeno demais, ele ainda assim ocupará uma partição inteira O fenômeno, no qual ocorre desperdício na utilização do espaço de uma partição é chamado: fragmentação interna Alocação Particionada Estática As duas dificuldades podem ser minimizadas (porém não solucionadas) usando partições de tamanho variável Partições de tamanho variável Programas maiores podem ser alocados em partições maiores, sem a necessidade de usar a técnica de overlay Programas menores podem ser alocados nas partições menores, diminuindo a fragmentação interna Deve ser usada uma estratégia para escolha da partição Alocação Particionada Estática Partições de tamanho variável Existem duas possibilidades para associar processos às partições: Usar uma fila de processos para cada partição Associa os processos a fila da menor partição que o comporte Podem existir partições ociosas e outras partições com a fila cheia Utilizar uma fila única O processo é alocado na partição disponível que produzir menor fragmentação interna Alocação Particionada Estática Operating system New processes Operating system New processes (a) One process queue per partition (b) Single queue Alocação Particionada Estática Exemplo de alocação de processos em partições de tamanho variável Memória Principal Tabela de partições Partição Tamanho 1 2 Kb 2 5 Kb 3 8 Kb Sistema Operacional Programas a serem executados: E D C B A 3 Kb 6 Kb 1 Kb 4 Kb 2 Kb Partição 1 2 Kb Partição 2 5 Kb Partição 3 8 Kb Alocação Particionada Estática Memória Principal Sistema Operacional C A 1 Kb 2 Kb E B 3 Kb 4 Kb Partição 1 2 Kb Partição 2 5 Kb Memória Principal Sistema Operacional D Partição 3 8 Kb Programa C 2 Kb Programa A 5 Kb Programa B 8 Kb 6 Kb D E 6 Kb 3 Kb (a) Esquema com múltiplas filas (b) Esquema com fila única Alocação Particionada Estática A alocação particionada estática é um método simples que possui baixo overhead e requer mínimo trabalho do sistema operacional Porém, existem algumas desvantagens: O grau de paralelismo é determinado pelo número de partições que são criadas no momento da inicialização do sistema Processos pequenos utilizam a memória de forma ineficiente Existe fragmentação interna Uma alternativa é o particionamento dinâmico Neste caso o número de partições e os seus tamanhos são variáveis Alocação Particionada Dinâmica Quando um processo é trazido para a memória, será alocado o espaço de memória que ele precisar A fragmentação neste caso aparece quando os programas vão terminando a sua execução, e deixam espaços cada vez menores na memória Este espaço será definido como a partição do programa Fragmentação Externa Uma solução para o problema da fragmentação externa é a compactação M07_STAL6329_06_SE_C07.QXD 2/21/08 9:30 PM Page 320 Alocação Particionada Dinâmica Exemplo Operating system 8M Operating system Process 1 Operating system 20M 56M Operating system Process 1 20M Process 1 20M Process 2 14M Process 2 14M Process 3 18M 36M 22M 4M (a) (b) (c) (d) Operating system Operating system Operating system Operating system Process 1 20M Process 1 20M 20M Process 2 14M 6M 14M Process 4 8M Process 4 6M Process 3 18M Process 3 4M (e) 18M Process 4 6M Process 3 4M (f) 8M 18M 6M Process 3 4M (g) 8M 18M 4M (h) Estratégias de Escolha de Partição A compactação é um procedimento custoso Assim, devem ser usadas estratégias adequadas para escolha de partição Sempre que um processo for trazido para a memória e existir mais de um bloco livre onde o processo possa ser alocado, então o SO deve decidir qual bloco livre será escolhido O objetivo é diminuir a fragmentação O Sistema possuirá uma lista com todas as áreas livres disponíveis, com o endereço e o tamanho de cada uma delas As seguintes estratégias são consideradas: Best Fit, First Fit e Worst Fit Estratégias de Escolha de Partição First Fit: Escolhe o primeiro bloco livre de tamanho suficiente para caber o programa Neste algoritmo a lista de blocos livres é ordenada por endereços Baixa complexidade Memória Principal Sistema Operacional Sistema Operacional Programa F 4 Kb Área livre Programa C First Fit Programa C F 1 Kb 5 Kb Programa A 3 Kb Programa A 3 Kb Estratégias de Escolha de Partição Best Fit: Escolhe o melhor bloco livre, ou seja, aquele em que o programa deixa o menor espaço sem utilização O problema é que a tendência é deixar cada vez mais a memória com pequenos blocos livres não contíguos, aumentando a fragmentação Memória Principal Mais custosa Sistema Operacional Sistema Operacional 4 Kb Programa C Best Fit Programa C F 1 Kb 5 Kb Programa A Programa A Programa F 3 Kb Área livre 2 Kb Estratégias de Escolha de Partição Worst Fit: Escolhe o pior bloco livre, ou seja, aquele em que o programa deixa maior espaço sem utilização. A ideia é deixar espaços maiores para que outros programas possam Memória Principal utilizá-los Sistema Operacional Sistema Operacional Programa C Programa C Programa F 4 Kb Worst Fit F 1 Kb 5 Kb Área livre Programa A 3 Kb Programa A 4 Kb Gerenciamento de espaço livre As áreas livres de memória devem ser gerenciadas Mapa de bits Listas Encadeadas Gerenciamento de espaço livre Mapa de bits É uma maneira simples de gerenciar espaços de memória A memória é dividida em unidades de alocação Quanto menor a unidade de alocação maior será o mapa de bits Se a unidade de alocação for muito grande, o mapa de bits será menor, porém a memória poderá ser desperdiçada na última unidade de alocação O problema desta técnica é que a operação de busca por uma sequência de k unidades de alocação livres pode ser muito lenta Gerenciamento de espaço livre Lista encadeada Mantém uma lista dos segmentos de memória alocados e livres, ordenados crescentemente Cada elemento da lista especifica Um segmento de memória alocado (P) ou livre (L) O endereço que inicia o segmento O comprimento do segmento O endereço do próximo Gerenciamento de espaço livre Atualização da lista após o término de um processo X Swapping Mesmo com aumento da eficiência da multiprogramação e da gerência de memória, muitas vezes um programa não poderá ser executado por falta de espaço na memória A técnica de swapping surge para tentar resolver este problema Quando um programa espera por um espaço de memória livre: O SO deve escolher um processo para ser tirado da MP e levado para o disco (swap out) Quando este processo precisar retornar para memória principal (swap in) ele pode continuar a execução como se nata tivesse acontecido Swapping Memória Principal Sistema Operacional Programa A Programa B H Programa E Swap out Programa G B Memória Principal Sistema Operacional Programa A Programa H Programa E Swap in B Arquivo de Swap Área Livre Swapping Swapping Para a técnica de swapping é essencial a existência da realocação dinâmica É usado o registrador de realocação que guardará o endereço inicial da região de memória onde o programa será alocado Quando ocorre uma referência a algum endereço, seu valor será somado ao conteúdo do registrador Registrador de Relocação Endereço incial da partição Instrução Código de operação Endereço de memória Endereço Memória Virtual É uma técnica sofisticada de gerência de memória As memórias principal e secundária são combinadas, dando ao usuário a impressão de existir uma memória muito maior do que a MP O conceito da memória virtual está em desvincular o endereçamento feito pelo programa dos endereços físicos da MP Assim, o programa não fica limitado ao tamanho da memória física disponível Memória Virtual Anteriormente, vimos que o uso de registradores base e limite eram usados para criar uma abstração de espaços de endereçamento Porque usar a memória virtual? Ainda existe um outro problema: gerenciar programas que utilizam quantidades excessivas de memória Solução: usar a técnica de overlay? A técnica de overlay exige que o programador se preocupe em dividir o seu código de forma que os módulos possam ser trazidos para a memória de forma independente → trabalho árduo e lento A ideia é atribuir esta tarefa ao sistema Memória Virtual O conceito de memória virtual se aproxima muito da ideia de um vetor, existente nas linguagens de alto nível Quando é feita referência a um componente do vetor, não há preocupação de qual posição de memória aquele dado está O compilador se encarrega de gerar instruções que implementem este mecanismo, tornando-o transparente para o programador A memória virtual utiliza uma abstração semelhante, só que em relação aos endereços dos programas e seus dados Endereços reais e endereços virtuais Memória Virtual Um programa em um ambiente de memória virtual faz referência a endereços virtuais No momento da execução de uma instrução, o endereço virtual é traduzido para um endereço físico Esta tradução é chamada mapeamento O conjunto de endereços virtuais que um processo pode endereçar é chamado de espaço de endereçamento virtual Analogamente o conjunto de endereços reais é chamado espaço de endereçamento real Memória Virtual O espaço de endereçamento virtual não possui relação direta com o espaço de endereçamento real Espaço de endereçamento virtual Endereço virtual 0 Endereço virtual 1 Endereço virtual 2 Endereço virtual 3 Endereço virtual 4 Endereço virtual 5 . . . Espaço de endereçamento real Endereço real 0 Endereço real 1 Endereço real 2 Endereço real 3 . . . Endereço real R Endereço virtual V Um programa pode fazer referência a endereços virtuais que estejam fora dos limites do espaço real Memória Virtual Quando o programa é executado só uma parte do código fica residente na memória principal O restante do código fica na memória secundária até o momento em que for referenciado Assim, o sistema operacional utiliza a memória secundária como uma extensão da MP O sistema operacional deve ser responsável por Trazer parte do código referenciado que esteja na MP Escolher qual parte do código residente na MP ira sofrer um swap out Memória Virtual Duas técnicas que utilizam memória virtual serão estudadas: Paginação O espaço de endereçamento virtual e real são divididos em blocos chamados páginas O programa é dividido em blocos de tamanho fixo: páginas Segmentação Os programas são divididos em segmentos de tamanhos variáveis A divisão é feita levando em consideração a lógica do programa