Você está na página 1de 81

Universidade Federal de Sergipe

Campus Professor Alberto Carvalho


Departamento de Sistemas de Informação

Prof. André Luis Meneses Silva


andreluis.ms@gmail.com
Universidade Federal de Sergipe
Campus Professor Alberto Carvalho
Departamento de Sistemas de Informação

Prof. André Luis Meneses Silva


andreluis.ms@gmail.com
Introdução
Swapping
Alocação Contígua de Memória
Segmentação
Paginação
• O mundo ideal para desenvolvedores seria se tivéssemos memória
• Muito grande (ilimitada)
• Veloz
• Não volátil
• É possível termos isso? Porque?
• Como resolvemos tal problema?
• Solução
• Hierarquia de Memória
• Cache
• Memória Principal
• Armazenamento Secundário
• Gerenciamento é feito pelo gerenciador de memória.

• O que tem na memória?


• A memória possui:

• Processos e seus dados.

• O programa deve ser trazido (do disco) para a memória e colocado dentro de um
processo para que ele seja executado.

• O espaço de endereçamento corresponde a porção de memória endereçável por um


processo.
• Problema crucial:
• Como evitar que um processo invada outros espaços de endereçamento?
• Delimita-se uma porção de memória a cada processo
através de registradores de propósito específico.
• O par de registradores e definem o espaço
de endereço lógico
• CPU deve checar todo acesso a memória gerado em
modo usuário para assegurar que ele está entre o
endereço base e o limite.
• Em S.Os. com suporte a multiprogramação, vários programas podem ser chamados
para execução pelo usuário.
• Os programas são trazidos para memória principal para executar, formando uma fila de
entrada.

• Algumas questões.
• Em que lugar da memória devem ser alocados?
• Quem é responsável por essa alocação?
• E se o programa faz referência a endereços de memória?
• Em S.Os. com suporte a multiprogramação, vários programas podem ser chamados
para execução pelo usuário.
• Os programas são trazidos para memória principal para executar, formando uma fila de
entrada.

• Algumas questões.
• Em que lugar da memória devem ser alocados?
• Qualquer lugar
• Quem é responsável por essa alocação?
• O Loader
• E se o programa faz referência a endereços de memória?
• Endereços físicos ou endereços virtuais.
• Quando um programa faz referência a endereços de memória, podemos trabalhar com
endereços físicos.

• Vantagem:
• Desempenho

• Desvantagens:
• Demanda que o desenvolvedor saiba previamento onde o processo será alocado.
• Menos flexível.

• Uma outra solução é delegar a associação de endereços às seguintes entidades:


• Compilador
• Loader
• Hardware para alocação de processos.
• Em tempo de compilação: se a localização da memória onde o processo será alocado é
conhecida a priori, o compilador pode gerar código absoluto. Código absoluto é o código
onde toda referência de memória é feita a endereços físicos reais. Qual o Problema?
• Em tempo de compilação: se a localização da memória onde o processo será alocado é
conhecida a priori, o compilador pode gerar código absoluto. Código absoluto é o código
onde toda referência de memória é feita a endereços físicos reais. Qual o Problema?
• Em tempo de compilação: se a localização da memória onde o processo será alocado é
conhecida a priori, o compilador pode gerar código absoluto. Código absoluto é o código
onde toda referência de memória é feita a endereços físicos reais. Qual o Problema?

• Em tempo de carga (load): Compilador gera código relocável. Código relocável é aquele
cujas referências a memória só é realizada no momento que o Loader carrrega o
programa para a memória principal. Qual o Problema?
• Em tempo de compilação: se a localização da memória onde o processo será alocado é
conhecida a priori, o compilador pode gerar código absoluto. Código absoluto é o código
onde toda referência de memória é feita a endereços físicos reais. Qual o Problema?

• Em tempo de carga (load): Compilador gera código relocável. Código relocável é aquele
cujas referências a memória só é realizada no momento que o Loader carrrega o
programa para a memória principal. Qual o Problema?
• Deve ser recarregado sempre que a localização mudar.
• Em tempo de compilação: se a localização da memória onde o processo será alocado é
conhecida a priori, o compilador pode gerar código absoluto. Código absoluto é o código
onde toda referência de memória é feita a endereços físicos reais. Qual o Problema?

