-
Notifications
You must be signed in to change notification settings - Fork 0
/
tp3virtual.c
133 lines (106 loc) · 3.87 KB
/
tp3virtual.c
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
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include"pagetable.h"
#define VIRTUAL_ADDRESS_SIZE 32
typedef unsigned int uint;
unsigned int bitsToDiscard(uint pageSize){
uint tmp = pageSize;
uint s = 0;
while (tmp > 1) {
tmp = tmp >> 1;
s++;
}
return s;
}
int main(int argc, char** argv){
// Variáveis de entrada da linha de comando
char* substitutionAlgortithm[10];
char* inputFile[50];
uint pageSize;
uint totalPhysicalMem;
uint s; //bits a serem descartados para determinar o número da página
uint pageTotal; //Total de páginas acessíveis por um processo
uint frameTotal; //Total de quadros
uint totalOperations = 0; // Total de operações de leitura/escrita (linhas do arquivo de entrada)
uint addr; // Endereço que será lido no arquivo
char rw; // Modo de acesso à memória que será lido no arquivo
uint pageID; // Página de memória, deduzida
// --- Tratamento dos argumentos
if(argc < 5){
printf("Numero incorreto de argumentos!\n");
return -1;
}
strcpy(substitutionAlgortithm, argv[1]);
if ( strcmp(substitutionAlgortithm,"lru") != 0
&& strcmp(substitutionAlgortithm,"2a") != 0
&& strcmp(substitutionAlgortithm,"fifo") != 0
&& strcmp(substitutionAlgortithm,"random") != 0 )
{
printf("Algoritmo de substituicao invalido!\n");
return -1;
}
pageSize = atoi(argv[3]); // Tamanho da página, em KB
totalPhysicalMem = atoi(argv[4]); // Tamanho da memória física, em KB
if(pageSize < 2 && pageSize > 64){
printf("O tamanho da pagina deve ser entre 2 e 64 KB, inclusivo.\n");
return -1;
}
if(totalPhysicalMem < 16 && totalPhysicalMem > 16384){
printf("O total de memoria fisica deve ser entre 16 e 16384 KB, inclusivo.\n");
return -1;
}
strcpy(inputFile, argv[2]);
FILE *f = fopen(inputFile,"r");
if (f == NULL){
printf("Erro ao abrir o arquivo!\n");
return -1;
}
// Bits que serão descartados na hora de calcular o ID da página
s = bitsToDiscard(pageSize*1024); //o cálculo é feito com o o valor em bytes
// Total de páginas possível
pageTotal = 2 << (VIRTUAL_ADDRESS_SIZE - s);
// Total de quadros na tabela de páginas. t = KB disponíveis na memória física / tamanho da página, em KB
frameTotal = totalPhysicalMem/pageSize;
// --- Montagem da tabela de páginas
PageTable *pt = pageTableInit(substitutionAlgortithm[0], pageTotal, frameTotal);
//Leitura do arquivo e gravação das estatísticas
printf("Arquivo de entrada: %s\n", inputFile);
printf("Tamanho da memoria: %d KB\n", totalPhysicalMem);
printf("Tamanho de pagina: %d KB\n", pageSize);
printf("Tamanho da tabela de paginas: %u quadros\n", frameTotal);
printf("Tecnica de reposicao escolhida: ");
switch((char)substitutionAlgortithm[0]){
case 'l':
printf("LRU - menos usado recentemente\n");
break;
case '2':
printf("SECOND CHANCE - segunda chance\n");
break;
case 'f':
printf("FIFO - first in, first out\n");
break;
case 'r':
printf("RANDOM\n");
break;
default:
break;
}
printf("Executando o simulador de acesso a memoria ... \n");
while(fscanf (f,"%x %c", &addr, &rw) != EOF){
totalOperations++;
pageID = addr >> s;
requestPage(pt, pageID, rw);
}
// Imprimir relatório com estatísticas
printf("Estatisticas do simulador: \n");
printf("total de acessos: %u\n", totalOperations);
printf("Paginas lidas: %u\n", pt->readCount);
printf("Paginas escritas: %u\n", pt->writeCount);
printf("Total de page faults: %u\n", pt->TotalPageFaults);
// Limpeza
delete(pt);
fclose(f);
return 0;
}