forked from elianemaciel/UCSProjectMemoryCacheSimulator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
memoria_cache.py
152 lines (126 loc) · 4.4 KB
/
memoria_cache.py
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
# -*- coding: utf-8 -*-
from datetime import datetime
from random import randint
class Linha:
"""Class object linha"""
rotulo = ''
enderecoTotal = ''
lru = ''
lfu = 0
def __init__(self, rotulo, enderecoTotal):
self.rotulo = rotulo
self.enderecoTotal = enderecoTotal
class Conjunto:
linha = []
conjunto = ''
tamanho = 0
prox = 0
def __init__(self, qtdeLinhas):
self.linhas = []
self.tamanho = qtdeLinhas
self.prox = 0
def getConjunto(self):
return self.conjunto
def setConjunto(self, conjunto):
self.conjunto = conjunto
def procuraRotulo(self, rotuloEndereco):
for lin in self.linha:
if lin.rotulo == rotuloEndereco:
lin.lfu += 1
data = datetime.now()
lin.lru = data
return True
return False
def buscaUltimaUsada(self):
aux = self.linha[0].lru
menosUsado = 0
for i, x in enumerate(self.linha):
if x.lru < aux:
aux = x.lru
menosUsado = i
return menosUsado
def buscaMenosUsada(self):
aux = self.linha[0].lfu
menosUsado = 0
for i, x in enumerate(self.linha):
if x.lfu < aux:
aux = x.lfu
menosUsado = i
return menosUsado
def gravaRotulo(
self, rotuloEndereco, politicaSubstituicao, politicaGravacao, mp,
enderecoTotal
):
if self.prox == self.tamanho and self.linha != []:
# LFU
if politicaSubstituicao == 0:
poslinhaMenosUsada = self.buscaMenosUsada()
linha_object = Linha(rotuloEndereco, enderecoTotal)
del self.linha[poslinhaMenosUsada]
self.linha.insert(poslinhaMenosUsada, linha_object)
if politicaGravacao == 1:
mp.adicionaNaMP(linha_object.enderecototal)
# LRU
elif politicaSubstituicao == 1:
poslinhaMenosRecUsada = self.buscaUltimaUsada()
data = datetime.now()
linha_object = Linha(rotuloEndereco, enderecoTotal)
linha_object.lru = data
del self.linha[poslinhaMenosRecUsada]
self.linha.insert(poslinhaMenosRecUsada, linha_object)
if politicaGravacao == 1:
mp.adicionaNaMP(linha_object.enderecoTotal)
# Aleatorio
else:
linhaAleatoria = randint(0, self.prox)
if politicaGravacao == 1:
mp.adicionaNaMP(self.linha[linhaAleatoria].enderecoTotal)
linha_object = Linha(rotuloEndereco, enderecoTotal)
self.linha.insert(linhaAleatoria, linha_object)
else:
linha_object = Linha(rotuloEndereco, enderecoTotal)
if politicaSubstituicao == 0:
linha_object.lfu += 1
elif politicaSubstituicao == 1:
data = datetime.now()
linha_object.lru = data
self.linha.append(linha_object)
self.prox = self.prox + 1
class MemoriaCache:
conjuntos = []
tamanho = 0
proximo = 0
def __init__(self, qtdeConjuntos, qtdeLinhas):
self.tamanho = qtdeConjuntos
for i in range(0, qtdeConjuntos):
self.conjuntos.append(Conjunto(qtdeLinhas))
self.proximo = 0
def setConjuntos(self, conjuntos):
self.conjuntos = conjuntos
def getConjuntos(self):
return self.conjuntos
def procuraConjunto(self, enderecoConjunto):
for i in range(0, self.proximo):
if self.conjuntos[i].getConjunto() == enderecoConjunto:
return self.conjuntos[i]
return False
def gravaConjunto(self, enderecoConjunto):
if self.proximo != self.tamanho:
self.conjuntos[self.proximo].setConjunto(enderecoConjunto)
self.proximo += 1
return self.conjuntos[self.proximo-1]
return None
class MemoriaPrincipal:
enderecos = []
total = 0
def __init__(self):
self.enderecos = []
self.total = 0
def adicionaNaMP(self, enderecoTotal):
self.enderecos.append(enderecoTotal)
self.total += 1
def buscaNaMP(self, enderecoTotal):
for i in self.enderecos:
if i == enderecoTotal:
return True
return False