• Em tempo de carga (load): Compilador gera código relocável. Código relocável é aquele
cujas referências a memória só é realizada no momento que o Loader carrrega o
programa para a memória principal. Qual o Problema?
• Deve ser recarregado sempre que a localização mudar.

• Em tempo de execução: Vínculo é realizado somente na execução. Dessa forma,


processo pode ser alocado em qualquer porção da memória. Qual o Problema?
• Em tempo de compilação: se a localização da memória onde o processo será alocado é
conhecida a priori, o compilador pode gerar código absoluto. Código absoluto é o código
onde toda referência de memória é feita a endereços físicos reais. Qual o Problema?

• Em tempo de carga (load): Compilador gera código relocável. Código relocável é aquele
cujas referências a memória só é realizada no momento que o Loader carrrega o
programa para a memória principal. Qual o Problema?
• Deve ser recarregado sempre que a localização mudar.

• Em tempo de execução: Vínculo é realizado somente na execução. Dessa forma,


processo pode ser alocado em qualquer porção da memória. Qual o Problema?
• NENHUM
• Gerado pelo processador, também conhecido como endereço virtual.

• Endereço reais da unidade de memória.


• Endereços lógicos e físicos são iguais quando usamos vínculo em tempo de compilação ou de
carga.

• é o conjunto de todos os endereços lógicos associados a um processo.

• é o conjunto de todos os endereços físicos associados a um processo.


• Dispositivo de hardware que em tempo de execução mapeia endereços virtuais em
endereços físicos

• O método mais simples, consiste em adicionar o valor do registro de alocação a todo


endereço gerado pelo processo do usuário e então, enviá-lo a memória.
• Registrador base agora chamado de .
• MS-DOS no Intel 80x86 usou 4 registradores de relocação.

• O programa do usuário lida com endereços lógicos, ele nunca vê o endereço físico real.
• Apesar dos sistemas modernos disporem de uma grande quantidade de memória
principal, a memória é um recurso escasso que deve ser bem administrado.
• Processos podem crescer demasiadamente.
• No decorrer da evolução dos S.Os, várias técnicas foram adotadas com intuito aumentar
a multiprogramação e reduzir o uso de memória
• Apesar dos sistemas modernos disporem de uma grande quantidade de memória
principal, a memória é um recurso escasso que deve ser bem administrado.
• Processos podem crescer demasiadamente.
• No decorrer da evolução dos S.Os, várias técnicas foram adotadas com intuito aumentar
a multiprogramação e reduzir o uso de memória

• Algumas técnicas:
• Carga dinâmica
• Link dinâmico
• Swapping
• Alocação contígua
• Segmentação
• Com o intuito de diminuir o espaço ocupado por um processo, podemos trabalhar com
carregamento dinâmico.
• Rotina só é carregada no momento em que é necessária.

• Todas as rotinas são mantidas no disco em um formato de carga relocável.

• Não é necessário nenhum suporte especial do S.O.


• Implementada em tempo de projeto.
• S.O pode apresentar bibliotecas para auxiliar na carga dinâmica.
• Introduz a ideia de link dinâmico
• Link dinâmico
• Link é postergado até o momento da execução.
• Antes
• Link estático
• Bibliotecas de sistema e código de programa eram combinados pelo loader em uma imagem binária
do programa.

• Como link dinâmico é implementado:


• Usam pequenas peças de código, denominada stub (esboço). Através do stub são localizadas
as bibliotecas necessárias.
• Após localização, stub é substituído pelo endereço das bibliotecas.
• S.O. verifica se as bibliotecas estão no espaço de endereço do processo.
• Caso não esteja, a adiciona.
• Uma outra forma de liberar espaço em memória é através da técnica de swapping.
• Um processo pode ser colocado temporariamente fora da memória para o disco e, em seguida,
trazido de volta à memória para execução.

• O disco deve ser rápido e grande o suficiente para acomodar cópias de todas as imagens de
memória para todos os usuários.
• O disco deve fornecer acesso direto a essas imagens de memória

