Trabalho II da disciplina de Sistemas Operacionais. Simula os algoritmos de substituição de página Ótimo e FIFO, calculando o número de faltas de página (page faults) para uma sequência de acessos a memória, dada uma memória física de tamanho limitado.
- Python 3.8 ou superior
- Biblioteca
zstandard— necessária apenas para arquivos.zst:
pip install zstandardpython3 main.py <arquivo_de_entrada> <tamanho_memoria> [--pagina TAMANHO_BYTES]Argumentos:
arquivo_de_entrada: arquivo com a sequência de acessos a memória (um endereço hexadecimal por linha, ex:0x60a1c35d8209). Aceita.txt(texto simples) ou.zst(comprimido com Zstandard, lido em streaming — sem extração em disco).tamanho_memoria: tamanho da memória física simulada. Aceita sufixosKB,MB,GB(ex:8MB,1GB,32KB,8KB)--pagina(opcional): tamanho da página em bytes (padrão: 4096 = 4KB)
# Arquivo comprimido pequeno (demo)
python3 main.py entradas_txt/acessos-Demo0.txt.zst 8MB
# Arquivo comprimido grande (leitura em streaming, sem extrair para disco)
python3 main.py entradas_txt/acessos-A0.txt.zst 8MB
# Arquivo de texto simples com tamanho de página personalizado
python3 main.py entradas_txt/teste_grande.txt 1MB --pagina 8192Saída esperada:
RELATÓRIO:
A memória física comporta 2048 páginas.
Há 10 acessos no arquivo.
Há 3 páginas distintas no arquivo.
Estimativa do tamanho da tabela de páginas (1 nível): ... bytes (... KB).
Com o algoritmo ÓTIMO ocorrem N faltas de página.
Com o algoritmo FIFO ocorrem M faltas de página,
Desempenho do FIFO em relação ao ÓTIMO: X.XX%
Deseja listar o número de carregamentos (s/n)?
Ao responder s, é exibida uma tabela com o número de carregamentos de
cada página para os dois algoritmos.
Os arquivos de entrada ficam no diretório entradas_txt/:
| Arquivo | Formato | Descrição |
|---|---|---|
acessos-Demo0.txt.zst |
.zst |
Arquivo de demonstração pequeno |
acessos-A0.txt.zst |
.zst |
Conjunto de acessos A0 |
teste_grande.txt |
.txt |
Arquivo de texto simples para testes |
Nota: arquivos
.zstnão precisam ser extraídos — o simulador os lê em streaming diretamente.
- Ótimo: a cada falta de página, remove a página que será usada mais
tarde no futuro entre as que estão na memória (ou que nunca mais será
usada). É o algoritmo ideal teórico — impossível de implementar em um
sistema real, pois exigiria conhecer o futuro, mas serve como referência
de comparação. Implementado com pré-processamento de ocorrências futuras
e seleção via
max()sobre um dicionário de próximos usos. - FIFO (First-In, First-Out): a cada falta de página, remove a página que está há mais tempo na memória.
- Listagem de carregamentos por página: mostra quantas vezes cada página precisou ser carregada na memória, para cada algoritmo.
- Estimativa do tamanho da tabela de páginas (1 nível): calcula o
tamanho que uma tabela de páginas de 1 nível ocuparia, considerando um
espaço de endereçamento de 48 bits e 8 bytes por entrada da tabela
(valores ajustáveis em
main.py, constantesBITS_ENDERECO_PADRAOeTAMANHO_ENTRADA_TABELA).
.
├── main.py # ponto de entrada (CLI), orquestra a simulação e o relatório
├── parser.py # leitura do arquivo de entrada (.txt ou .zst) e conversão de endereços em páginas
├── simulator.py # implementação dos algoritmos Ótimo e FIFO
├── utils.py # parsing de tamanhos (8MB, 1GB...) e formatação de saída
└── entradas_txt/ # arquivos de entrada (.txt e .zst)
├── acessos-Demo0.txt.zst
├── acessos-A0.txt.zst
└── teste_grande.txt
- Cada endereço de memória é convertido em número de página através da
divisão inteira
endereco // tamanho_da_pagina. - O algoritmo Ótimo usa pré-processamento (índice de ocorrências futuras de
cada página) e seleciona a vítima com
max()sobre um dicionário (prox_uso_memoria) que rastreia o próximo uso de cada página presente na memória. - Os arquivos
.zstsão lidos viazstandard.ZstdDecompressor.stream_readercommax_window_size=2 GB, permitindo a leitura de streams grandes sem extrair o conteúdo para o disco.