Professional Documents
Culture Documents
1
Estágios para Tratar o problema de deadlock................................................................2
Prevenir...............................................................................................................................2
Evitar...................................................................................................................................2
Detectar e Recuperar............................................................................................................2
Gerência de Memória......................................................................................................3
1) Sistema Monoprogramado........................................................................................3
Alocação Contígua e Inteira.................................................................................................3
2) Sistema Multiprogramado (Princípio de Alocação Inteira e Contígua )...................4
2.1) Partições Fixas..............................................................................................................4
2.2) Partições Variáveis.......................................................................................................4
Swapping.......................................................................................................................5
Processos que sofreram Swapping.......................................................................................6
Multiprogramação com Swapping.......................................................................................6
2.3) Sistema Multiprogramado (Alocação não Inteira e Não Contígua)..............................7
2.4) Paginação.....................................................................................................................8
Mecanismo de Tradução de endereços.................................................................................8
TLB...................................................................................................................................10
O que tem em uma entrada da tabela de páginas?..............................................................11
Paginação por Demanda....................................................................................................12
Técnica de Prefect..............................................................................................................12
Fragmentação de uso.........................................................................................................12
2.5) Segmentação...............................................................................................................13
Mecanismo de Tradução de Endereços..............................................................................14
O que tem em uma entrada da tabela de segmentos?.........................................................15
Paginação x Segmentação..................................................................................................15
2.6) Segmentação Paginada...............................................................................................16
DeadLock
Erro de sincronia de threads, processos.
P1 P2
Fecha o
ciclo
Não pode acontecer
P2 pede a impressora,
bloqueado na fila esperando
impressora P1
1
Dos recursos (ex.: impressora) que não são compartilháveis, o SO tem que alocar o
recurso se vc pedir um que já está sendo alocado. O SO coloca na fila.
Neste caso, não é reeo de programação. Não sei que outro processo pediu impressora.
Este tipo de deadlock o SO tem que tratar.
Prevenir
Ciclo de segura e espera: garantir que nunca aconteça.
1. Se eu estiver segurando um recurso, e precisar de outro, libero o 1º.
2. Espero por todos os recursos. Quando todos estiverem liberados, aí eu seguro.
(mais ineficiente)
Evitar
Não posso segurar um recurso de ordem menor pra não deixar o ciclo fechar.
R0
R6
R1
R5
R2
R4
R3
Detectar e Recuperar
De tempos em tempos rodo um algorítmo para ver se houve deadlocks.
1ª Opção: matar o processo
2ª Opção: desalocar todos os recursos de um processo
2
Gerência de Memória
Outro módulo do SO que gerencia a memória principal.
1) Sistema Monoprogramado
Como é o gerenciamento de memória?
Quase não tem, muito simples. A memória é toda do programa, tirando a área do
SO.
Preciso de um mecanismo de proteção de memória para garantir que o processo não vai
acessar a área do SO.
E a área de dados?
3
2) Sistema Multiprogramado (Princípio de Alocação Inteira e Contígua )
Programa vai para a memória de maneira inteira e contígua por ausa do modo de
endereçamento que a CPU tem.
Problemas de: P2
Fragmentação de memória
Interna (espaço que sobra dentro da partição)
P3
Externa (sobra uma fragmentação inteira) –
exemplo: programas querendo rodar mas não
cabem.
P4
Para Amenizar:
1. Compactação (como desfragmentação no disco)
Empurra tudo.
Problema: Overhead muito grande, caro, muito P3
deslocamento, muita E/S.
2. Algorítmo de alocação P4
4
P1 First-fit – primeiro que encaixar (mais
10K rápido, mais usado). Tende a deixar áreas
livres para alocar mais em cima ou mais
embaixo.
P4
5K
Best-Fit – o que tiver tamanho mais
P2 parecido (gera fragmentos tão pequenos
6K que não cabe ninguém)
Swapping
O que acontece quando todos os processos estão bloqueados? (por exemplo,
esperando P1 terminar de usar a impressora)
Fica todo mundo bloqueado na fila para impressora.
P1 está usando entrada e saída, não está usando a CPU.
A memória acabou, não tem espaço pra mais ninguém. Pra evitar esse tipo de problema
o SO criou o conceito de swapping: O processo temporariamente saiu da memória
(área dele foi liberada), e nessa área livre pode ser carregado outro programa.
Ex.: Tirar P4 temporariamente e colocar P5 pra rodar.
O processo referente a esse código que saiu da memória pode continuar ativo?
Ou seja, o processo pode estar bloqueado, pronto e em execução; se o processo estava
bloqueado, depois de sofrer um swapping, ele pode continuar bloqueado? Não.
5
Quais processos não podem sofrer swapping?
Em execução, se estiver fazendo E/S, pois há uma comunicação entre a área do processo
na memória e o dispositivo.
Execução
Pronto Bloqueado
Suspenso Suspenso
Pronto Bloqueado
Máquina de Estados
Deixar a memória pra um único programa, o que está rodando. Na hora em que este
programa sai do estado de execução, o SO faz um swap out e um swap in: trocas os
programas na memória.
6
Swap in
SO
Overhead
muito alto
P1
Swap out
Troca de contexto: quando muda o processo que está rodando. Ocorre uma interrupção
e o SO decide colocar outro, trocando o contexto dos registradores da CPU.
7
• Não limitar o tamanho do programa ao tamanho da memória (benefício pro
programador que não tem mais que se preocupar com o tamanho da área de
dados que ele vai gerar)
Na hora em que eu gero o código eu tenho que gerar dentro do código do programa
onde estão os dados, em que posição eles estão. Mas com o código embaralhado na
memória. Como o compilador vai gerar os endereços se na hora que eles forem pra
memória vão todos embaralhados? Aí surgiu o conceito de Memória Virtual.
O compilador gera endereços que não têm nada a ver com os endereços de MP. São
end. Virtuais. Que em tempo de execução a CPU tem que ser capaz de traduzir um end.
Virtual p/ um end. Real.
2.4) Paginação
Programas são divididos em páginas, de um tamanho determidado. A MP é dividida em
frames (divisão lógica).
8
do processo, onde ela está na MP. A partir dessa tabela a CPU pode fazer a tradução
de end. Virtual p/ real.
• A CPU pega o end. Virtual que vem do código do programa. Então a CPU parte
este end. De acordo com o tamanho da página e divide em duas partes: número
da página e deslocamento dessa página (P e D).
Se não estiver, interrupção para chamar o SO para ele carregar essa página do disco pra
mem. e atualizar a tabela. (interrupção de falta de página)
Carregar um processo
1º passo) O SO cria uma tabela de páginas com entrada pra cada página do processo.
Todas com o bit de residência zerado. Não jogo nada na memória. E guardo no contexto
do processo onde eu coloquei essa tabela.
9
TLB
Problema (acima): Aumenta muito (dobra) a quantidade de acesso à memória. Pra
cada endereço que vou acessar, eu acesso a memória antes.
Solução: evitar a ida à memória colocar essa tabela numa cache, uma cache só pra
tradução de endereços (TLB).
Então a CPU tem que ter dentro dela uma TLB (Translation look-aside Buffer), que é o
buffer onde eu vou procurar informação para a tradução.
É uma mem. cache associativa, não é busca por endereço, é busca por conteúdo.
Caso eu não encontre P, falha na TLB, aí eu vou para o outro mecanismo e o hardware
automaticamente atualiza a TLB.
TLB
P 1|F
O acesso à tabela de páginas é feito primeiramente na TLB, onde a CPU vai perguntar
se tem alguma entrada relativa à página P:
2º Cenário (Dado na TLB, mas página não está na MP): Se tiver entrada relativa à
página P, e a página P não está na MP, interrupção de falta de página. SO vai tratar
interrupção, carrega a página na memória, e atualiza tabela e carrega mesma informação
na TLB. (interrupção de falta de página).
3º Cenário (Dado não está na TLB e página está na MP): Se não tiver entrada
relativa à página P, miss na TLB, o Hardware trata esse miss como? Pego no registrador
origem onde esta tabela está na memória. Põe no endereço B+P a entrada. (TLB miss)
4º Cenário (Dado não está na TLB e página não está na MP): (TLB miss +
interrupção de falta de página)
Pode acontecer de estar na TLB mas a página não está na memória. Quando
alguém tirou P de lá.
10
Quando troco de P1 pra P2, a TLB tem que ser esvaziada, dá um flush na TLB pra
começar com a tabela de P2. É como se invalidasse todas as entradas da TLB, qualquer
acesso à TLB vai dar um miss (vai na MP buscar a informação).
Obs.: Alguns sitemas possuem um dispositivo mais rápido que armazena páginas que
estão saindo e entrando na memória. Pra tornar mais eficiente. Alguns reservam uma
área do disco pq não tem o dispositivo. Mas isso não é memória virtual.
Bits de
Usado pelo SO controle
de acesso
Bit de
modificação
End. da página no disco: (carregado qd monta a tabela de páginas, quando cria o
processo trilha e setor) Facilita a vida do SO, por exemplo: Ele foi chamado por uma
interrupção de falta de página, e vê onde a página está no disco transfere pra um
determinado frame. Depois que a transferência acabar ele escreve na tab. em que frame
ele colocou e escreve 1 no bit de residência.
RWE: leitura, escrita e execução. 110, pode ler e escrever, não executar. Útil para
páginas compartilhadas por vários processos. O SO pode dar tipos de acesso
diferenciados a um determinado dado.
O que acontece se vc não tem permissão pra escrita W=0, e vc está tentando
escrever naquela página? Interrupção, erro de execução.
11
Toda pág. entra na memória com o bit W (write) zerado. A 1ª tentativa de
escrita, em vez de gerar uma interrupção de erro, o SO vai lá, pega o bit de
modificação e libera a escrita na página.
Técnica de Prefect
Buscar páginas com antecedência para evitar interrupção de falta de página. Tenta
antecipar, chutar a página que vai precisar antes dela ser necessária, traz pra memória.
Se acertar, evitou interrupção por falta de página. Se errar, perdeu tempo fazendo
operação de E/S, gastou espaço de memória atoa.
Na cache, vc tende a usar as linhas seguintes, então vc traz um bloco de linhas da cache.
Mas com página, essa localidade espacial não é tão forte, pq agora estou trabalhando
com unidades de 4k, 8k, 16k... Não necessariamente o fato de vc estar usando esta
página, vc vai usar a seguinte. Então usar a técnica de localidade espacial não é uma
boa idéia.
Ex de técnica usada: compilador ajuda, ele entende perfeitamente o código, então ele
gera dicas pro SO pra quando ele vai fazer prefect. Por exemplo, quando há um loop,
num vetor. Pelo índice que vc está acessando o vetor, vc sabe qual página vc vai
precisar usar na memória. Então se seu programa for bem comportado em termos de
vetor, o compilador sabe adiantar pro sistema qual página ele vai usar em seguida. Por
enquanto melhor forma, mas pouco utilizado.
Fragmentação de uso
12
Divisão Arbitrária
MP
Só por causa deste
pedacinho carrega as
duas páginas para que
a rotina 1 fique na
memória.
Fragmentação de uso
Não vou usar, mas é um desperdício diferente da fragmentação de memória, que era
uma área vazia que ninguém consegue usar. Na fragmentação de uso, aquela área não
está livre, mas não serve pra nada. E ela vem pra memória por conta da divisão
arbitrária da página. Por exemplo qd a página quebra uma rotina no meio.
2.5) Segmentação
Exatamente por conta dessa divisão arbitrária da paginação, que pode levar ao problema
de fragmentação de uso, e não permite que eu faça carregamentos na memória por
estrutura do programa, seja uma rotina, uma estrutura de dados, surgiu uma outra forma
de organização, baseada no conceito de memória virtual que é chamada de
segmentação.
1 5 Baseado no conceito de
memória virtual, ou seja, o
programa é carregado de
forma não inteiro e não
contíguo na memória. Em
outras palavras, dividido
em partes e as partes
podem ficar em qualquer
13
posição de memória, pq os endereços do programa são desvinculados dos endereços de
memória.
Só que a diferença é que agora quando eu precisar de uma rotina, vai direto aquela
rotina pra memória. Posso controlar acesso por estrutura de dados. Tenho controle sobre
as estruturas do programa.
Agora a CPU, do endereço virtual, tem que distinguir em que segmento ele está, e
qual o deslocamento dentro do seguimento. Como?
A CPU não tem como distinguir de um endereço o que é segmento e o que é
deslocamento. É o contrário, o compilador já gera os endereços dessa forma. Então o
compilador em vez de gerar os endereços sequencialmente, ele gera o endereço com
dois campos, um com o número do segmento, outra com o deslocamento.
• Pelo número do segmento a CPU acessa a TLB. Vai procurar onde o segmento S
está ma MP.
• Supondo que está na TLB, e que o segmento está na MP, a partir do endereço S’.
O endereço real é S’ mais D. Não é concatenado (concatenar era o mesmo que
multiplicar pelo tamanho da página e somar D). Não pode concatenar pq S’ é um
endereço qq de memória.
Obs.: Na paginação era garantido que um deslocamento não podia ficar
fora da página pelo número de bits do campo deslocamento. Na
segmentação isso não é possível, pois o campo deslocamento tem o
14
número de bits do maior deslocamento possível, então eu posso dentro
daquele deslocamento gerar um nº de bits fora do meu segmento.
Falta proteção de memória:
colocar na tabela de segmentos o tamanho do segmento (T) e,
antes de fazer a soma (S’+D), tenho que comparar se o
deslocamento é menor que o tamanho. Se for, eu somo S’ com D,
senão, erro! Interrupção: vc está tentando acessar uma área que
está fora do segmento.
TLB
S 1|S’|T
É o hardware quem determina que o sistema vai ser paginado ou segmentado, não o SO.
Como o processador implementou. O SO tem que acompanhar o que o hardware faz.
Bits de
Usado pelo SO controle
de acesso
Bit de
modificação
Paginação x Segmentação
Paginação
Vantagens: a divisão é em páginas de tamanhos fixos, na hora de carregar é muito
simples.
Desvantagem: fragmentação de uso e dificuldade de controlar as estruturas do
programa.
Segmentação
15
Vantagens: não tem fragmentação de uso e é possível controlar as estruturas do
programa.
Desvantagens: carregamento é mais complicado pq segmento têm tamanhos diferentes.
Fragmentação de memória.
Vou procurar na TLB informações sobre segmento S e página P. Na TLB eu não posso
ter 2 níveis de tabela. Pq? Pq eu teria que ter 2 TLB’s, que torna o hnardware
extremamente caro. Como a busca é associativa, eu posso fazer a busca na TLB pelo par
S|P. (na TLB tenho um merge das duas tabelas.)
Descobri que essa página desse segmento tá na memória no frame F. O endereço real é
F concatenado com D.
TLB
S|P 1|F
16
17