• O sistema mantém uma fila pronta de processos prontos para execução que possuem
imagens de memória no disco
• Problemas?
• Problemas?
1. Tempo elevado para realização do swap, bem como seu impacto na troca de contexto.
2. Processos que realizam operação de E/S.
I. Vamos lembrar do DMA.
II. Toda vez que acontece uma operação envolvendo dispositivos de I/O e armazenamento, DMA
gerencia essa transferência. Mas se:
a. P1 solicitar a leitura de bytes do áudio do microfone.
b. P1 sofrer swap out e P2 sofrer swap in e passar a ocupar a região de P1.
c. Bytes de áudio solicitados por P1 serão escritos em P2.
• Tipicamente não suportado, pois:

• Baseado em memória flash


• Pouca quantidade de armazenamento
• Limitado número de ciclos de escrita
• Baixa taixa de transferência entre memória flash e a CPU.

• Ao invés, é usado liberação automática de memória.

• iOS pede às apps para voluntariamente devolver a memória alocada


• Dado somente leitura é liberado e recarregado da flash se necessário
• Falhas na liberação pode levar ao término da App.

• Android finaliza apps se possui pouca memória livre, mas antes escreve o estado da aplicação
para a flash.
• Memória principal deve suportar tanto o sistema operacional como as aplicações do
usuário.

• Recurso limitado. Deve ser alocado eficientemente.

• Pode ser adotado alocação contígua.

• Memória principal dividida em duas partições:


• Sistema operacional residente, geralmente carregado em endereços mais baixos com o vetor de
interrupção.
• Processos de usuários carregados em endereços mais altos.
• Cada processo possuí uma porção contígua da memória.
• Registradores de relocação usados para proteger processos de usuário uns dos outros.
• Registrador base contém valor do menor endereço físico do processo.
• Registrador limite contém a faixa de endereços lógicos válidos.
• MMU mapeia endereços lógicos dinamicamente.
• Alocação de múltiplas partições
• Grau de multiprogramação limitado por múltiplas partições
para eficiência.
bloco de memória disponível.
• Quando um processo chega, ele é alocado em um hole grande o suficiente para acomodá-lo.
Ao terminar, ele libera esse espaço.
• Sistema operacional mantém informações sobre
• a) partições alocadas b) partições livres (hole)
• Como satisfazer uma requisição por espaço?

• First-fit: Alocar o primeiro hole grande o suficiente


• Best-fit: Alocar o menor hole grande o suficiente
• Worst-fit: Alocar o maior hole.

• Qual o melhor?
• Esses algoritmos podem gerar:

• Fragmentação Externa espaços entre processos alocados.

• Fragmentação Interna Memória alocada pode ser maior do que a solicitada.

• Para o algoritmo First fit análises revelam que dado N blocos alocados, 1/2 N blocos são
perdidos por conta de fragmentação.
• Uma tentativa de reduzir a fragmentação é através da compactação.
• Organize a memória de forma que todo espaço livre fique em um único bloco.
• Só é possível se relocação é dinâmica e feita em tempo de execução.
• Esquema de gerenciamento de memória que admite visão da memória pelo usuário
• Um programa é uma coleção de segmentos. Um segmento é uma unidade lógica como:
• programa principal,
• procedimento,
• função,
• método,
• objeto,
• variáveis locais, variáveis globais,
• bloco comum,
• pilha,
• tabela de símbolos, arrays
• Endereço lógico consiste em uma tupla de dois:
• <número-segmento, deslocamento>,
• Tabela de segmento – mapeia endereços físicos bidimensionais; cada entrada de tabela
tem:
• base – contém o endereço físico inicial onde os segmentos residem na memória
• limite – especifica o tamanho do segmento
• Proteção
• A cada entrada na tabela de segmento, associe:
• bit de validação = 0 → segmento ilegal
• privilégios read/write/execute

• Bits de proteção associados a segmentos; o compartilhamento de código ocorre no nível de


segmento

• Como os segmentos variam em tamanho, a alocação de memória é um problema de alocação


