DEE355 – Sistemas Operacionais
Universidade Federal do Paraná (UFPR)
Prof. Jéfer – jefer@ufpr.br
Função do Sistema Operacional:
Objetivos:
Endereço Lógico: Gerado pelo processador durante a execução de um programa; reflete a visão do programa.
Endereço Físico: Local real na memória RAM, definido após a tradução pela MMU.
MMU (Memory Management Unit): Hardware responsável por converter endereços lógicos em físicos, usando registradores de relocação.
A técnica de partições fixas consiste em dividir a memória RAM em blocos de tamanho fixo, chamados de partições. Cada processo é carregado em uma dessas partições, e não pode usar mais memória do que a capacidade da partição que lhe foi atribuída.
Exemplo: Suponha que um processo queira acessar o endereço lógico 14.257
. Ele está carregado na partição 3, cujo endereço inicial na memória física é 110.000
. O hardware (MMU) soma esses valores:
Endereço físico = endereço base + endereço lógico = 110.000 + 14.257 = 124.257
.
Esse é o endereço real que será acessado na RAM.
Vantagem: É uma técnica simples de implementar, pois não exige estruturas complexas de gerenciamento.
Desvantagem: Pode causar fragmentação interna — ou seja, sobras de memória dentro da partição que não são utilizadas, desperdiçando espaço.
Na segmentação, a memória é organizada de forma lógica, refletindo a estrutura dos programas. Em vez de dividir a memória em blocos fixos (como na paginação), ela é separada em segmentos, como:
Cada segmento possui dois parâmetros:
O processador utiliza essas informações para verificar se o acesso está dentro dos limites válidos.
Vantagem: Maior flexibilidade e permite compartilhamento de código entre processos, como bibliotecas.
Desvantagem: Pode causar fragmentação externa, já que os segmentos têm tamanhos diferentes e são alocados dinamicamente.
🧮2
300
5.000
e limite 1.000
300 < 1.000
→ Acesso válido5.000 + 300 = 5.300
Exemplos de processadores que utilizam a alocação por segmentos incluem o 80.386 e seus sucessores (486, Pentium, Athlon e processadores correlatos).
No modelo de alocação paginada, tanto o espaço de endereços lógicos (gerado pelo processo) quanto a memória física (RAM) são divididos em blocos de tamanho fixo:
O mapeamento entre as páginas de um processo e os quadros disponíveis na memória física é feito por meio de uma tabela de páginas, que fica associada a cada processo. O processador localiza essa tabela usando o registrador chamado PTBR (Page Table Base Register).
Vantagens: evita a fragmentação externa e simplifica a alocação da memória.
4
, com resto 784
(offset)(7 × 4.096) + 784 = 28.656
A divisão do espaço de endereçamento lógico de um processo em páginas pode ser feita de forma muito simples: como as páginas sempre têm 2n bytes de tamanho (por exemplo, 212 bytes para páginas de 4 KBytes) os n bits menos significativos de cada endereço lógico definem a posição daquele endereço dentro da página (deslocamento ou offset), enquanto os bits restantes (mais significativos) são usados para definir o número da página. Por exemplo, o processador Intel 80.386 usa endereços lógicos de 32 bits e páginas com 4 KBytes; um endereço lógico de 32 bits é decomposto em um offset de 12 bits, que representa uma posição entre 0 e 4.095 dentro da página, e um número de página com 20 bits. Dessa forma, podem ser endereçadas 220 páginas com 212 bytes cada (1.048.576 páginas com 4.096 bytes cada).
🔍Como as páginas têm tamanho fixo (geralmente uma potência de 2, como 2¹² = 4.096), a divisão do endereço lógico é simples:
Por exemplo, com endereços lógicos de 32 bits:
quadro × tamanho da página + offset
A Memory Management Unit (MMU) é um componente essencial dos sistemas operacionais, responsável por converter endereços lógicos em endereços físicos na memória RAM. Esse processo de tradução é realizado dinamicamente e envolve o uso de tabelas de páginas e, frequentemente, de uma TLB (Translation Lookaside Buffer) para acelerar as buscas. Se a página não estiver na RAM, ocorre um "page fault".
(7 × 4096) + offset
.
Considere o seguinte exemplo:
0x12345 >> 12 = 0x12
(18 em decimal)0x12345 & 0xFFF = 0x345
(837 em decimal)(7 × 4096) + 837 = 28685
(0x6F35 em hexadecimal)A animação abaixo ilustra esse processo de tradução de endereços:
A memória virtual é uma técnica que permite que processos utilizem mais memória do que a fisicamente disponível no sistema. Ela divide a memória em páginas e transfere páginas não utilizadas para o disco (swap), liberando espaço na memória RAM.
A memória virtual é uma técnica que permite que os processos usem mais memória do que a quantidade física instalada (RAM). Para isso, o sistema operacional armazena temporariamente páginas de memória em um espaço no disco, chamado swap.
Quando um processo acessa uma página que não está na RAM, ocorre uma falta de página (page fault). Nesse momento:
Esse processo é transparente para o programa, mas afeta diretamente o desempenho — quanto mais page faults, maior o tempo de espera.
🧮Considere um sistema com 3 frames disponíveis na RAM e a seguinte sequência de referências a páginas:
1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5
Utilizando o algoritmo FIFO (First-In, First-Out), temos:
Total de Page Faults: 9
O algoritmo LRU (Least Recently Used) substitui a página que está na memória há mais tempo sem ser usada. Ele tenta prever que páginas não serão utilizadas em breve, com base no uso passado.
Vamos usar a mesma sequência de referências e 3 frames na RAM:
1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5
Acompanhe a execução passo a passo:
Total de Page Faults: 10
Algoritmo | Descrição | Page Faults | Observações |
---|---|---|---|
FIFO | Remove a página que está na memória há mais tempo (ordem de chegada). | 9 | Simples, mas pode remover páginas ainda úteis. |
LRU | Remove a página que não é usada há mais tempo. | 10 | Mais eficiente que FIFO, mas com maior custo de implementação. |
NRU | Remove uma página que não foi referenciada recentemente, priorizando páginas não modificadas. | Varia (depende do clock) | Usa bits de referência e modificação; eficiente e comum em sistemas reais. |
Ótimo | Remove a página que será usada mais tarde no futuro. | 7 | Melhor resultado teórico, mas não pode ser implementado na prática. |
O swapping é o processo de mover páginas de memória RAM para o disco (swap space) e vice-versa. Ele é essencial para sistemas com memória física limitada, mas pode impactar o desempenho devido ao tempo de acesso ao disco.
Suponha que o tempo de acesso à RAM seja de 100 ns e o tempo de acesso ao disco seja de 10 ms (10.000.000 ns). Se ocorrer um page fault, o tempo total para acessar uma página será:
Tempo de acesso = Tempo de busca no disco + Tempo de carregamento na RAM
Tempo de acesso = 10 ms + 100 ns ≈ 10 ms
Figura 1: Diagrama de memória virtual e swapping.
Figura 2: Funcionamento da memória virtual com páginas e frames.
Quando a memória RAM está cheia e ocorre um page fault, o sistema operacional precisa decidir qual página remover para liberar espaço. Os algoritmos de substituição determinam essa decisão, impactando diretamente o desempenho do sistema.
Considere a seguinte sequência de referências a páginas: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5
.
Com 3 frames de memória, calcule o número de page faults para cada algoritmo:
Abaixo está uma animação interativa que simula o funcionamento do algoritmo FIFO. Clique no botão para avançar as referências e observe como as páginas são substituídas.
Status: Aguardando início...
Figura : Substituição de Página.
Essa técnica combina o melhor de dois mundos: a organização lógica da segmentação com o gerenciamento físico eficiente da paginação.
Cada processo é dividido em segmentos lógicos (ex.: código, dados, pilha), e cada segmento é dividido em páginas. O sistema operacional então utiliza uma tabela de segmentos, onde cada entrada aponta para a tabela de páginas do segmento correspondente.
Endereço lógico: Segmento = 1, Página = 3, Offset = 56
- Tabela de segmentos: Segmento 1 → base = 0x1000 (endereço da tabela de páginas)
- Tabela de páginas do segmento 1: Página 3 → quadro = 7
- Tamanho da página: 256 bytes
Endereço físico = (7 × 256) + 56 = 1792 + 56 = 1848
No processador Intel 80386 e sucessores (como Pentium), a segmentação é feita com as tabelas GDT (Global Descriptor Table) e LDT (Local Descriptor Table). Cada entrada contém o base e o limite de um segmento. Ao acessar um segmento, a CPU localiza sua tabela de páginas correspondente.
Exemplo: Endereço lógico = 8.500; tamanho da página = 4.096 bytes.
Página | Quadro |
---|---|
0 | 3 |
1 | 1 |
2 | 5 |
Exemplo: Segmento 1, Offset 200; Base = 10.000, Limite = 1.000.
Segmento | Base | Limite |
---|---|---|
0 | 5.000 | 2.000 |
1 | 10.000 | 1.000 |
2 | 15.000 | 500 |
Linux: Utiliza paginação com tabelas multinível (ex.: 4 níveis em x86_64) e uma abordagem aproximada do LRU.
Windows: Emprega paginação por demanda, gerencia working sets e utiliza um algoritmo de clock modificado.
BSD/FreeBSD: Usa listas de páginas inativas para otimizar a substituição.
Nesta atividade, você vai explorar o gerenciamento de memória no Linux usando comandos de terminal. O objetivo é observar e analisar o uso de memória em um sistema real.
free
- Visão Geral da Memória
free -m
no terminal.free
?top
ou htop
- Uso de Memória por Processo
top
ou htop
.top
: Shift+M
, em htop
: clique no cabeçalho MEM%
).RES
e VIRT
representam?VIRT
muito maior que RES
?ps
- Informações Detalhadas de Processos
ps aux | less
.RSS
e VSZ
.ps
com a do top
.RSS
e VSZ
representam?pmap
- Mapa de Memória de um Processo
top
ou ps
.pmap <PID> | less
.[heap]
, [stack]
)?/proc/meminfo
- Informações Detalhadas do Sistema
cat /proc/meminfo | less
.MemTotal
MemFree
MemAvailable
SwapTotal
SwapFree
Cached
Buffers
Cached
e Buffers
representam?Reflita sobre como o sistema gerencia a memória e como diferentes programas afetam o uso de memória. Discuta a importância do gerenciamento de memória para o desempenho e a estabilidade do sistema.
O gerenciamento de memória é vital para o desempenho dos sistemas operacionais. Técnicas como partições fixas, segmentação, paginação e memória virtual otimizam o uso dos recursos, e algoritmos de substituição são essenciais para manter a performance.
Responda as questões abaixo: