@@ -20,11 +20,9 @@ public MMU(int pTamanhoMemoriaFisica, int pTamanhoMemoriaVirtual, MemoriaVirtual
20
20
@ Override
21
21
public void escrever (int pIndiceVirtual , int idProcesso ) {
22
22
23
- // Se a pagina NÃO está referenciada (bit P) na memória fisica
24
23
if (this .memVirtual .getPagina (pIndiceVirtual ).presente () == false ) {
25
24
Integer indiceLivre = this .memFisica .getIndiceLivre (this .memFisica .getMemoria ());
26
25
27
- // Se NÃO tiver espaço na memória física
28
26
if (indiceLivre == null ){
29
27
30
28
this .WS ();
@@ -38,37 +36,31 @@ public void escrever(int pIndiceVirtual, int idProcesso) {
38
36
39
37
Random r = new Random ();
40
38
Integer novoValor = r .nextInt (100 );
41
- System .out .println ("ESCREVENDO1 " + novoValor );
39
+ System .out .println ("1-Valor escrito: " + novoValor );
42
40
this .memFisica .setValor (indiceLivreTemp , novoValor );
43
-
44
- // Se tiver espaço na memória física
41
+
45
42
} else {
46
43
47
44
Integer indiceLivreTemp = this .memFisica .getIndiceLivre (this .memFisica .getMemoria ());
48
45
this .memVirtual .getPagina (pIndiceVirtual ).referenciar (true );
49
46
this .memVirtual .getPagina (pIndiceVirtual ).modificar (true );
50
47
this .memVirtual .getPagina (pIndiceVirtual ).presenca (true );
51
-
48
+
52
49
this .memVirtual .getPagina (pIndiceVirtual ).setMolduraPagina (indiceLivreTemp );
53
50
this .memVirtual .getPagina (pIndiceVirtual ).setTempoVirtualAtual (tempoAtual );
54
51
Random r = new Random ();
55
- Integer valor = r .nextInt (100 ); // Pega um valor qualquer, ja que não é relevante no nosso caso
56
- System .out .println ("ESCREVENDO2 " + valor );
52
+ Integer valor = r .nextInt (100 );
53
+ System .out .println ("2-Valor Escrito: " + valor );
57
54
this .memFisica .setValor (indiceLivreTemp , valor );
58
55
}
59
-
60
- // Se o valor da pagina está presente na memória fisica
56
+
61
57
} else {
62
58
63
59
Integer molduraPagina = memVirtual .getPagina (pIndiceVirtual ).getMolduraPagina ();
64
- /*if(this.memVirtual.getPagina(pIndiceVirtual).modificada() == true){
65
- Integer valorModificado = this.memFisica.getValor(molduraPagina);
66
- this.memoriaHD.swap(valorModificado, pIndiceVirtual);
67
- }*/
68
60
69
61
Random r = new Random ();
70
- Integer novoValor = r .nextInt (100 ); // Gerando um valor aleatório, já que não importa para o nosso caso
71
- System .out .println ("Escrevendo valor " + novoValor + " na memória física" );
62
+ Integer novoValor = r .nextInt (100 );
63
+ System .out .println ("3-Valor escrito: " + novoValor );
72
64
this .memFisica .setValor (molduraPagina , novoValor );
73
65
this .memVirtual .getPagina (pIndiceVirtual ).referenciar (true );
74
66
this .memVirtual .getPagina (pIndiceVirtual ).modificar (true );
@@ -83,17 +75,16 @@ public Integer ler(int pIndiceVirtual, int IDProcesso) {
83
75
try {
84
76
if (this .memVirtual .getPagina (pIndiceVirtual ).presente () == false ){
85
77
Integer indiceLivre = this .memFisica .getIndiceLivre (this .memFisica .getMemoria ());
86
- //System.out.println(indiceLivre);
87
- // Se a memória física tiver espaço
78
+
88
79
if (indiceLivre != null ){
89
80
this .memVirtual .getPagina (pIndiceVirtual ).presenca (true );
90
81
this .memVirtual .getPagina (pIndiceVirtual ).referenciar (true );
91
82
this .memVirtual .getPagina (pIndiceVirtual ).modificar (false );
92
83
this .memVirtual .getPagina (pIndiceVirtual ).setMolduraPagina (indiceLivre );
93
84
this .memVirtual .getPagina (pIndiceVirtual ).setTempoVirtualAtual (this .tempoAtual );
94
- System .out .println (this .tempoAtual );
95
85
valorDoHD = this .memoriaHD .getValorHD (pIndiceVirtual );
96
86
this .memFisica .setValor (indiceLivre , valorDoHD );
87
+
97
88
} else {
98
89
99
90
this .WS ();
@@ -120,28 +111,24 @@ public Integer ler(int pIndiceVirtual, int IDProcesso) {
120
111
}
121
112
122
113
private void WS () {
123
- int t = 3000 ;
124
- boolean marcada = false ; // marca pagina candidata a ser retirada da memFisica
114
+ int t = 15000 ;
115
+ boolean marcada = false ;
125
116
int idadePaginaAtual = 0 ;
126
- // Variaveis temporarias para comparação de pagina mais antiga escolhida a sair
127
117
int idadePaginaTemp = 0 ;
128
118
int iTemp = 0 ;
129
119
130
120
for (int countPaginas = 0 ; countPaginas < this .memVirtual .getTamanho (); countPaginas ++) {
131
121
132
- // Se a página tiver o bit Presente em 0, passa pra próxima
133
122
if (this .memVirtual .getPagina (countPaginas ).presente () == false ){
134
123
continue ;
135
124
}
136
-
137
- // Se a pagia foi referenciada durante o ultimo tick de clock, ela não é candidata à sair do WS
125
+
138
126
if (this .memVirtual .getPagina (countPaginas ).referenciada () == true ){
139
127
140
128
this .memVirtual .getPagina (countPaginas ).setTempoVirtualAtual (this .tempoAtual );
141
129
idadePaginaAtual = (this .tempoAtual - this .memVirtual .getPagina (countPaginas ).getTempoVirtualAtual ());
142
130
idadePaginaTemp = (this .tempoAtual - this .memVirtual .getPagina (iTemp ).getTempoVirtualAtual ());
143
131
144
- // Guardar o indice da pagina mais antiga até então
145
132
if (idadePaginaAtual >= idadePaginaTemp ){
146
133
iTemp = countPaginas ;
147
134
marcada = true ;
@@ -152,11 +139,10 @@ private void WS() {
152
139
if (this .memVirtual .getPagina (countPaginas ).referenciada () == false && (this .tempoAtual - this .memVirtual .getPagina (countPaginas ).getTempoVirtualAtual ()) > t ){
153
140
Integer moldura = this .memVirtual .getPagina (countPaginas ).getMolduraPagina ();
154
141
155
- // Verifica se a página foi modificada
156
142
if (this .memVirtual .getPagina (countPaginas ).modificada () == true ){
157
143
this .memoriaHD .swap (this .memFisica .getValor (moldura ), countPaginas );
158
144
}
159
- // Reseta a página para tirar a referencia dela para a memoria fisica
145
+
160
146
this .memFisica .setValor (this .memVirtual .getPagina (countPaginas ).getMolduraPagina (), null );
161
147
this .memVirtual .getPagina (countPaginas ).descartarPagina ();
162
148
marcada = false ;
@@ -174,28 +160,24 @@ private void WS() {
174
160
continue ;
175
161
}
176
162
177
-
178
- // Verifica se a página foi marcada
179
163
if (marcada == true ){
180
- System .out .println ("UKULELE" );
181
164
if (this .memVirtual .getPagina (iTemp ).modificada () == true ){
182
165
Integer moldura2Swap = this .memVirtual .getPagina (countPaginas ).getMolduraPagina ();
183
166
Integer valor = this .memFisica .getValor (moldura2Swap );
184
167
this .memoriaHD .swap (valor , countPaginas );
185
168
}
186
-
187
- // Desreferenciar a pagina da memoria fisca
169
+
188
170
this .memFisica .setValor (this .memVirtual .getPagina (iTemp ).getMolduraPagina (), null );
189
171
this .memVirtual .getPagina (countPaginas ).descartarPagina ();
190
172
}
191
173
}
192
174
}
193
- // Para zerar os bits de referenciado das páginas virtuais
194
- // Tick do clock!
175
+
195
176
public void eventoZerarRecebido (int tempoClock ){
196
177
this .tempoAtual = tempoClock ;
197
178
for (int i = 0 ; i < this .memVirtual .getTamanho (); i ++){
198
179
this .memVirtual .getPagina (i ).referenciar (false );
199
180
}
181
+ System .out .println ("- Tick de clock -" );
200
182
}
201
183
}
0 commit comments