Sistemas Operacionais
O que vimos até aqui
• Estudo de processos
• O que é um processo
• Como escalonar processos
• Como sincronizar processos
• Como tratar os principais problemas relacionados a
sincronização: deadlocks e starvation
Por que gerenciar memória?
• O principal objetivo do sistema de computação é
executar programas (programas + dados).
• Para isso, os programas e dados devem ser
armazenados em memória.
• Para melhor utilizar a CPU e garantir velocidade na
resposta ao usuários, vários programas
(processos) devem ser armazenados na memória ao mesmo tempo.
Execução dos Programas
• O procedimento normal é selecionar um processo na
fila de entrada e carregar esse processo na memória para que possa ser executado.
• A medida que o processo é executado, ele acessa
instruções e dados da memória.
• Ao terminar a execução do processo, o seu espaço de
memória é liberado.
• O processo pode ser movido entre o disco e a
programa 1 Disco Rígido programa 2 programa 3 programa 4 programa 5 programa 6 programa 1 Memória Fila de Entrada programa 2 programa 3 arquivos binários processos
Mapeamento de Endereços
• As informações de um programa são armazenadasna memória e identificadas por um endereço de memória.
• Para ser executado, o programa passa por uma
série de etapas e os endereços de memória
podem ser representados de diferentes formas ao longo destas etapas.
programa fonte compilador ou montador módulo objeto linkeditor módulo de carga carregador imagem binária na memória tempo de compilação tempo de carga tempo de execução
compilador ou montador linkeditor carregador Endereços Simbólicos Endereços Relocáveis Endereços Físicos Mapeamento de Endereço Mapeamento de Endereço
Mapeamento de Endereços
• A associação de instruções e dados com endereços
de memória pode ser feita em qualquer etapa da vida de um programa
• Eles diferem basicamente de quando um processo
poderá ser movido para a memória
• Em tempo de compilação • Em tempo de carga
Endereço Lógico versus
Endereço Físico
• Endereço Lógico (ou virtual): endereço gerado pela
CPU
• Endereço Físico: endereço visto pela unidade de
memória
• Os métodos de resolução de endereço em tempo de
compilação produzem endereços lógicos e físicos iguais.
• No método em tempo de execução, os endereços
CPU
MMU"
(Memory Management Unity)
Memória
+
endereço lógico 346 registrador de relocação 14000 endereço físico 14346Espaço de Endereçamento
• Espaço de endereçamento lógico: conjunto de
todos os endereços lógicos.
• Espaço de endereçamento físico: conjunto de
todos os endereços físicos.
• O conceito de um espaço de endereçamento
lógico que é associado a um espaço de
endereçamento físico é central a uma gerência de memória adequada.
Carga Dinâmica
• Como dito, um programa para ser executado tem que está
na memória. o tamanho do processo é limitado pelo tamanho da memória física.
• Para um melhor aproveitamento do espaço de memória,
fazemos o uso de carga dinâmica.
• Uma rotina só é carregada quando chamada. Se uma
rotina nunca é chamada, ela nunca vai ser alocada na memória .
• O sistema operacional não fornece suporte a tal ação.
Biblioteca Dinâmica
• Os programas acessam diversas bibliotecas.
• Existem sistemas operacionais que trabalham apenas com
bibliotecas estáticas. Cada processo carrega a biblioteca na imagem binária.
• No caso das bibliotecas dinâmicas, uma única versão da
biblioteca é compartilhada entre os processos que a usam.
• Economiza espaço em disco e memória principal
• Um pequeno trecho de código (stub) determina como localizar
a rotina da biblioteca apropriada residente na memória ou como carregar a biblioteca se a rotina não estiver presente.
Como executar processos maiores que a
memória alocada a ele?
Overlays
• Manter na memória apenas as instruções e dados
que são necessários em determinado momento.
• Por exemplo, é possível executar um programa
Overlays
• Considere um montador que executa suas ações em
dois passos: (1) constrói uma tabela de símbolos e (2) gera um código de linguagem de máquina.
• Passo 1 - 70k • Passo 2 - 80k
• Tabela de Símbolos - 20k • Rotinas Comuns - 30k
tabela de símbolos rotinas comuns drive overlay Passo 1 Passo 2 20k 30k 10k 80k 70k 140k 130k Memória de 150k Overlay A Overlay B
Overlays
• O código do overlay A e do overlay B são
mantidos no disco como imagens de memória absoluta e são lidos pelo drive de overlay
conforme necessário.
• O programa será carregado mais rápido (menos
informação a ser colocada na memória).
• O programa será executado mais lento (operação
Overlays
• Não é simples programar um overlay. O
programador deve ter um grande conhecimento sobre o programa, seus código e estrutura de
dados.
• O seu uso está limitado a microcomputadores e
outros sistemas que possuem quantidade limitada de memória física e que não tenham suporte a
Swapping
• Um processo precisa estar na memória para ser
executado.
• No entanto, um processo pode ser removido
temporariamente da memória para um
armazenamento auxiliar, e em seguida, retomado a memória para continuar sua execução.
Swapping
Swapping
• Exemplo: Escalonamento Round-Robin
• Quando o quantum expirar, o gerenciador de
memória faz:
• Swap out: descarrega o processo que
expirou.
• Swap in: carrega outro processo para espaço
Swapping
• Exemplo: Escalonamento Round-Robin
• Enquanto a memória substitui os processos, o
escalonado de CPU seleciona outro processo da memória para colocar em execução
• Idealmente, o gerenciador de memória é rapido
suficiente para garantir que sempre haverá processos na memória para que o escalonador coloque em
execução.
• Uma variante dessa abordagem utiliza o prioridade dos
Swapping
• Quando o processo que foi retirado da memória
Swapping
• Quando o processo que foi retirado da memória
retorna, onde ele fica alocado?
• Depende do método de resolução de endereço • Carga ou montagem: um processo que é
carregado será carregado para o mesmo espaço de memória
• Tempo de execução: é possível alocar o processo
para outro endereço, uma vez que os endereços físicos são calculados em tempo de execução.
Processo 1 Processo 2 swap out swap in espaço de usuário Sistema Operacional Armazenamento Auxiliar
Disco rígido grande e de acesso direto
Fila de prontos: todos os processos cujas imagens da memória esteja no armazenamento
Swapping
• Como funciona o escalonamento nesse tipo de sistema?
• O dispatcher é acionado sempre que o escalonador executa
um processo
• O dispatcher verifica se o próximo processo está na memória • Se não estiver e não exister espaço de memória livre, o
dispatcher descarrega um processo que está na memória
(swap out) e carrega o processo desejado no seu lugar (swap in).
• Em seguida, ele recarrega os registradores da forma usua; e
Swapping
• O tempo de troca de contexto nesses casos é
relativamente alto.
• Além disso, existe limitações para realizar a troca: • O usuário precisa manter o sistema informado
sobre qualquer mudança nos requisitos de memória.
• É preciso ter certeza que o processo está
Swapping
• Atualmente, o procedimento de troca padrão é
usado em poucos sistemas. Ele requer um tempo excessivo de trica e fornece pouco tempo de
execução.
• Existe uma versão modificada dessa abordagem
utiliza no UNIX:
• o swapping só é acionado se muitos processos
estiverem executando e usando um valor limitado de memória.
Alocação Contígua de
Memória
Alocação Contígua de
Memória
• A memória deve permitir acomodar o sistema
operacional e vários processos ao mesmo tempo.
• Geralmente, a memória é dividida em partições:
uma para o sistema operacional e outra para processos do usuário
Alocação Contígua de
Memória
• Como alocar memória disponível aos vários
processos que estão na fila de entrada esperando para serem carregados?
• Uma vez que vários processos estão dividindo a
memória, como proteger o SO contra processos de usuários e proteger os processos de usuário um
Alocação Contígua de
Memória
• Como alocar memória disponível aos vários
processos que estão na fila de entrada esperando para serem carregados?
• Uma vez que vários processos estão dividindo a
memória, como proteger o SO contra processos de usuários e proteger os processos de usuário um
CPU
<
+
MemóriaRegistrador de Limite
Registrador de Relocação
exceção, erro de endereçamento
SIM NÃO Endereço Lógico Endereço Físico
Alocação Contígua de
Memória
• Como acontece o escalonamento?
• Escalonador seleciona um processo em execução
• Carrega os registradores de relocação e limite com
os valores corretos como parte da troca de contexto
• Como todo endereço é gerado pela CPU é verificado
em relação a esses registradores, podemos proteger o sistema operacional, processos e dados.
Alocação Contígua de
Memória
• Como alocar memória disponível aos vários
processos que estão na fila de entrada esperando para serem carregados?
• Uma vez que vários processos estão dividindo a
memória, como proteger o SO contra processos de usuários e proteger os processos de usuário um
Alocação Contígua de
Memória
• Método mais simples
• Divide a memória em várias partições de tamanho
fixo que contém exatamente 1 processo
• Quando o processo finaliza sua execução, a
partição é liberada para outro processo.
• O grau de multiprogramação é limitado pelo
Processo
Alocação Contígua de
Memória
• Uma solução é utilizar o método MVT, uma generalização do
método anterior.
• Nesse método, o SO possui uma tabela que informa que partes
da memória estão disponíveis e que partes estão ocupadas.
• Quando um processo chega e precisa de memória, alocamos o
processo no bloco de memória livre grande o suficiente para esse processo.
• Se encontramos, alocamos apenas a parte necessária para o
processo em questão. O restante fica livre para satisfazer pedidos futuros.
Alocação Contígua de
Memória
• O sistema operacional considera os requisitos de
memória de cada processo e a quantidade de
espaço de memória disponível para determinar a que processos a memória será aloucada.
• Uma outra forma é ordenar de acordo com algum
algoritmo de escalonamento. A memória é alocada até que os requisitos dos próximos processos não sejam mais atendidos (nenhum bloco disponível é grande o suficiente para armazenar tal processo).
• Os blocos livres adjacentes podem ser
combinados para formarem um novo bloco.
• Após a junção, deve-se verificar novamente se
existem processos que atendam a nova recompilação de memória.
Processo Processo
Alocação Contígua de
Memória
• Como selecionar um bloco de memória livre do
Alocação Contígua de
Memória
• Como selecionar um bloco de memória livre do
conjunto de blocos disponíveis?
• First-fit: primeiro bloco de memória grande o
suficiente
• Best-fit: menor bloco de memória grande o
suficiente
Alocação Contígua de
Memória
• O grande problema desses algoritmos é o que
chamamos de fragmentação externa"
• À medida que os processos são carregados e
descarregados na memória, o espaço livre na memória é quebrado em pequenas partes.
• Sendo assim, cria-se espaço na memória total
suficiente para atender a um pedido, mas não é contíguo.
• Somando os espaço disponíveis, a memória possui
espaço suficiente para alocar o novo processo de
30k. No entanto, esses espaços não estão contíguos.
• Qual a solução?
Processo 10k Processo 10k Processo 10k Processo 10k
Processo
Alocação Contígua de
Memória
• Uma solução para esse problema é a
COMPACTAÇÃO:"
• Trocar de posição o conteúdo da mesário para
reunir toda a memória livre em um grande bloco.
• Isso só é possível se a relocação for dinâmica e
feita em tempo de execução.
Alocação Contígua de
Memória
• Uma outra solução é permitir que o espaço de
endereçamento lógico de um processo seja não contíguo.
• Dessa forma, podemos permitir que um processo receba
a memória física que esteja disponível, independente se esses espaços são contíguos ou não.
• Paginação
• Segmentação
O que é paginação?
• É um esquema de organizar dados na memória
que permite que o espaço de endereçamento físico de um processo seja não-contíguo.
• A memória física é quebrada em blocos de
tamanho fixo chamados de quadros (frames).
• A memória lógica também é quebrada em
CPU p d Endereço" Lógico f f d Endereço" Físico p f f0000 … 000 f1111 … 111 Tabela de Página Memória Física
Paginação
• Cada endereço gerado pela CPU é dividido em
duas partes: número de página (p) e um
deslocamento de página (d).
• O número de página é utilizado com índice em
uma tabela de página.
• A tabela de página contém o endereço base de
página 0 página 1 página 2 página 3 memória lógica 1 4 3 7 0 1 2 3 Memória Física página 0 página 2 página 1 página 3 Tabela de página
Paginação
• A paginação é uma forma de relocação dinâmica
de memória.
• Cada endereço lógico é associado pelo hardware
de paginação a algum endereço físico. O uso da página é semelhante ao uso da tabela de
registradores.
• A paginação resolve o problema da fragmentação
externa, no entanto não resolve qual outro problema?
Paginação
• A paginação é uma forma de relocação dinâmica de
memória.
• Cada endereço lógico é associado pelo hardware de
paginação a algum endereço físico. O uso da página é semelhante ao uso da tabela de registradores.
• A paginação resolve o problema da fragmentação
externa, no entanto não resolve qual outro problema?
Paginação
• Na média, o última meia página do processo fica
vazia.
• Páginas menores são desejáveis já que
diminuem a fragmentação
• No entanto, essa solução aumenta o tamanho da
tabela de página.
Paginação
• Um aspecto importante da paginação é a
separação clara entre a visão da memória pelo usuário e a memória física real:
• Visão do usuário: vê a memória como um único
espaço.
• Visão da memória: páginas espalhadas.
• O mapeamento entre essas visões fica escondido
Paginação
• O sistema operacional gerencia uma estrutura
chamada de tabela de quadros:
• guarda as informações detalhadas da alocação
de memória física: quais quadros estão
alocados, quais estão disponíveis, quantos quadros existem no total.
• A paginação aumenta o tempo de troca de
Como é feito o
armazenamento da
tabela de páginas?
Implementação
• Cada sistema operacional possui seus próprios
métodos para armazenar tabela de páginas.
• A maioria aloca uma tabela de página para cada
processo.
• A implementação do hardware da tabela de página
pode ser feita de várias maneiras:
• Utilizando registradores • Utilizando a memória
Implementação
• Através de registradores
• Implementação com acesso rápido
• Satisfatório para tabelas de páginas pequenas • No entanto, tem um alto custo
• Solução?
Implementação
• Implementar na memória
• A tabela de página é mantida na memória
principal e um registrador da tabela de página (PTBR - Page Table Base Register) aponta para a tabela de página.
• As mudanças na tabela de página exige
somente a mudança nesse registrador, reduzindo bastante o tempo de troca de contexto.
Implementação
• O problema com essa técnica é o tempo exigido
para acessar um local da memória do usuário.
• Multiplica por dois o acesso a memória
• Um acesso para a entrada da tabela e um
acesso a informação em si
• Solução?
Implementação
• TLB (Translation Look-aside Buffer)
• Uma memória associativa de alta velocidade
que funciona como uma cache das entradas de páginas mais acessada.
CPU p d Endereço" Lógico f f d Endereço" Físico p f f0000 … 000 f1111 … 111
CPU p d Endereço" Lógico f f d Endereço" Físico p f f0000 … 000 f1111 … 111
Tabela de Página Memória Física
quadro página
falha na TLB
Proteção
• A proteção da memória em um ambiente paginado é
realizada pela proteção dos bits associados a cada quadro. Esses bits costumam ser montados na tabela de página
• Bit para definir uma página como leitura/escrita ou
somente leitura
• Bit válido e inválido
Estrutura da Tabela de
Página
• A maioria dos sistemas computadorizados modernos
admite um grande espaço de endereços lógicos (2^32 a 2^64).
• Nestes casos, a tabela de página se torna muito grande. • Por exemplo:
• Endereços lógicos: 32 bits • Tamanho de página: 4kb
Estrutura da Tabela de
Página
• Devemos estruturar a tabela de página de forma a
garantir o melhor uso de memória:
• Paginação Hierárquica
• Tabela de páginas com hash • Tabelas de páginas invertidas
Estrutura da Tabela de
Página
• A maioria dos sistemas computacionais modernos
admite um grande espaço de endereço lógicos.
• Nestes casos, a tabela de página é muito grande,
ocupando muito espaço da memória.
• Como gerenciar melhor esse cenário?
• Dividir a tabela de página em tamanho menor • Paginação Hierárquica.
Estrutura da Tabela de
Página
• Paginação Hierárquica
Estrutura da Tabela de
Página
• Outras alternativas:
• Tabelas de página com hash
• Utilizada em espaço de endereços maiores que 32 bits.
• É aplicado o hash no número da página virtual na tabela de
página.
• Cada entrada na tabela de hash contém um lista encadeada de
elementos que se dirigem para o mesmo local.
• O número de página virtual é comparado com os elementos da
lista encadeada. Se houver uma combinação, o quadro da
Estrutura da Tabela de
Página
• Outras alternativas:
• Tabelas de páginas invertidas
• Contém uma entrada para cada página da
memória
• A entrada consiste do endereço virtual da
página gravada na memória real com
informações sobre o processo que pertence àquela página.
Páginas Compartilhadas
• Uma das vantagens da paginação é a possibilidade de
compartilhar código comum.
• Considere o seguinte cenário:
• Um ambiente compartilhado com 40 usuários e todos
utilizando um editor de texto de 200kb (150kb de código e 50kb de espaço de dados).
• Quanta memória é necessária? • 8000kb
ed 1 ed2 ed3 dados 1 processo P1 3 4 6 1 Memória Física dados 1 dados 3 ed 1 ed 2 ed3 dados 2 Tabela de página para P1 ed 1 ed2 ed3 dados 3 processo P3 3 4 6 2 Tabela de página para P3 ed 1 ed2 ed3 dados 2 processo P2 3 4 6 7 Tabela de página para P2
Páginas Compartilhadas
• Utilizando páginas compartilhadas é possível
reduzir o consumo de memória do exemplo anterior de 8000KB para 2150KB.
• Como?
• Com o compartilhamento é necessário apenas
uma cópia do editor (150KB), mais 40 cópias dos 50KB do espaço de dados, uma por
Segmentação
• É um esquema de gerência de memória que permite
enxergar o espaço de endereço lógico como um conjunto de segmentos.
• Um endereço lógico é representado por:
• <numero_segmento,deslocamento>
• numero_segmento: identificador do segmento
sub-rotina pilha sqrt tabela de símbolos programa principal
CPU s d limite base s Tabela de Segmentos Memória Física <
+
Intercepção; erro de endereçamento sim
Segmentação
• No caso da segmentação, os usuários referenciam
endereços bidirecionais. No entanto, a memória física
continua sendo uma seqüência de bytes unidimensional.
• Sendo assim, faz-se necessário um mapeamento entres
estes dois tipos de endereços.
• O mapeamento é feito pela tabela de segmentos.
• base do segmento: endereço físico inicial no qual o
segmento reside na memória
sub-rotina pilha sqrt tabela de símbolos programa principal Espaço de Endereçamento Lógico 0 4 1 3 2 limite base 1000 1400 400 6300 400 4300 1100 3200 1000 4700 Memória Física segmento 0 segmento 3 segmento 2 segmento 1 segmento4 1400 2400 3200 4300 4700 5700 6300 6700 Tabela de Segmentos
Proteção e
Compartilhamento
• Assim como na paginação, a segmentação
permite a proteção e o compartilhamento das
informações que são armazenadas na memória.
• Permite a proteção de segmentos, ou seja, permite
a proteção de partes de um programa.
• Instruções: leitura ou execução • Dados: escrita
Proteção e
Compartilhamento
• Os segmentos são compartilhados quando as
entradas na tabela de segmento de dois
processos diferentes apontam para o mesmo local na memória física.
editor dados 1 memória lógica do processo P1 0 1 limite base 25286 43062 4425 68348 Memória Física editor dados1 dados 2 43062 68348 72773 90003 98553 tabela de segmento do processo P1 editor dados 2 memória lógica do processo P2 0 1 limite base 25286 43062 8850 90003 tabela de segmento do processo P2
Fragmentação
• Possui fragmentação externa
• Não possui fragmentação interna
• Como a segmentação é um algoritmo dinâmico de
relocação, podemos compactar a memória sempre que desejarmos.
Segmentação com
Paginação
Conclusão
• Todas as estratégias possuem o mesmo objetivo:
permitir a multiprogramação.
• No entanto, elas exigem que um processo inteiro
esteja na memória antes de poder ser executado.
• Como executar processos que não estejam
completamente na memória?
Referências
• Cap. 9 do livro do Silberschatz • Cap. 3 do livro do Tanenbaum