Gerenciamento de Memória - Capítulo 7 Sistemas Operacionais Prof. Dr. José Carlos Becceneri Luciana Sêda Cardoso Sumário Definição Requisitos Técnicas de Gerenciamento de Memória Gerenciamento de Memória Principal operação – trazer programas para dentro da memória principal para ser executados pelo processador. Dividir dinamicamente a parte “User” da memória principal de forma que acomode vários processos. Alocar a memória de forma eficiente para empacotar tantos processos na memória quanto possível para evitar que o processador fique ocioso. Deve ser capaz de rodar um programa em que seu tamanho seja maior que o disponível pela memória real. Requisitos Relocação Proteção Compartilhamento Organização lógica Organização física Requisito - Relocação Capacidade de mover um programa de uma região da memória principal para uma outra sem invalidar as referencias de memória dentro do programa; O programador não sabe onde o programa é colocado na memória quando ele é executado O hardware do processador e o SO devem ser capazes de traduzir os endereços de referencia de memória no código do programa para o endereço físico da memória. Técnica de Endereçamento -> Imagem do Processo Requisito - Proteção Cada processo deve ser protegido contra interferências não desejáveis de outros processos de forma acidental ou intencional Processos não devem ser capazes de referenciar localizações de memória de outro processo sem permissão; O hardware é responsável por fazer a verificação, caso a violação ocorra, o mesmo deve abortar tais instruções no ponto da execução; O SO não pode prever todas as referencias de memória que o programa fará (custo muito alto). Requisito - Compartilhamento Permitir que vários processos acessem a mesma área de memória principal É vantajoso, que : processos que são executados em um mesmo programa acessem a mesma cópia do programa e Processos que estão cooperando em uma mesma tarefa compartilhem acesso a uma mesma estrutura de dados Deve permitir o compartilhamento sem comprometer o requisito de proteção Requisitos - Organização Lógica Capacidade de manipular com programas e dados do usuário organizado em módulos Memória -> seqüências de Bytes e palavras Programas -> módulos Vantagens: Módulo podem ser escritos e compilados independentemente, as referencias de um módulo para o outro são resolvidas em tempo de execução; Com um overhead adicional, diferentes graus de proteção (read only, execute only) podem ser dados para diferentes módulos É possível introduzir mecanismo de compartilhamento entre módulos Requisito – Organização Física Organização da memória do computador: Dois níveis: Memória principal -> mais rápida, volátil e custo alto Memória secundária -> lenta, armazenamento permanente e barata Capacidade de mover informações entre os 2 níveis de memória Técnicas de Gerenciamento de Memória Partição de memória Partição fixa Partição dinâmica Sistema Buddy Paginação simples Segmentação simples Paginação de Memória Virtual Segmentação de Memória Virtual Partição Fixa Memória principal é dividida dentro de um no. de partições estáticas (tamanho igual ou diferente). O processo é carregado dentro de uma partição de tamanho = ou >. Ponto forte: Simples de implementar, pouco overhead no sistema Ponto fraco: Fragmentação interna -> Uso ineficiente da memória principal. Qualquer programa, não importando o quanto pequeno é, ocupa uma partição na memória. Algoritmo de Locação Partição de tamanho igual: todas as partições com o mesmo tamanho, não importa qual partição é usada; Partição de tamanho diferente: Dois caminhos: Uma fila para cada partição -> Processos são atribuídos de forma a minimizar o desperdício de memória na partição Uma única fila para todas as partições ->Os processos são atribuídos a partição de menor tamanho disponível no momento. Partição Fixa (cont.) Desvantagens: No. de partições especificadas no tempo de geração do sistema -> limita o no. de processos ativos dentro do sistema Tamanho das partições são setadas no tempo de geração do sistema -> jobs pequenos utilizam os espaços das partições de forma ineficiente Usada com sucesso: Mainframe da IBM e Os/MFT(Multiporgramação com no. fixo de tarefa) Partição Dinâmica Partições são criadas dinamicamente, de forma que cada processo é alocado dentro da partição do mesmo tamanho do processo Ponto forte: Não tem fragmentação interna e usa de forma mais eficiente a memória Ponto fraco: Uso ineficiente do processador por necessitar de compactação para solucionar a fragmentação externa (memória vai ficando cheia de vários buracos) Usada com sucesso: Mainframe da IBM e Os/MFT(Multiporgramação com no. variável de tarefa) Algoritmo de Locação O SO deve decidir qual bloco livre a ser alocado ao processo de forma eficiente. Três algoritmos podem ser usados: First-fit : Procura dentro da memória a partir o inicio e escolhe o primeiro bloco que é grande o suficiente para o processo a ser alocado; Next-fit: Inicia a procura a partir do local onde foi feito a ultima locação e escolhe o bloco que é grande o suficiente para o processo a ser alocado Best-fit: Escolhe o bloco que mais se aproxima do tamanho requerido; Qual deles é o melhor? First-fit : Mais rápido e o melhor Ele gera no inicio da memória pequenas partições livres que necessitam ser pesquisadas a cada passo subseqüente do first-fit Next-fit: Freqüentemente aloca blocos livres no fim da memória Como resultado, blocos grandes de memória são quebrados rapidamente em blocos menores Compactação mais freqüente é requerida para obter grandes blocos no fim da memória Best-fit: Tem a pior performance Procura pelo menor bloco que satisfaça o requisito Como resultado, a memória principal é rapidamente quebrada em blocos muito pequenos que não podem satisfazer um pedido de alocação, exigindo assim uma compactação freqüente Sistema Buddy O espaço disponível total da memória é tratado como um único bloco de 2U (bloco de maior tamanho que pode ser alocado) Se um pedido de tamanho s é tal que 2U-1 < s ≤ 2U, Então: o bloco completo 2U é alocado Senão: O bloco é divido em 2 “buddies” iguais. A divisão continua até que o bloco encontrado seja > ou = ao s requerido. Uma forma modificada deste sistema é usada para alocação de memória no kernel do UNIX. Também tem sido usado em aplicações de sistemas paralelos (alocação e liberação de programas paralelos). Paginação Simples A memória é divida em pequenos pedaços de tamanho igual chamados frames. Cada processo é dividido em pequenos pedaços de tamanho igual ao do frame chamado pages. Quando um processo é carregado na memória, todas as suas páginas são carregadas dentro dos frames disponíveis, e uma tabela de página é setada. Os frames usados não precisam estar em seqüência. Ponto forte: Não tem fragmentação externa Ponto fraco: tem uma pequena quantidade de fragmentação interna. Como o SO controla as páginas alocadas e os frames livres? O SO usa: Conceito de endereço lógico; Mantém ma tabela de frames livres ; Mantém uma tabela de pagina para cada processo, contendo a localização do frame para cada pagina do processo. Dentro do programa, cada endereço lógico consiste: um número de pagina + um offset da pagina Exemplo: Endereço lógico= Page 1 e offset 478 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 Tradução do endereço lógico para o endereço físico é feito pelo hardware do processador , da seguinte forma: 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 Endereço lógico Tabela de Página 0 0 0 0 1 0 1 10 0 0 1 1 0 20 1 1 0 0 1 Endereço físico 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 Segmentação Simples Cada processo é dividido em um número de segmentos de tamanho desigual (limitado pelo tamanho máximo). Um processo é carregado na memória, todos os seus segmentos são carregados dentro de partições dinâmicas que não necessitam ser continuas. Ponto forte: Não tem fragmentação interna Ponto fraco: Tem uma pequena quantidade de fragmentação externa Exemplo de Segmentação 1400 2400 3200 4300 4700 Segmento 0 Sub-rotina Segmento 3 pilha Segmento2 Programa principal Segmento 4 Tabela de símbolos Segmento 1 Variáveis Globais 5700 6300 6700 Como o SO controla os segmentos alocados e blocos livres? O SO mantém: Conceito de endereço lógico mantém uma tabela de blocos livres ; mantém uma tabela de segmentos para cada processo, contendo a endereço inicial na memória principal (base) + o tamanho do segmento (limite). Exemplo de uma Tabela de Segmento 0 1 2 3 4 Base 1400 6300 4300 3200 4700 Limite 1000 400 400 1100 1000 Tradução do endereço lógico para o endereço físico é feito pelo hardware do processador , da seguinte forma: Segmento Offset 0 0 0 1 0 0 10 1 1 1 1 0 0 0 0 Endereço lógico Tabela de Segmento 0 001011101110 1 011110011110 Limite Endereço físico 0000010000000000 0010000000100000 Base + 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 Memória Virtual - Paginação É igual a paginação simples, exceto que não necessita ser carregada todas as páginas do processo. Paginas não residentes que são necessárias, são trazidas mais tarde automaticamente. Ponto forte: Não tem fragmentação externa; Alto grau de multiprogramação; Espaço para grandes processos virtuais. Ponto fraco: Overhead no gerenciamento complexo de memória. Memória Virtual Segmentação É igual a segmentação simples, exceto que não necessita ser carregada todas os segmentos do processo. Segmentos não residentes que são necessárias, são trazidas mais tarde automaticamente. Ponto forte: Não tem fragmentação interna; Alto grau de multiprogramação; Espaço para grandes processos virtuais; Suporte de proteção e compartilhamento. Ponto fraco: Overhead no gerenciamento complexo de memória.