dinâmica de armazenamento
• Outra modalidade de gerenciamento de memória.
• Comparado a segmentação, tem vantagens por não apresentar fragmentação externa.

• Como funciona:
• Divide a memória física em partes de tamanho fixo chamadas de blocos (frames) (tamanho é
potência de 2, entre 512 bytes e 8.192 bytes).
• Divide memória lógica em partes do mesmo tamanho chamadas de páginas.
• Mantém controle de todos os blocos livres
• Para executar um programa com n páginas, necessita encontrar n blocos livres e carregar o
programa
• Endereço gerado pela CPU é divido em:

• Número da Página (p) – usada como um índice em uma tabela de páginas que contém o
endereço base de cada página na memória física

• Deslocamento na Página (d) – combinado com o endereço base para definir o endereço
de memória que é enviado a unidade de memória
Número da Página Deslocamento
p d
m-n n
• Para um determina espaço de endereçamento lógico 2m e um tamanho de página 2n
• Tabela de Páginas é mantida na memória principal.
• Registrador base da tabela de páginas (Page-table base register - PTBR) aponta para a
tabela de páginas
• Registrador tamanho da tabela de páginas (Page-table length register - PRLR) indica
quantos endereços ela ocupa
• Neste esquema cada acesso a dado/instrução requer dois acessos a memória. Um para
a tabela de páginas e outro para o dado/instrução
• O problema pode ser resolvido com o uso de uma memória cache especial, pequena, de
acesso rápido, chamada de memória associativa ou translation look-aside buffers (TLBs)
• Algumas TLBs armazenam identificadores de espaços de endereço (address-space
identifiers - ASIDs) em cada entrada da TLB – identificam cada processo de forma única
para prover proteção no espaço de endereçamento daquele processo
• Capítulo 8.
Universidade Federal de Sergipe
Campus Professor Alberto Carvalho
Departamento de Sistemas de Informação

Prof. André Luis Meneses Silva


andreluis.ms@gmail.com
Introdução
Memória Virtual
Paginação Sob Demanda
Falta de Página
Substituição de Páginas
Tabela de Página Multinível
Tabela de Página Invertida
Trashing
• Código precisa estar em memória para executar, mas o programa completo é raramente
usado.
• Ex: código de erro, rotinas pouco usuais, estruturas de dados muito grandes.
• Código completo do programa não é necessário no mesmo momento.
• Considere a habilidade de executar programa carregado parcialmente:
• O que teremos?
• Código precisa estar em memória para executar, mas o programa completo é raramente
usado.
• Ex: código de erro, rotinas pouco usuais, estruturas de dados muito grandes.
• Código completo do programa não é necessário no mesmo momento.
• Considere a habilidade de executar programa carregado parcialmente:
• O que teremos?

• Programa não mais restrito pelos limites da memória física.


• Cada programa usa menos memória enquanto executa.
• Aumento da utilização da CPU sem afetar o tempo de resposta
• Menos I/O dedicado a carga ou swap de programas para a memória
• Separação da memória lógica do usuário da memória física.
• Somente partes do programa precisam estar em memória para execução.
• Espaço de endereço lógico pode ser muito maior do que espaço de endereço físico.
• Permite espaços de endereços ser compartilhado por vários processos
• Permite criação mais eficiente dos processos.
• Mais programas executando concorrentemente.
• Menor carga de I/O necessário para carga ou swap de processos.
• Espaço virtual de endereço
• Visão lógica de como o processo é armazenado em memória.
• Começa no endereço 0, adota endereço contíguos até o fim do espaço.
• A memória física é organizada em frames.
• A MMU mapeia o espaço lógico em físicos.
• Memória virtual pode ser implementada:
• Páginas sob demanda
• Segmentos sob demandas
• Stack começa no endereço lógico máximo e cresce para baixo,
enquanto heap cresce para cima.
• Maximiza o espaço de endereços em uso.
• Espaços de endereços não usados entre os dois é um hole.
• Não é necessário alocar nenhuma memória física até heap ou stack alocar
uma nova página.

• Permite espaços de endereços não contíguos

