Sistemas Operacionais
O que vimos na aula
passda?
• Gerenciamento de memória • Paginação
• Segmentação
Memória Virtual
• Normalmente, os programas são maiores do que a
memória física disponível.
• Normalmente, não executamos todo o programa de
uma só vez.
• A memória virtual é uma técnica que permite a
execução de processos que não estão completamente na memória.
• Livra os programadores dos problemas de limitação
Memória Virtual
• Em muitos casos não precisamos executar o
programa inteiro, o que facilita o uso da memória virtual.
• Por exemplo:
• Código para condições de erros
• Arrays, listas e tabelas recebem mais memória do que devia
Memória Virtual
• Essa abordagem gera alguns benefícios: • Um programa não é mais restrito pela
quantidade de memória física livre
Memória Virtual
• A memória virtual é implementada utilizando uma paginação
por demanda
• A paginação por demanda faz uso de swap
• Os processos residem na memória secundária e estes
são passados para memória principal quando forem executados.
• No entanto, apenas as páginas que são necessárias são
passadas para memória (lazzy swapper).
• O responsável por essa troca é o swapper ou paginador
Memória Virtual
• Na paginação por demanda, o paginador só carregar
na memória as páginas necessárias.
• Sendo assim, haverá páginas que estarão
armazenadas na memória principal e páginas que estarão armazenadas na memória física.
• Precisamos de um mecanismo que indique na tabela
de página quais páginas serão buscadas na memória e quais serão buscadas na memória secundária.
Memória Virtual
• Como implementar isso?
• Através dos bits válido/inválido na tabela de página. • Válido: a página associada é válida e está na
memória
• Inválido: a página não é válida (ou seja, não está no
espaço de endereços lógicos do processo) ou é válida, mas atualmente está no disco.
• Durante o processo de tradução, se o bit válido-inválido
Page Fault
• Para tratar a falta de página:
• Verificamos um tabela interna para esse processo, a fim de determinar se a
referência foi um acesso de memória válido ou inválido.
• Se a referência foi inválida, terminamos o processo. Se foi válida, mas ainda
não trouxemos essa página, então a página é trazida para a memória.
• Encontramos um quadro livre
• Preparamos uma operação de disco para ler a página desejada para o quadro
recém-alocado.
• Quando a leitura do disco tiver sido concluída, modificamos a tabela interna
mantida com o processo e a tabela de página, para indicar que a página agora está na memória.
Paginação por Demanda
• O suporte de hardware para a paginação por
demanda é composto por:
• Tabela de página: armazena uma entrada como
inválida por meio de um bit válido-inválido ou de um valor especial de bits de proteção.
• Memória secundária: mantém as páginas que não
estão presentes na memória principal.
• swap space: espaço alocado no disco para
Desempenho
• A paginação por demanda pode afetar o desempenho de
um sistema computacional.
• O desempenho é medido calculando o tempo de acesso
efetivo para a memória paginada por demanda.
• te = (1 - p) * ma + p * tf, onde: • te: tempo de acesso efetivo
• ma: tempo de acesso à memória
Desempenho
• A falha de página ocasiona em uma série de ações
do sistema computacional, que podem ser resumidas a três passos:
1. Atender a interrupção de falha de página 2. Ler a página para a memória
Desempenho
• Se considerarmos:
• ma = 200 nanosegundos • tf = 8 milisegundos
• Se um acesso entre 1000 causar falta de página
• O tempo de acesso efetivo é de 8,2 microsegundos. Causando um atraso de 40x.
• É importante manter baixa a taxa de falha de página em um
sistema de paginação por demanda. Caso contrário, o tempo de acesso efetivo aumenta, atrasando bastante a execução do
Substituição de Página
• O objetivo da paginação é aumentar o grau de
multiprogramação dos sistemas computacionais, o que nos leve a uma superalocação de memória.
• Isso ocorre quando um processo que está em
execução dispara um falha de página. O SO determina onde está a página no disco, mas
descobre que não existe quadros disponíveis na memória principal.
Substituição de Página
• O que fazer?
• Terminar o processo
• Retirar um processo inteiro da memória,
diminuindo a multiprogramação (Thrashing)
Substituição de Página
• A substituição de página consiste em:
• Se nenhum quadro estiver disponível, encontramos
um que não esteja sendo usado e o liberamos.
• Podemos liberar um quadro escrevendo seu
conteúdo no swap space e alterando a tabela de página para indicar que a página não está mais na memória.
• Podemos utilizar o espaço liberado para manter a
Substituição de Página
• Se nenhum quadro estiver livre, a substituição aumenta o
tempo para tratamento da falta de página.
• São realizadas 2 transferência de página (uma para fora
da memória e outra pra dentro).
• Isso ocasiona o aumento do tempo acesso efetivo da
memória.
• Solução: bit de modificação (ou bit de sujo)
• indica se a página que está na memória foi modificada
Substituição de Página
• Cada sistema operacional possui seu próprio esquema
de substituição.
• Os algoritmos são avaliados através da taxa de falha
de página.
• Avaliamos um algoritmo executando-o em um
determinado conjunto de referências à memória e calculamos a quantidade de falhas de página.
• Esse conjunto de referência é denominado de string
Substituição de Página
• Se utilizarmos 100 bytes por página, podemos
reduzir a string de referência para:
• 1, 4, 1, 6, 1, 6, 1, 6, 1, 6, 1
0100 0432 0101 0612 0102 0103 0104 0101 0611 0102 0103 0104 0101 0610 0102 0103 0104 0101 0609 0102 0105
Substituição de Página
• Para determinar a quantidade de falhas de
páginas para um determinada string de referência e algoritmo de substituição, precisamos saber a
quantidade de quadros disponíveis.
• Quanto mais quadros disponíveis, menor o número
Substituição de Página
• Serão apresentados diversos algoritmos de
substituição de página
• Com a finalidade de compará-los, vamos adotar: • String de referência:
• 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 • Três quadros na memória
FIFO
• Algoritmo mais simples de substituição • Substitui a página mais antiga
FIFO
• Algoritmo mais simples de substituição • Substitui a página mais antiga
FIFO
• Desvantagens:
• Nem sempre o desempenho é bom
• A página escolhida para substituição pode ser
uma página que é usada com freqüência.
• Isso causaria uma nova substituição de página
quase que imediatamente.
FIFO
• Considere a seguinte string de referência: • 1,2,3,4,1,2,5,1,2,3,4,5
Algoritmo Ótimo
• Um algoritmo de substituição de página ótimo
possui a menor taxa de falha de página de todos os algoritmos
• Não sofre a anomalia de Belady
• Também chamado de OPT ou MIN
• Consiste em substituir a página que não será
Algoritmo Ótimo
• Esse algortimo é melhor ou pior do que o FIFO? • Quantas falhas de página?
Algoritmo Ótimo
• Esse algortimo é melhor ou pior do que o FIFO? • Melhor
• Quantas falhas de página? • 9
Algoritmo Ótimo
• Nenhum algoritmo de substituição é melhor pode
processar essa string de referência em três quadros com menos de nove falhas.
• No entanto, ele é difícil de implementar já que é
preciso ter um conhecimento prévio de toda string de referência.
• Por ser um algoritmo ótimo, ele é mais usado para
LRU
• O LRU é uma aproximação do algoritmo OPT
• Ao invés de utilizar a hora que a página deverá ser
utilizada (OPT), utilizamos a informação do passado recente.
• Ou seja, substituimos a página que não foi usada
LRU
• Nessa caso, o algoritmo LRU produz 12 falhas de
página.
LRU
• Podemos implementar o LRU de duas formas:
• Contadores: a cada tabela de página associamos um
contador. A cada referência da página, esse contador é incrementado. Será substituída a página com menor
valor do contador.
• Pilha: Nessa técnica é mantida uma pilha de números
de página. Sempre que uma página é referenciada ela vai para o topo da pilha. A página substituída será
aquela no final da pilha.
Aproximação LRU
• Nem sempre o hardware permite implementar um
mecanismo como o do LRU.
• Nestes casos, podemos utilizar um hardware mais
simples para implementar os algoritmos de substituição.
• Os resultados são aproximados aos valores do
Aproximação LRU
• Existem três métodos:
• Algoritmo de bits de referência • Algoritmo de segunda chance
Aproximação LRU
• Bit de referência
• Cada página é referenciada por um bit, inicialmente = 0 • Quando uma página é referenciada, marca-se seu bit de
referência para 1
• A substituição será feita na página que tiver o bit de
referência igual a 0 (se existir).
• No entanto, não se sabe a ordem.
• Uma outra opção é usar 8 bits permitindo obter informações
Aproximação LRU
• Algoritmo de segunda chance (também chamado de algoritmo de relógio)
• Consiste em um algoritmo FIFO
• No entanto, quando uma página for selecionada para substituição analisamos seu bit de referência:
• Se for 0, substituimos essa página
• Se for 1, damos uma segunda chance • Marcamos o bit como zero
Aproximação LRU
• Algoritmo da segunda chance melhorado
• Funciona da mesma forma que o algoritmo segunda chance,
no entanto ao invés de considerar apenas um bit, considera um par ordenado de bits
(bit de referência, bit modificação):
• (0,0): nem usada recentemente e nem modificada • (0,1): não usada recentemente, mas modificada
• (1,0): usada recentemente, mas ainda não modificada • (1,1) usada recentemente e modificada
Aproximação LRU
• Algoritmo da segunda chance melhorado
• Funciona da mesma forma que o algoritmo segunda chance, no entanto ao invés de considerar
apenas um bit, considera um par ordenado de bits (bit de referência, bit modificação):
• (0,0): nem usada recentemente e nem modificada • melhor página para substituir
• (0,1): não usada recentemente, mas modificada
• não tão bom, pois a página precisará ser escrita antes de substituir • (1,0): usada recentemente, mas ainda não modificada
• é provável que seja usada novamente • (1,1) usada recentemente e modificada
• é provável que logo seja usada novamente, e a página terá de ser escrita no disco
Contagem
• Algoritmo que mantém um contador do número de referências
feitas a cada página.
• Pode ser de dois tipos:
• LFU (Least Frequently Used - Menos frequentemente usada) • Substitui a página com menor valor do contador
• MFU (Most Frequently Used - Mais frequentemente usada) • Baseado no argumento de que a página com menor
contagem provavelmente acabou de ser trazida para a memória e ainda está para ser usada.
Alocação de Quadros
• Um outro ponto importante do gerenciamento de
memória virtual é como alocamos os quadros entre diversos processos?
• A alocação de quadros é limitada:
• Não podemos alocar mais do que a quantidade total
de quadros disponíveis (ao menos que tenha compartilhamento de quadros)
• Cada processo deve receber uma quantidade
Alocação de Quadros
• A alocação de uma quantidade mínima está
diretamente relacionada ao desempenho.
• A medida que a quantidade de quadros alojados
diminui, a taxa de falha de página aumenta, atrasando a execução do processo.
• A quantidade mínima de quadros é definida pela
Alocação de Quadros
• Algoritmos para alocação
• Alocação igual (equal allocation)
• Modo mais simples de dividir os quadros entre
processos.
• Os quadros são divididos em fatias iguais: • m quadros, n processos
Alocação de Quadros
• Algoritmos para alocação• Alocação igual (equal allocation)
• Não garante uma boa divisão dos quadros entre os processos • Considere o seguinte cenário:
• Quadros livres: 62 | Tamanho do quadro: 1KB • Processo A: 10KB | Processo B: 127 KB
• Divisão: 31 quadros para A e 31 para B • Podemos dividir melhor? Como?
Alocação de Quadros
• Algoritmos para alocação
• Alocação proporcional (proportional allocation)
• Alocamos a quantidade disponível a cada processo de acordo com seu tamanho.
• O número de quadros para cada processo é dado por:
• a_i = s_i/S x m, onde S é tamanho total da memória virtual, s_i o tamanho do processo i e m o número de quadros
disponíveis
• No exemplo do slide anterior, teríamos 4 quadros para o processo A e 57 para o processo B
Alocação de Quadros
• Algoritmos para alocação
• Alocação proporcional (proportional allocation)
• Nesse tipo de alocação podemos variar o
número de quadros por processo de acordo com o grau de multiprogramação
• Maior grau -> os processos perdem quadros
Alocação de Quadros
• Algoritmos para alocação
• Alocação proporcional (proportional allocation)
• Pode ser usado a prioridade para distribuir os quadros
• Processos com maior prioridade recebem mais quadros
• Pode usar também a combinação de ambas informações: tamanho e prioridade.
Alocação global versus local
• Alocação global: permite que um processo
selecione um quadro de substituição do conjunto de todos os quadros; ou seja, um processo pode apanhar um quadro do outro.
• Alocação local: exige a cada processo selecionar
somente a partir do seu próprio conjunto de quadros alocados.
Thrashing
• Acontece quando o processo não possui páginas
suficientes
• Um processo está realizando thrashing quando
este está gastando mais tempo fazendo paginação do que executando.
• O thrashing resulta em grandes problemas de
Thrashing
• Se um processo não possui páginas suficientes, a taxa de falha de página será alta. Isso ocasiona:
• Baixa utilização da CPU
• O sistema operacional pensa que é necessário aumentar o grau de multiprogramação e adiciona um novo processo ao sistema • Essa ação aumenta ainda mais a taxa de falha de página que
resulta e uma utilização mais baixa de CPU
• Essa nova ação leva ao SO adicionar mais um processo ao
sistema e assim por diante em um ciclo que prejudica cada vez mais o sistema.
Thrashing
• Uma forma de evitar o thrashing é controlar a
freqüência de falha de página
• Se a taxa passar um determinado threshold
máximo fornecemos mais quadros
• Se a taxar passar um determinado threshold
Arquivos Mapeados na
Memória
• Podemos utilizar o espaço de endereçamento virtual
para endereçar arquivos que são muito usados.
• O mapeamento de um arquivo na memória é realizado
pelo mapeamento de um bloco de disco a uma página (ou páginas) na memória.
• A atualização do arquivo no disco é realizado
periodicamente.
• Quando o arquivo é fechado todos os dados são
Arquivos Mapeados na
Memória
• Esse esquema permite o compartilhamento do
Outras Considerações
• Pré paginação
• Tamanho da página • Alcance da TLB
• Estrutura do programa