Cálculo do número das páginas virtuais

Jarod Cavalcante
2024-12-07T20:45:34Z

atv4.py

| import pandas as pd
|
| enderecos = [4669, 2227, 13916, 34587, 48870, 12608, 49225]
| tamanho_pagina = 4096 # 4 KiB
|
| tlb = [
| [1, 11, 12],
| [1, 7, 2004],
| [1, 3, 2006],
| [2000, 4, 9]
| ]
|
| tabela_paginas = [
| [1, 5],
| [0, "Disco"],
| [0, "Disco"],
| [1, 6],
| [1, 9],
| [1, 11],
| [0, "Disco"],
| [1, 4],
| [0, "Disco"],
| [0, "Disco"],
| [1, 3],
| [1, 12]
| ]
|
| def simular_memoria(enderecos, tamanho_pagina, tlb, tabela_paginas):
| resultado = []
| tlb_uso = [0, 1, 2, 3]
|
| for acesso in enderecos:
| vpn = acesso // tamanho_pagina
| tlb_hit = False
| tabela_hit = False
| falta_pagina = False
|
| for i, entrada in enumerate(tlb):
| if entrada[0] == 1 and entrada[1] == vpn:
| tlb_hit = True
| tlb_uso[i] = max(tlb_uso) + 1
| break
|
| if not tlb_hit:
|
| if vpn < len(tabela_paginas) and tabela_paginas[vpn][0] == 1:
| tabela_hit = True
| num_fisico = tabela_paginas[vpn][1]
|
|
| lru_index = tlb_uso.index(min(tlb_uso))
| tlb[lru_index] = [1, vpn, num_fisico]
| tlb_uso[lru_index] = max(tlb_uso) + 1
|
| else:
| # Falta de página
| falta_pagina = True
| proximo_num_fisico = max(
| [entrada[2] for entrada in tlb if entrada[0] == 1] +
| [pagina[1] for pagina in tabela_paginas if isinstance(pagina[1], int)]
| ) + 1
|
| if vpn >= len(tabela_paginas):
| tabela_paginas.extend([[0, "Disco"]] * (vpn - len(tabela_paginas) + 1))
|
| tabela_paginas[vpn] = [1, proximo_num_fisico]
|
|
| lru_index = tlb_uso.index(min(tlb_uso))
| tlb[lru_index] = [1, vpn, proximo_num_fisico]
| tlb_uso[lru_index] = max(tlb_uso) + 1
|
|
| resultado.append({
| "Endereço": acesso,
| "VPN": vpn,
| "Acerto TLB": tlb_hit,
| "Acerto Tabela": tabela_hit,
| "Falta Página": falta_pagina,
| "TLB Final": tlb.copy(),
| "Tabela Final": tabela_paginas.copy()
| })
|
| return resultado
| resultado = simular_memoria(enderecos, tamanho_pagina, tlb, tabela_paginas)
|
| df_resultado = pd.DataFrame([
| {
| "Endereço": r["Endereço"],
| "VPN": r["VPN"],
| "Acerto na TLB": r["Acerto TLB"],
| "Acerto na Tabela de Página": r["Acerto Tabela"],
| "Falta de Página": r["Falta Página"]
| } for r in resultado
| ])
|
| df_resultado