Trabalho da disciplina de Sistemas Operacionais no SENAI CIMATEC, novembro de 2022. Feito em dupla com Guilherme Marinho.
O WSClock é um algoritmo de substituição de páginas: quando a memória enche e o sistema precisa carregar uma página nova, ele decide qual das que já estão lá vai embora. A ideia é combinar o relógio (páginas num anel, um ponteiro girando) com o conceito de working set, o conjunto de páginas que o processo usou recentemente. Página fora do working set pode sair; página dentro dele, não, porque tirá-la garante uma falta de página logo em seguida.
Esta simulação é interativa: você monta o anel de frames e vai disparando referências e substituições na mão, vendo o estado das páginas a cada passo.
Cada página é um nó de uma lista circular com três campos: id, o instante
da última referencia, e o bit R (foi referenciada desde a última varredura?).
O relógio virtual não anda de um em um: a cada referência ele avança um valor aleatório de 1 a 5. Isso simula o tempo que passa entre acessos e faz as páginas envelhecerem em ritmos diferentes, que é o que torna a simulação interessante.
A substituição (substituir_pagina) percorre o anel a partir do ponteiro:
- Página com
R = 1→ zera oRe segue em frente. Ela foi usada há pouco; ganha uma segunda chance. - Página com
R = 0ereferencia < tempo_atual - Δ→ está fora do working set. É esta que sai. - Voltou ao ponto de partida sem achar nenhuma → todas estão no working set. Substitui a primeira, porque alguma tem que sair.
O Δ (working set) é fixo em 3, no #define Delta do cabeçalho. Mexer nele muda
bastante o comportamento: Δ grande protege mais páginas e força mais o caso 3.
g++ -o wsclock src/Main.cpp
./wsclockO programa pergunta quantos frames criar e o instante inicial de cada um. Depois disso aceita:
| Tecla | O que faz |
|---|---|
R |
Referencia uma página: marca R = 1 e atualiza o instante |
S |
Roda o algoritmo e substitui uma página |
W |
Mostra o tempo atual do relógio |
E |
Imprime o anel inteiro com os atributos de cada página |
F |
Encerra |
src/Main.cpp usa system("pause") e system("cls"), que são comandos do
Windows, onde o trabalho rodou. No Linux compila e funciona, mas essas duas
chamadas não fazem nada além de imprimir um erro do shell.
docs/ tem o PDF entregue junto com o código.