-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathinicio.cpp
170 lines (150 loc) · 6.34 KB
/
inicio.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include "EntradaTLB.h"
#include "EntradaTP.h"
#include "Entrada.h"
#include "TLB.h"
#include "TablaPagina.h"
#include "Tabla.h"
#define ENTRADAS_TLB 4
#define INSTRUCCION 0
#define DATO 1
#define TAMANIO_DIRECCION_VIRTUAL_EN_BITS 32
using namespace std;
int contador_fallas;
int puntero_mp = 0;
unsigned int entradas_tabla_de_pagina = 0;
unsigned int cantidad_memoria_fisica_en_MB = 0;
unsigned int tamanio_pagina_en_KB = 0;
unsigned int cantidad_marcos_de_pagina = 0;
unsigned int bits_offset = 0;
unsigned int bits_npv = 0;
unsigned int bits_mp = 0;
unsigned int** marcos_de_pagina = NULL;
unsigned int PUROS_UNOS = ~(0 << (TAMANIO_DIRECCION_VIRTUAL_EN_BITS - 1));
unsigned int PUROS_CEROS = 0 << (TAMANIO_DIRECCION_VIRTUAL_EN_BITS - 1);
int contador_lineas_archivo=0;
unsigned long long int calcular_marcos_de_pagina()
{
return (cantidad_memoria_fisica_en_MB / tamanio_pagina_en_KB) * (1 << 10); // se multiplica por 2^10 para compensar la diferencia de unidades
}
unsigned int calcular_bits_offset()
{
int retorno = 0;
int aux = tamanio_pagina_en_KB;
while (aux != 1)
{
aux /= 2;
retorno++;
}
return retorno + 10; // mas diez porque está en KB
}
unsigned int calcular_bits_marco_pagina()
{
int retorno = 0;
int aux = cantidad_marcos_de_pagina;
while (aux != 1)
{
aux /= 2;
retorno++;
}
return retorno;
}
unsigned int get_offset(unsigned int direccion_virtual)
{
return (~(PUROS_UNOS << bits_offset)) & direccion_virtual;
}
unsigned int get_pagina_virtual(unsigned int direccion_virtual)
{
return direccion_virtual >> bits_offset;
}
int main(int argc, char const *argv[])
{
unsigned char caracter_leido[2] = {'\0', '\0'}; // ocupo string en vez de char para que no lea whitespace
unsigned int direccion_leida = 0x0;
FILE* archivo_trace = fopen(argv[1], "r");
FILE* archivo_salida = fopen(argv[2], "w");
if (archivo_trace == NULL)
{
perror("Error: archivo trace");
exit(1);
}
if (archivo_salida == NULL)
{
perror("Error: archivo salida");
exit(1);
}
printf("Ingrese la cantidad de memoria física (en MB): ");
scanf("%d", &cantidad_memoria_fisica_en_MB);
printf("Ingrese el tamaño de página (en KB): ");
scanf("%d", &tamanio_pagina_en_KB);
cantidad_marcos_de_pagina = calcular_marcos_de_pagina();
bits_offset = calcular_bits_offset();
bits_npv = TAMANIO_DIRECCION_VIRTUAL_EN_BITS - bits_offset;
bits_mp = calcular_bits_marco_pagina();
entradas_tabla_de_pagina = 1 << (bits_npv);
// crea los objetos necesarios para emular la tarea
TLB TLB_instrucciones(entradas_tabla_de_pagina);
TLB TLB_datos(entradas_tabla_de_pagina);
TablaPagina* tabla_de_pagina = new TablaPagina(entradas_tabla_de_pagina, cantidad_marcos_de_pagina);
//marcos libres estara en 1 si esta disponible y 0 si no lo esta
TLB_instrucciones.set_tp(tabla_de_pagina);
TLB_datos.set_tp(tabla_de_pagina);
//seteamos todos los marcos de pagina como disponible en un principio
printf("Tamaño entrada tlb: %lu\n", sizeof(EntradaTLB));
printf("Tamaño entrada tp: %lu\n", sizeof(EntradaTP));
printf("Memoria física en MB: %u\n", cantidad_memoria_fisica_en_MB);
printf("Tamaño de página en KB: %u\n", tamanio_pagina_en_KB);
printf("Entradas de la tabla de página (cantidad de páginas virtuales): %u\n", entradas_tabla_de_pagina);
printf("Cantidad de marcos de página: %u\n", cantidad_marcos_de_pagina);
printf("Número de marcos de página: %u\n", bits_npv);
printf("Bits para offset: %u\n", bits_offset);
printf("Bits para número de página virtual: %u\n", bits_npv);
printf("Bits para número de marco de página: %u\n", bits_mp);
while (!feof(archivo_trace))
{
contador_lineas_archivo++;
fscanf(archivo_trace, "%s", caracter_leido);
fscanf(archivo_trace, "%x", &direccion_leida);
//printf("%s ", caracter_leido);
//printf("%x\n", direccion_leida);
//printf("offset: %x\n", get_offset(direccion_leida));
//printf("pagina virtual: %x\n", get_pagina_virtual(direccion_leida));
//ejecuccion principal del programa
// TODO: implementar las funciones
if (caracter_leido[0] == 'i')
{
//printf("Se leyó una instrucción\n");
TLB_instrucciones.LRU(direccion_leida);
}
else if (caracter_leido[0] == 'l')
{
//printf("Se leyó un load\n");
TLB_datos.LRU(direccion_leida);
}
else if (caracter_leido[0] == 's')
{
//printf("Se leyó un store\n");
TLB_datos.LRU(direccion_leida);
}
else
{
//printf("Algo terrible sucedió! Abandonen todas las esperanzas");
exit(EXIT_FAILURE);
}
}
fprintf(archivo_salida,"Cantidad de memoria física %d MB\n",cantidad_memoria_fisica_en_MB);
fprintf(archivo_salida,"Tamaño de página: %d KB\n",tamanio_pagina_en_KB);
fprintf(archivo_salida,"Fallos en TLB de Datos: %d de un total de %d\n",TLB_datos.contador_de_fallos,contador_lineas_archivo );
fprintf(archivo_salida,"Fallos en TLB de Datos: %d de un total de %d\n",TLB_datos.contador_de_fallos,contador_lineas_archivo );
fprintf(archivo_salida,"Tasa de fallos en TLB de datos: %f %%\n" ,100*(TLB_datos.contador_de_fallos/(float)contador_lineas_archivo) );
fprintf(archivo_salida,"Fallos en TLB de Instrucciones: %d de un total de %d \n", TLB_instrucciones.contador_de_fallos,contador_lineas_archivo );
fprintf(archivo_salida,"Tasa de fallos en TLB de Instrucciones: %f %%\n", 100*(TLB_instrucciones.contador_de_fallos/(float)contador_lineas_archivo));
fprintf(archivo_salida,"Fallos en la tabla de páginas: %d de un total de %d\n", tabla_de_pagina->contador_de_fallos,contador_lineas_archivo );
fprintf(archivo_salida,"Tasa de fallos en tabla de página: %f %%\n", 100*(tabla_de_pagina->contador_de_fallos/(float)contador_lineas_archivo));
fprintf(archivo_salida,"Reemplazos hechos en TLB de datos: %d\n", TLB_datos.contador_de_fallos );
fprintf(archivo_salida,"Reemplazos hecho en TLB de Instruction: %d\n", TLB_instrucciones.contador_de_fallos );
fprintf(archivo_salida,"Reemplazos hecho en la tabla de páginas: %d\n",tabla_de_pagina->contador_de_fallos );
return 0;
}