Boa noite prezados, sou programadora Abap, concurseira e mestranda tentando aprender Java para implementar os algoritmos de substituição de cache LRU e LFU.
Prezados, consegui fazer a solução para FIFO, pois pego o mais antigo e substituo. Mas e quanto a LFU e LRU? Eu entendo os conceitos na teoria mas como sou NOOB em Java meio que está nebuloso implementar isso, visto que pouco sei sobre as estruturas de dados no Java.
Gostaria de ajuda… Como posso criar pilha deixando no topo o menos usado para solucionar o LFU?
Deixarei código do FIFO para ver se vocês me ajudam a pensar aqui…
A classe que tem MAIN:
//Classe Factory que deixa as subclasses decidirem qual o tipo de implementação será usada
public class CacheFactory
{
private static Scanner teclado = new Scanner(System.in);
private static int GetTipoCache() {
//tipoCache recebe valor do teclado sobre qual implementação será executada
int tipoCache = 1; //recebe valor padrao 1 para FIFO, mas poderia ser qualquer outro algoritmo
do {
System.out.println(" --- Simulador de Substituição de Páginas ---");
System.out.println("1: FIFO");
System.out.println("Escolha um tipo de Implementação:");
tipoCache = teclado.nextInt();
//
return tipoCache;
}
private static int GetCacheSizeInput() {
System.out.println("");
System.out.println("Informe o tamanho do cache:");
return teclado.nextInt();
}
private static String GetNameFile()
System.out.println("");
System.out.println("Informe o caminho do arquivo:");
return teclado.next();
}
public static void main (String[] args) throws IOException
{
Cache cache = null;
FIFO fifo = null;
int intAlgo = GetTipoCache();
int intSize = GetCacheSizeInput();
String nameFile = GetNameFile();
teclado.close();
switch(intAlgo) {
case 1:
fifo = new FIFO(intSize);
break;
default:
cache = null;
System.out.println("Invalido");
break;
}
System.out.println("");
FileArrayReader fr = new FileArrayReader();
String[] data = fr.readLines(nameFile);
if (intAlgo == 1) {
for (String line : data) {
System.out.println("Acesso do endereço " + line);
//String dt = fifo.Read(line);
fifo.Read(line);
System.out.println(java.util.Arrays.toString(fifo.GetCache()));
System.out.println("Acessos: " + fifo.accessCounter + " - Hits: " + fifo.hitCounter + " - Misses: " + fifo.missCounter);
System.out.println();
}
}
}
Agora, classe FIFO
public class FIFO {
//public class FIFO extends Cache {
protected int index;
protected String[] buffer;
public int size;
public int missCounter = 0;
public int hitCounter = 0;
public int accessCounter = 0;
// Cache(int cacheSize) {
// size = cacheSize;
// buffer = new String[cacheSize];
// }
public String[] GetCache(){
return buffer;
}
// public abstract String Read(String pos);`
// pra cima 21/09
FIFO(int bufSize) {
//super(bufSize);
size = bufSize;
buffer = new String[bufSize];
System.out.println("Iniciando cache FIFO com tamanho " + bufSize + "...");
}
//@Override
public String Read(String pos) {
String ioBuff;
//Temos um acesso
accessCounter++;
for(int i = 0; i < size; i++){
if(buffer[i] != null && buffer[i].equals(pos)) {
//Temos um hit
hitCounter++;
return buffer[i];
}
}
//Temos um miss
missCounter++;
//Em uma implementação real, farÃamos um acesso à memória principal
ioBuff = pos;
buffer[index] = ioBuff;
if(index == size - 1)
index = 0;
else
index ++;
return ioBuff;
}
}
Classe FILEARRAYREADER
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class FileArrayReader {
public String[] readLines(String filename) throws IOException {
FileReader fileReader = new FileReader(filename);
BufferedReader bufferedReader = new BufferedReader(fileReader);
List<String> lines = new ArrayList<String>();
String line = null;
while ((line = bufferedReader.readLine()) != null) {
lines.add(line);
}
bufferedReader.close();
return lines.toArray(new String[lines.size()]);
}
}
Para testar, crie arquivo txt, coloque varias letras ou palavras em casa linha… Meu codigo tem que mostrar como está a cache em cada iteração… Contar os Hits e Miss…
Alguém pode me judar no LRU e LFU?
Obrigada!