package com.os;
//import java.io.BufferedReader;
//import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Fifo {
/**
* PageReplacement 表示页面置换的意思
*/
final static int zero=0;
final static int PAGESUM=10; //页面号的范围为0-9
final static int RAMCOUNT=3; //进程获得的内存块
final static int INDEX_MAX=15; //数组下标的最大值,指虚拟空间的最大值
public static void main(String[] args) {
// TODO Auto-generated method stub
int pagecount=0; //记录页中断的次数
int flag=0;
int selectId=0; //选择算法的标号。
int out_id=0; //换出面在虚拟中的下标值
System.out.println("**************************");
System.out.println(" 模拟页面置换算法 ");
System.out.println("**************************");
System.out.println("");
System.out.println("1.先进先出(FIFO)页面置换算法");
System.out.println("2.最近最久未使用(LRU)置换算法");
System.out.println("3.最佳(optimal)置换算法");
System.out.println("");
/**
try{
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
System.out.print("请选择页面置换的算法的序号:");
selectId=Integer.parseInt(buf.readLine());
//System.out.println("得到的序号为:"+selectId);
}catch(IOException e){}
*/
// int[] array=new int[INDEX_MAX]; //声明分配一个虚拟存储区
int[] array={6,3,4,6,6,6,10,9,10,1,8,3,10,8,3};
ArrayList list=new ArrayList(RAMCOUNT); //声明分配一个空表,作为内存区。
for(int i=0;i<RAMCOUNT;i++){
list.add(i, 0);
}
System.out.println("内存区的大小为:"+list.size());
for(int i=0;i<INDEX_MAX;i++){
for(int index=0;index<RAMCOUNT;index++){
if(zero!=Integer.parseInt(list.get(index).toString()))
{
if(array[i]!=Integer.parseInt(list.get(index).toString()))
{
if(index==2)
{
list.remove(0);
list.add(2,array[i]);
pagecount++;
//打印出内存状况
System.out.println("@@@@@@@@@@@@@@@@");
for(int j=0;j<RAMCOUNT;j++)
{
System.out.println(j+"->"+list.get(j).toString());
}
System.out.println("@@@@@@@@@@@@@@@@");
}
else
continue;
}
else
break;
} //第一个if结束号
else
{ list.add(index,array[i]);
pagecount++;
System.out.println("**************");
for(int j=0;j<RAMCOUNT;j++)
{
System.out.println(j+"->"+list.get(j).toString());
}
System.out.println("**************");
break;
}
}//内层for号
}
/**
* for(int i=0;i<RAMCOUNT;i++){
list.get(i);
}
System.out.println("随机产生的页面号引用串:");
for(int i=0;i<INDEX_MAX;i++){
array[i]=1+(int)(Math.random()*PAGESUM);
System.out.print(array[i]+" ");
}
System.out.println("\n");
System.out.println("开始运用第"+selectId+"种算法进行页面置换");
int k=0;
for(int i=0;i<INDEX_MAX;i++){
for(int index=0;index<RAMCOUNT;index++){
if(zero!=Integer.parseInt(list.get(index).toString()))
{
//if(array[i]==Integer.parseInt(list.get(index).toString()))
if(array[i]==Integer.parseInt(list.get(index).toString()))
{
for(int j=index+1;j<RAMCOUNT;j++)
{
if(zero!=Integer.parseInt(list.get(j).toString()))
{
k=j;
continue;
}
else
{
k=j;
break;
}
}//第三个for括号
if(k!=0&&zero!=Integer.parseInt(list.get(k).toString()))
{
list.remove(index);
list.add(k,array[i]);
}
else
{
//list.add(k, array[i]);
//pagecount++;
break;
}
}
else
{
if(index==2)
{
list.remove(0);
list.add(2,array[i]);
pagecount++;
}
else
continue;
}
} //第一个if括号
else
{
list.add(index, array[i]);
pagecount++;
break;
}
}//内层for括号
System.out.println("^^^^^^^^^^^^^");
for(int index=0;index<RAMCOUNT;index++)
{
System.out.println(index+"->"+list.get(index).toString());
}
System.out.println("^^^^^^^^^^^^^");
} //外层for括号
*/
/**
for(int i=0;i<INDEX_MAX;i++){
for(int index=0;index<RAMCOUNT;index++){
if(selectId==1){ //表示选择的是FIFO算法。
if(zero==Integer.parseInt(list.get(index).toString())){
list.add(index, array[i]);
pagecount++;
flag++;
//遍历内存块中的页号
System.out.println("1.发生页面转换\n");
for(int j=0;j<RAMCOUNT;j++){
System.out.println(j+1+" "+list.get(j).toString());}
}
else{
if(array[i]==Integer.parseInt((list.get(index).toString()))){
//表示在内存中有一个相同的页号
//flag=1;
System.out.println("页面中有同号的页");
break;
}
else{ //表示在内存中既没有相等的页面号,内存块数已满。进行置换。
if(zero==Integer.parseInt(list.get(flag).toString())&&flag<3)
{ list.add(flag, array[i]);
flag++;
pagecount++;
//遍历内存块中的页号
System.out.println("\n");
System.out.println("2.发生页面转换\n");
for(int j=0;j<RAMCOUNT;j++){
System.out.println(j+1+" "+list.get(j).toString());
}
}
else
{list.remove(0);
list.add(2, array[i]);
pagecount++;
//遍历内存块中的页号
System.out.println("\n");
System.out.println("3.发生页面转换\n");
for(int j=0;j<RAMCOUNT;j++){
System.out.println(j+1+" "+list.get(j).toString());
}
}
}
}
}
}
}
*/
System.out.println("\n");
System.out.println("发生缺页中断的次数:"+pagecount);
System.out.println(INDEX_MAX);
float pre=((float)pagecount/(float)INDEX_MAX)*100;
System.out.println("利用第"+selectId+"种算法,所得的缺页率为"+pre+"%");
}
}