Gerência de Memória Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Abril, 2016 1 / 45 Sumário 1 Introdução 2 Espaços de endereçamento 3 Realocação estática e dinâmica 4 Alocação de memória 2 / 45 Introdução 1 Introdução 2 Espaços de endereçamento 3 Realocação estática e dinâmica 4 Alocação de memória 3 / 45 Introdução Gargalo de Von Neumann Figura 1.1: Arquitetura de Von Neumann 4 / 45 Introdução Denição Gerenciamento de memória consiste em manter o controle das partes da memória que estão sendo utilizadas e por quem, decidir que processos serão carregados para a memória quando houver espaço disponível, alocar e desalocar espaço quando necessário. [Dias, 2005] Memória: conjunto de palavras e seus endereços [Favacho, 2009]. 5 / 45 Introdução A memória e sua utilidade O processador só pode armazenar informações nos registradores e na memória; Como a memória é um uxo contínuo de dados, é papel do sistema operacional proteger e organizar as informações armazenadas na memória. Algumas tarefas que o gerenciador de memória do SO deve executar: Manter o controle das partes da memória que estão em uso e das partes que não estão; Alocar espaço para os processos e liberar quando eles terminarem; Alocar memória principal e secundária; Alocar a memória secundária é papel do sistema gerenciador de arquivos. 6 / 45 Espaços de endereçamento 1 Introdução 2 Espaços de endereçamento 3 Realocação estática e dinâmica 4 Alocação de memória 7 / 45 Espaços de endereçamento Proteção O sistema operacional deve manter os processos dos usuários em áreas separadas da memória; Espaço de endereçamento: conjunto de endereços que os processos podem usar para endereçar a memória [Tanenbaum and Machado Filho, 1995]. Proteção: estratégia utilizada para garantir que não haja interferência entre os componentes básicos de um sistema e os programas do usuário [Favacho, 2009]. Espaço do kernel x Espaço do usuário. Figura 2.1: Utilização do endereço virtual de memória [Duarte, 2009] 8 / 45 Espaços de endereçamento Registradores de limite Ideia: mapear endereços mínimos e máximos; O endereço inferior representa o menor endereço alocável disponível. Chamado de registrador base; O endereço superior representa o maior endereço alocável disponível. Chamado de registrador limite. Figura 2.2: Registradores base e registradores limite [Galvin et al., 2013] 9 / 45 Espaços de endereçamento Alocação O valor do registrador base é somado a cada endereço gerado por um processo do usuário; A cada alocação o valor é calculado novamente para garantir que está entre o base e o limite. Figura 2.3: Vericação de limite [Galvin et al., 2013] 10 / 45 Espaços de endereçamento Endereçamento Programas prontos para entrar na CPU formam a la de pronto; Pergunta: em que parte da memória começa a la de pronto? 11 / 45 Espaços de endereçamento Endereçamento Programas prontos para entrar na CPU formam a la de pronto; Pergunta: em que parte da memória começa a la de pronto? O endereço de memória é calculado de maneira diferente em cada estágio do ciclo de vida do programa [Galvin et al., 2013]: Código-fonte utiliza endereços simbólicos; Código compilado vincula os endereços a espaços realocáveis; O linker ou loader vai vincular os endereços realocáveis a endereços físicos; Cada vínculo mapeia um endereço realocável a um endereço físico. 12 / 45 Espaços de endereçamento Fases do endereçamento A vinculação dos endereços de memória ao programa pode acontecer em três diferentes fases [Galvin et al., 2013]: Compilação Se o endereçamento é conhecido (ou xo no código), pode ser gerado um endereço absoluto. Se a posição inicial do programa é alterada é necessário recompilar o código; Carregamento (load) Deve gerar endereços realocáveis se não for conhecido no momento da compilação; Tempo de execução O endereçamento é adiado até o momento da execução se o processo puder se mover de um espaço de endereçamento para outro em tempo de execução. Obs.: É necessário suporte em hardware para mapeamento de endereços (registradores base e limite, por exemplo). 13 / 45 Espaços de endereçamento Fases do endereçamento (gráco) Figura 2.4: Passo a passo do endereçamento [Galvin et al., 2013] 14 / 45 Realocação estática e dinâmica 1 Introdução 2 Espaços de endereçamento 3 Realocação estática e dinâmica 4 Alocação de memória 15 / 45 Realocação estática e dinâmica Endereço lógico e físico O conceito de espaço de endereçamento físico é fundamental no gerenciamento da memória: Endereço lógico Gerado pela CPU. Também conhecido como endereço virtual; Endereço físico Endereço utilizado pela unidade de memória; Espaço de endereçamento lógico conjunto de endereços lógicos gerados pelo programa; Espaço de endereçamento físico conjunto de endereços físicos gerados pelo programa. Os endereços lógico e físico são os mesmos quando se utiliza a estratégia de endereçamento na compilação ou no carregamento; Os endereços lógico e físico diferem quando utiliza-se a estratégia de endereçamento em tempo de execução. 16 / 45 Realocação estática e dinâmica Memory Management Unit MMU Componente físico que mapeia, em tempo de execução, endereços lógicos para endereços físicos; Diferentes métodos para mapear endereços físicos e virtuais: 1 O valor do registrador de realocação é adicionado a cada endereço gerado pelo processo e enviado para a memória. 2 O programa do usuário trabalha somente com endereços virtuais. Intel 80x86 possuía quatro registradores para realocação. O endereçamento em tempo de execução é feito quando o valor da memória é solicitado; O endereço lógico é vinculado ao endereço físico. 17 / 45 Realocação estática e dinâmica Registrador de realocação Figura 3.1: Realocação dinâmica utilizando registrador de realocação [Galvin et al., 2013] 18 / 45 Realocação estática e dinâmica Realocação dinâmica A rotina não é carregada até o momento da execução; Otimização de consumo da memória: rotinas que não são utilizadas não são carregadas na memória; Todas as rotinas são armazenadas na memória secundária (disco) no formato realocável; Não é necessário nenhum tipo de suporte especial do sistema operacional. Implementado no desenho do programa; O sistema operacional pode ajudar fornecendo bibliotecas de realocação dinâmica a serem utilizadas nos programas. 19 / 45 Realocação estática e dinâmica Endereços virtuais Vinculação estática: as bibliotecas do sistema e o código do programa são combinados pelo loader na imagem binária do programa; Vinculação dinâmica: adiada até o tempo da execução; Um pedaço de código chamado stub é utilizado para localizar a biblioteca na memória; O stub substitui a si mesmo pela rotina da biblioteca e a executa; O sistema operacional verica se a rotina está no endereço de memória do processo. Caso não esteja, adiciona; Conhecidas pelo sistema como bibliotecas compartilhadas shared libraries. 20 / 45 Realocação estática e dinâmica Layout do espaço de memória Figura 3.2: Layout do espaço de endereçamento de memória no Linux [Duarte, 2009] 21 / 45 Realocação estática e dinâmica Troca de contexto Em geral nem todos os programas cabem na memória ao mesmo tempo; A entrada e saída de processos pode ser conhecido como troca de contexto; Também há uma tendência dos processos utilizarem mais memória e crescerem ao longo do tempo. Nesse caso é necessário expandir a memória do processo; Um processo só pode crescer até que não invada o espaço do outro; As técnicas de alocação de memória tratam do problema de troca de contexto e expansão de memória nos processos. 22 / 45 Alocação de memória 1 Introdução 2 Espaços de endereçamento 3 Realocação estática e dinâmica 4 Alocação de memória 23 / 45 Alocação de memória Swapping Além da utilização da memória principal, o processo pode ser enviado à uma área de troca na memória secundária (swap); O sistema operacional mantém uma la de pronto considerando os processos que possuem imagem no disco; Quando o processo volta à memória principal, pode ser Figura 4.1: Visão do Swap carregado no mesmo endereço [Galvin et al., 2013] físico. Depende da implementação. 24 / 45 Alocação de memória Troca de contexto e swap O processo pode ser enviado à área de troca (swap out) para depois ser recuperado e carregado na memória principal (swap in); Considere um processo de 100MB sendo enviado para a área de swap em um disco com taxa de transferência de 50MB/s: Tempo de swap out: 2000 ms; Mais swap in no mesmo processo; Tempo total de troca de contexto: 4000 ms ou 4s. Outros problemas: Operação de I/O pendente: não pode realizar o swap out, ou os dados seriam enviados para o processo errado; Transfere primeiro para o espaço do kernel, depois para o disco: double buering. Adiciona ainda mais tempo de processamento. Utilizar a área de swap é sempre a pior opção, mas pode ser a única. 25 / 45 Alocação de memória Múltiplas partições Cada partição deve conter um processo; O número máximo de processos está limitado ao número de partições; Quando uma partição está livre, um processo é selecionado e carregado da la de pronto; Ao m da execução, a partição ca livre para o próximo processo; Buraco ou hole: partição livre. Figura 4.2: Utilização de múltiplas partições [Galvin et al., 2013] 26 / 45 Alocação de memória Partições xas Partições de tamanho xo; Sistema operacional guarda uma tabela de partições, indicando partes livres e ocupadas; Havendo mais processos que partições, uma ou mais las são formadas. Figura 4.3: Partições xas [Favacho, 2009] 27 / 45 Alocação de memória Fragmentação interna Problemas do particionamento de tamanho xo: Utilização pouco eciente da memória; Diculdade em determinar o tamanho exato do processo: Partições pequenas demais não cabem o processo; Partições grandes demais provocam a fragmentação interna. Figura 4.4: Fragmentação interna em partições xas [Favacho, 2009] 28 / 45 Alocação de memória Partições variáveis Figura 4.5: Alocação com partições variáveis [Favacho, 2009] 29 / 45 Alocação de memória Melhor utilização da memória Melhor distribuição da memória; Processo D tem que esperar pelo espaço disponível. Figura 4.6: Melhor utilização da memória com partição variável [Favacho, 2009] 30 / 45 Alocação de memória Fragmentação externa O processo D, que tem 5K, não tem partição disponível; Como o processo ainda não está na memória, chamamos fragmentação externa. Figura 4.7: Fragmentação externa com partição variável [Favacho, 2009] 31 / 45 Alocação de memória Soluções para fragmentação Coalescência Unir espaços adjacentes produzindo um espaço único de tamanho maior; Compactação Relocação dos processos para tornar todas as partições contíguas. As referências que cada instrução faz dependem da posição do processo na memória; Se o processo muda, as referências cam incorretas; Só é possível se utilizar relocação dinâmica; Existe uma tendência de agrupamento da memória em um grande bloco único. 32 / 45 Alocação de memória Coalescência Figura 4.8: Coalescência de partições adjacentes [Favacho, 2009] 33 / 45 Alocação de memória Compactação Figura 4.9: Compactação de memória [Favacho, 2009] 34 / 45 Alocação de memória Escolha do método de particionamento As estratégias para escolha do método de particionamento tentam evitar o problema da fragmentação antes que ele ocorra; Como satisfazer uma requisição de tamanho n considerando a lista de partições disponíveis? First-t Aloca a primeira partição que for grande o suciente; Best-t Aloca a menor partição que for grande o suciente. É necessário buscar em toda a lista de partições, a não ser que estejam ordenadas por tamanho. Produz o menor tamanho de partição não alocado. Worst-t Aloca a maior partição. Deve buscar em toda a lista; Produz o maior tamanho de partição não alocado. 35 / 45 Alocação de memória First-t Figura 4.10: Método rst-t [Favacho, 2009] 36 / 45 Alocação de memória Best-t Figura 4.11: Método best-t [Favacho, 2009] 37 / 45 Alocação de memória Worst-t Figura 4.12: Método worst-t [Favacho, 2009] 38 / 45 Alocação de memória Controle de alocação Mapa de bits Memória é dividida em unidades de alocação de tamanho xo. Ocupação de espaço variável. Quanto menor, maior o mapa; Para cada unidade de alocação há um bit no mapa. Ex.: 0 -> Bloco livre 1 -> Bloco ocupado Lista encadeada Os elementos representam os segmentos livres e ocupados da memória. 39 / 45 Alocação de memória Mapa de bits Tamanho do mapa depende do tamanho da memória e da unidade de alocação; Unidade de alocação grande: desperdício de memória; Unidade de alocação pequena: mapas de bits grandes. Não é muito utilizado, pois a busca por espaços livres pode ser lenta. Figura 4.13: Exemplo de mapa de bits [Favacho, 2009] 40 / 45 Alocação de memória Lista encadeada Segmentos livres e ocupados são representados através de uma lista encadeada; Figura 4.14: Exemplo de lista encadeada [Favacho, 2009] 41 / 45 Alocação de memória Buraco na lista Nos seguintes endereços existem buracos na memória, ou seja, partições não alocadas: 5-7; 18-19; 29-31. Figura 4.15: Exemplo de buraco na lista [Favacho, 2009] 42 / 45 Alocação de memória Realocação Na realocação os buracos referenciam a si mesmos como espaços disponíveis; Os processos apontam somente para endereços que estão ocupados, respeitando um pequeno oset. Figura 4.16: Realocação na lista encadeada [Favacho, 2009] 43 / 45 Alocação de memória OBRIGADO!!! PERGUNTAS??? 44 / 45 Alocação de memória Dias, A. M. (2005). Noções de sistemas operacionais. Disponível em: http://www.dca.ufrn.br/∼xamd/dca0800/Cap03.pdf Acessado em 06/01/2011. Duarte, G. (2009). Anatomy of a program in memory. Disponível em: http://duartes.org/gustavo/blog/post/ anatomy-of-a-program-in-memory/ Acessado em 11/04/2016. Favacho, A. (2009). Notas de aula da Profa. Aletéia Favacho. Galvin, P. B., Gagne, G., and Silberschatz, A. (2013). Operating system concepts. John Wiley & Sons, Inc. Tanenbaum, A. S. and Machado Filho, N. (1995). Sistemas operacionais modernos, volume 3. Prentice-Hall. 45 / 45