// Aim:implement page replacement
import java.io.*;
class LRU
{
public static void init_array(int a[],int b[], int frame1[], int can_marcos){
for(int i=0;i<can_marcos;i++) //inicializa el arreglo de f marcos y los de control
{
frame1[i]=-1;
a[i]=-1;
b[i]=-1;
}
}
public static void actualizar_Pilas(int a[], int b[], int page, int can_marcos){
int p=1;
for(int j=0;j<a.length;j++) //copia el contenido de la pila a [n] a la pila b[n+1]
{
if(page!=a[j] && p<can_marcos)
{
b[p]=a[j];
p++;
}
}
for(int j=0;j<can_marcos;j++) // copia el contenido de b[n] en a[n] para dejar las pilas iguales.
{
a[j]=b[j];//recorre el arreglo y copia el contenido de b en a
}
}
public static void page_Fault(int k, int page, int frame1[], int can_marcos)
{
frame1[k]=page; //la pagina no existia en ningun marco, asigna el valor de la pagina al marco.
//System.out.println("Marco :" );
for(int j=0;j<can_marcos;j++)
if (frame1[j]!=-1) System.out.print(frame1[j]+" ");
//System.out.print("\n Page Fault\n");
System.out.println();
}
public static void main(String args[])throws IOException
{
BufferedReader obj=new BufferedReader(new InputStreamReader(System.in));
int can_marcos; // cantidad de marcos
int pagina = 0;
int ch;
int page_fault = 0; //cantidad de page faults
int n;
int chn = 0; //cantidad de paginas
int acierto = 0; //cantidad de aciertos
boolean flag;
int pages[];
do{
System.out.println("Menu");
System.out.println("---");
System.out.println("2.LRU");
System.out.println("---");
System.out.println("4.SALIR");
System.out.println("Selecione una opcion: ");
ch=Integer.parseInt(obj.readLine());
switch(ch)
{
case 1:
break;
case 2:
int k=0;
System.out.println("Digite el numero de marcos: ");
can_marcos=Integer.parseInt(obj.readLine());
int frame1[]=new int[can_marcos]; //Arreglo del tama�o de f marcos
int a[]=new int[can_marcos]; //lleva el control con dos pilas
int b[]=new int[can_marcos];
init_array(a, b,frame1,can_marcos); //inicializa el arreglo de f marcos y los de control
//leer_Datos();
System.out.println("Digite la cantidad de paginas ");
n=Integer.parseInt(obj.readLine());
pages=new int[n]; //arreglo de n cantidad de paginas
System.out.println("Digite el numero de pagina ");
for(int j=0;j<n;j++)// ciclo para leer las N paginas una por una
pages[j]=Integer.parseInt(obj.readLine());
do{
int pg=0;
for(pg=0;pg<n;pg++) //mientras sea menor que las n paginas totales
{
pagina=pages[pg]; // carga la pagina
flag=true;
for(int j=0;j<can_marcos;j++) //Recorre los marcos para buscar la pagina
{
if(pagina==frame1[j]) //si la pagina existe en algun marco
{flag=false; break;}
}
//buscar_espacio(frame1);
for(int j=0;j<can_marcos && flag;j++)//hay un page fault, busca el frame utilizable (vacio o mas viejo) para guardar page.
{
if(frame1[j]==a[can_marcos-1])
{k=j; //guarda el indice en K para utilizarlo luego
break;}
}
if(flag)// si hay un page fault
{
page_Fault(k, pagina, frame1, can_marcos);
page_fault++;
}
else // no hubo page fault
{
//System.out.println(".Marco :" );
//System.out.println("Acierto!!");
for(int j=0;j<can_marcos;j++)
if (frame1[j]!=-1) {System.out.print(frame1[j]+" ");}
System.out.println();
acierto++; //cuenta la cantidad de aciertos
}
b[0]=pagina;
actualizar_Pilas(a, b, pagina, can_marcos);
chn++;
}
}while(chn<n);
System.out.println("fallos:"+page_fault);
System.out.println("Aciertos:"+acierto);
chn = 0;
page_fault = 0;
acierto = 0;
break;
case 3:
break;
case 4:
break;
}
} while(ch!=4);
}
}