• Bibliotecas de sistema e regiões de memória compartilhada através do


mapeamento para o espaço do endereço virtual.

• Páginas podem ser compartilhadas durante o fork(), aumentando a


velocidade de criação dos processos.
Endereço Lógico
núm. página desloc. página

p d

m-n n
• Na paginação sob demanda, páginas são
trazidas para memória somente quando
necessárias.
• Menor uso de I/O e memória
• Respostas mais ágeis, mais usuários.

• Evolução da técnica de swapping.

• Swapper preguiçoso (pager) – nunca traz


uma página para memória a menos que seja
necessária.
• Sempre que uma página é referenciada pela primeira vez, acontece uma falta de página.
Nesse momento, é gerado um trap para o sistema operacional:
1. Sistema operacional consulta outra tabela (PCB – bloco de controle do processo) para
decidir:
a. Referência inválida → aborta
b. Página ainda não reside em memória.
2. Caso b, ele busca por um frame livre.
3. Agenda uma operação de I/O para trazer a página para o frame.
4. Modifica o bit de validação da respectiva página para v.
5. Reinicia a instrução que causou a falta de página.
1. Encontre a localização da página desejada no disco.
• Encontre um frame livre:
 Se houver, use-o.
 Senão há, use use o algoritmo de substituição para selecionar a vítima.
 Escreva o frame no disco.
2. Traga a nova página para o frame livre; atualize a página e a tabela de frames.
3. Continue o processo, reiniciando a instrução que desencadeou o trap.
 Algoritmo de alocação de frames:
 Determina quantos frames devem ser dados a cada processo e que frames serão
substituídos.
 Algoritmo de substituição de páginas
 Busca pela menor taxa de falta por página.

 FIFO, Otimal, LRU


 Referências aos endereços: 7,0,1,2,0,3,0,4,2,3,0,3,0,3,2,1,2,0,1,7,0,1
 3 frames (3 páginas pode estar em memória por vez e por processo)
• Quantas faltas?


 Referências aos endereços: 7,0,1,2,0,3,0,4,2,3,0,3,0,3,2,1,2,0,1,7,0,1
 3 frames (3 páginas pode estar em memória por vez e por processo)
• Quantas faltas? 15


 Substitui páginas que não serão usadas por um longo período de tempo.
 Como prever o futuro?
 Quantas faltas?
 Substitui páginas que não serão usadas por um longo período de tempo.
 Como prever o futuro?
 Quantas faltas? 9
 Usa conhecimento passado.
 Substitui página a mais tempo sem uso.
 Quantas faltas?
 Usa conhecimento passado.
 Substitui página a mais tempo sem uso.
 Quantas faltas? 12
• Com o intuito de diminuir o espaço para armazenamento de tabelas de página, bem
como permitir o uso de programas muito grandes, podemos utilizar duas técnicas:
• Tabela de Páginas Multinível
• Tabela de Página Invertida
• Um endereço lógico (em máquinas de 32 bits com tamanho de página de 1K) é dividido
em:
• um número de página contendo 22 bits
• um deslocamento de página contendo 10 bits
• Como a tabela de página é paginada, o número de página é dividido ainda em:
• um número de página de 12 bits
• um deslocamento de página de 10 bits
• Assim, um endereço lógico é o seguinte:
núm. página desloc. página
pi p2 d
12 10 10

onde pi é um índice para a tabela de página do primeiro nível, e p2 é o índice da tabela de


página do segundo nível.
• Uma entrada para cada página real de memória
• Entrada consiste no endereço virtual da página armazenado nesse local da memória real,
com informações sobre o processo que possui essa página
• Diminui a memória necessária para armazenar cada tabela de página, mas aumenta o
tempo necessário para pesquisar a tabela quando ocorre uma referência de página
 Se um processo não possui páginas suficientes sua taxa de falta pode se tornar elevada.
 Isso leva a:
 Baixa utilização de CPU
 Sistema operacional acha que deve aumentar o grau de multiprogramação.
 Outros processos entram no sistema.

 Thrashing  processo ocupado fazendo swap.


• Capítulos 9.

Você também pode gostar