Gerência de Memória Prof.: Edwilian Maia Nome: Paulo Henrique Maia Mat: 19992021733 A memória leitura só: ROM , PROM , EPROM , EEPROM leitura e escrita: RAM, RAM com bateria O boot SunOS Release 5.4 Version generic [UNIX(R) System V Release 4.0] Copyright (c) 1983-1994, Sun Microsystems, Inc. pac: enabled cpu0: TI,TMS390S10 (mid 0 impl 0x4 ver 0x1 clock 50 MHz) mem = 49152K (0x3000000) avail mem = 42496000 Ethernet address = 0:0:3b:80:38:48 root nexus = SUNW,Axil-220 ... Gerencia de memória lado sistema: gerenciar toda a memória (central, de massa) para todos os usuários. lado usuário: ter a impressão de usar uma memória (virtual) independente de seu suporte. os problemas são : realizar a correspondência endereço virtual e endereço físico realizar a gerência de memória física realizar o compartilhamento das informações entre vários usuários realizar a proteção mútua das informações Organização da memória INCLUDEPICTURE "http://www.lasid.ufba.br/~jch/sys_operationnel/memoire/image/mem_lin_seg.gif" \* MERGEFORMATINET Segmentação hardware ou lógica. partições fixas = muita memória perdida Como instalar um processo na memória a tabela da memória: exemplo no sistema operacional tempo real os9: Super: mdir -e Addr Size Owner Perm Type -------- -------- ----------- ---- ---00004000 26570 0.0 0555 Sys 0000a7ca 386 0.0 0555 Sys 0000a94c 146 0.720 0555 Prog 0000a9de 334 0.720 0555 Sys 0000ab2c 308 0.720 0555 Sys 0000ac60 430 0.720 0555 Subr 0000ae0e 1930 0.0 0555 Fman 0000b598 2338 0.720 0555 Driv 0000beba 126 0.0 0555 Desc 0000bf38 124 0.0 0555 Desc 0000bfb4 124 0.0 0555 Desc 0000c030 124 0.0 0555 Desc 0000c0ac 172 0.0 0555 Driv 0000c158 118 0.0 0555 Desc Revs Ed # Lnk Module name ---- ----- ----- -------------a000 66 2 kernel 8000 20 0 init 8000 1 0 itvme a000 10 1 syscache a000 7 1 tk120 8020 1 0 rtclock a000 29 18 scf a001 16 18 sc68681_20 8000 4 6 term 8000 4 6 t1 8000 4 4 t2 8000 4 2 t3 a000 1 0 null 8000 2 0 nil 0000c1ce 0000caac 0000cb12 0000e4d2 0000e77c 0000f0b2 000104c0 00010542 000105c4 00010648 000106ca 00076e40 00078260 00082500 00086830 00087510 000ea8c0 000ec060 000ecb60 000edac0 000ee760 000f3af0 000f44d0 000f4e20 000f6f00 Super: 2270 102 6592 682 2358 5134 130 130 132 130 386 5138 6044 8192 3292 3220 5684 2802 3928 3220 20192 2528 2370 3248 18960 0.0 0.0 0.0 0.0 0.720 0.720 0.0 0.0 0.0 0.922 0.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 0555 Fman Desc Fman Driv Driv Driv Desc Desc Desc Desc Prog Prog Prog Prog Prog Prog Prog Prog Prog Trap Trap Prog Prog Prog Prog a000 8000 a000 a000 8002 8002 8000 8000 8000 8003 0000 c001 c001 c001 c001 c001 c001 c001 c001 c001 c008 c001 c001 c001 c001 32 2 65 12 2 10 5 5 11 5 4 18 22 16 15 13 25 16 21 6 6 14 13 14 48 0 0 4 1 1 3 1 0 1 3 1 1 1 4 0 0 0 0 0 1 6 0 0 0 2 pipeman pipe rbf ram rb190f rb190s d0 s0 dd h0 sysgo mdir login tsmon pd unlink copy date setime math cio makdir iniz load shell O problema do endereçamento absoluto dentro de programa ou o problema da relocação para realizar a relocação durante a carga do programa, o ligador deve incluir no código binário um conjunto de informações sobre quais palavras são endereços relocáveis e quais não devem ser relocados (constantes, ...) O problema da proteção dos dados na memória solução hardware registradores especiais: base e limite. quando um processo é escolhido para rodar, o registrador base é carregado com o endereço que marca o início de sua partição e o registrador limite é carregado com o tamanho da partição. Métodos de gerência de memória com mapeamento de bits: 1 bit = uma unidade (pequena) de alocação da memória. Problema: procura excessivamente lenta => método raramente usados com listas ligadas Problema: a reconstrução de buracos Política de alocação da memória: primeira zona livre (first fit) - ter uma lista circular para não ter sempre a mesma zona escolhida melhor ajuste (best fit) - problema com a multiplicação de zonas de pequeno tamanho maior resíduo, resto (worst fit) reserva de blocos de tamanhos diferentes (95% em 10 tipos de tamanhos) com o sistema Buddy ou alocação por subdivisão (Knuth 1973, Knowlton 1965): alocação muito rápido (cálculos binários - dividir por 2), mas não eficiente para a utilização da memória (instalar 35k dentro um bloco de 64k => 29k peridos) binária : Si+1 = 2 Si fibonacci : Si+1 = Si + Si-1 quando falta bloco de tamanho Si nós subdividimos um bloco de tamanho Si+1 1 - requisição de 70k para um processo P1 2 - requisição de 25k para um processo P2 3 - requisição de 80k para um processo P3 4 - devolução do espaço do processo P1 5 - devolução do espaço do processo P2 a recuperação de buracos ter uma lista para os processos e uma lista para os buracos. compactação de memória (muito tempo => hardware especial 40 M bytes /segundo) gerência de buracos com as listas ligadas O swapping Nos sistemas compartilhados tem mais usuários que memória suficiente de forma que os processos excedentes devem ser mantidos em disco. Se um processo é bloqueado, ele pode ser gravado no disco. Em alguns sistemas quando o processo é criado, o seu espaço de swap é alocado automaticamente no disco (alocar um número inteiro de blocos do disco). A memória virtual Antes, um programa maior que a quantidade de memória disponível será dividido em módulos denominados overlays. O everlay 0 deveria começar rodando. a memória virtual (Fortheringham - 1961): o tamanho do código, dos dados e da pilha poderia exceder o da memória real disponível A paginação Quando tem uma instrução do tipo: move.l d0,1000, o endereço 1000 é chamado endereço virtual e é encaminhado à unidade de gerência de memória (MMU) que vai mapear os endereços virtuais em endereços reais. Exemplo: seja um computador que pode gerar endereços virtuais de 16 bits (de 0 até 64K) com uma memória de 32K. O espaço de endereçamento virtual é em unidades denominadas páginas, as unidades correspondentes na memória física são as molduras de página (page frame). As páginas e as molduras de página são sempre do mesmo tamanho (4K no exemplo) Na execução da instrução move.l d0,1000 o endereço virtual 1000 é enviado a MMU. Esta conclui que este endereço virtual cai na página 0 que de acordo com seu processo de mapeamento está na moldura de página 2. Ela então transforma o endereço 1000 em 9192 (8192+1000). X significa que a página não é mapeada. Se tiver uma instrução do tipo: move.l d0,32780 acontece um trap denominado falta de página que vai pegar a moldura de página menos usada e a copiar de volta para o disco. Depois ele busca a página referenciada e a copia na moldura que acabou de ser liberada, e modifica o mapa e reexecuta a instrução causadora do trap. funcionamento na MMU o número da página é usado como índice da tabela de páginas, levando ao número da moldura de página correspondente a esta página virtual. As tabelas de páginas O mapeamento de endereços virtuais em físicos é feito a partir de um endereço virtual em 2 partes: o número de página virtual e o do deslocamento. Cada processo deve ter sua própria tabela de paginas. Quando um processo é (re)inicializado o sistema operacional carrega os registradores da MMU com a tabela de páginas do processo (vem de uma copia mantida na memória principal). Problema: os computadores modernos usam um espaço virtual de 32 bits ou seja 1 milhão de páginas de 4K. => tabela de 1M de entradas. tabelas de página multinível Para evitar a necessidade de manter tabelas de página na memória durante todo o tempo. Entrada típica de uma tabela de páginas bit de presença/ausência ou bit de residência. 0=> trap. bit de proteção: 0 leitura/escrita, 1= leitura. bit de modificação (M): 1=processo escreve na página; 0= caso contrário, não precisa então ser copiada de volta no disco. bit de referência (R): igual a 1 toda vez que a página em questão for referenciada para leitura ou escrita. Esse bit ajuda o SO na escolha da página que deve sair. o mode cache pode ser disligado. A memória associativa A tabela de páginas é mantida na memória => enorme impacto na performance. memória associativa ou ( buffer de tradução dinâmica) para fazer o mapeamento de endereços virtuais em reais na MMU sem ter que acessar a memória principal... para acelerar o processo de paginação. Nesse exemplo, o processo está em um loop que referencia constantemente as páginas 19, 20 e 21. Os dados correspondentes em uso, estão nas páginas 129 e 130. A pilha está nas páginas 860 e 861. Quando o endereço virtual é apresentado a MMU o hardware verifica se sua página esta na memória associativa. Se não está uma nova linha é copiada na memória associativa a partir da tabela na memória. A taxa de acerto (hit ratio) = referências à memória que podem ser satisfeitas a partir da memória associativa. Exemplo: 100ns para acessar a tabela de páginas e 20 ns para acessar a tabela associativa, com um taxa de acerto de 90% o tempo médio de acesso é (0,90 x 20) + (0,10 x 100) = 28 ns. Algoritmos de substituição de páginas Quando ocorre falta de página, o sistema operacional deve escolher uma página a ser removida para dar lugar à que deve ser gravada na memória real. O algoritmo da página não usada recentemente (NUR): bit R e M são usados. Periodicamente, o bit R é zerado. NUR remove uma página que tenha sido modificada e não referenciada entre duas interrupções;es de tempo (20ms) O algoritmo FIFO: o problema é que nó não podemos evitar que páginas muito usadas sejam descartadas. O algoritmo de segunda chance: é o algoritmo FIFO mas examinando o bit R da página mais antiga. Se ele for 0, alé de velha, não tem sido referenciada, de modo que ela deve ser removida imediatamente para dar lugar à outra. Se R igual a 1, este bit é zerado, a página é colocada no fim da fila de páginas. O algoritmo do relógio: idem que FIFO mas implementação diferente. Se R for 0, ela sai da memória e o ponteiro é atualizado para apontar para a próxima posição. O algoritmo da página usada há mais tempo (LRU): páginas que foram muito usadas pelas últimas instruções executadas continuarão sendo usadas pelas próximas instruções. = remover a página que foi usada há mais tempo. Problema: implementação carra (lista de todas as páginas atualizada a cada referência de memória). Problemas de implementação da memória virtual o backup de instrução (memorisar o PC, botar a instrução na pilha) o bloqueio de páginas na memória (de E/S) as páginas compartilhadas (dentro os S.O. compartilhados os usuários rodam mesmos programas) a memória secundária: a alocação de espaço em disco é reservada no dico no swap. Quando um processo for criado, um pedaço da área de swap do tamanho do processo é reservado para ele. Quando o processo termina, seu espaço é liberado. Na tabela de processos, é mantido o endereço da área de swap associado a cada processo. paging daemons: roda periodicamente para inspecionar o estado de ocupação da memória, Se existirem poucas molduras livres esse demão seleciona algumas páginas para serem removidas, usando para isso o algoritmo de substituição de páginas. A segmentação Equipar a máquina com vários espaços de endereçamento completamente independentes chamados segmentos. O tamanho de um segmento pode variar durante a execução (exemplo a pilha). Para especificar um endereço em uma memória segmentada, o programa precisa gerar um endereço com duas partes, um número de segmento et um endereço dentro do segmento. vantagens: um segmento armazena informações ou objetos de tipo único. se cada procedimento ocupa um segmento separado (com 0 de endereço inicial) uma chamada = chamada ao segmento. se o procedimento no segmento e modificado e recompilado => nenhum outro procedimento precisa ser modificado => facilita a implantação de biblioteca compartilhada segmentos diferentes podem vir ter diferentes tipos de proteção (segmento de pilha RW mas não X) Consideração O programador precisa estar informado de que esta técnica vai ser usada? Quantos espaços de endereçamento existem nesta técnica? O espaço total de endereço pode exceder o tamanho da memória física? É possível distinguir procedimentos de dados e protegê-los separadamente? As tabelas de tamanho variável podem ser acomodadas sem problemas? O compartilhamento de procedimentos entre usuários é facilitado? Por que esta técnica foi inventada? Paginação Segmentação Não Sim 1 Muitos Sim Sim Não Sim Não Sim Não Sim Para obter espaço de endereçamento linear maior sem ter que ampliar a memória física Para permitir que programas e dados possam ser quebrados em espaços de endereçamento logicamente independentes e para auxiliar nas questões envolvendo compartilhamento e proteção A implementação da segmentação pura A implementação da segmentação difere da paginação em um aspecto essencial: as páginas têm tamanho fixo e os segmentos não. Cada processo tem uma tabela de segmentos, com um descritor por segmento. Esse descritor de segmento contém uma indicação para saber se o segmento está ou não na memória principal, o tamanho do segmento, os bits de proteção. Quando há uma referência à memória, o seguinte algoritmo é executado (em MULTICS): O número do segmento é usado para encontrar o descritor de segmento. É feita uma verificação para ver se a tabela de páginas deste segmento está na memória, sendo localizada caso esteja. Se não estiver, haverá a geração de uma falta. Caso haja a tentativa de violação de proteção, ocorre um trap. É consultada a entrada da tabela de páginas para a página requerida. Se tal página não estiver na memória, ocorrerá uma falta. Se estiver, o endereço do início dela na memória é extraído da entrada da tabela de páginas. O valor do deslocamento é somado ao valor da origem da página para obtenção do endereço real. A leitura ou a escritura são finalmente executadas.