页面置换算法

*主类

package yemianzhihuan;

public class yemianzhihuan {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a=new int[] {6,5,4,3,2,1,5,4,3,6,5,4,3,2,1,6,5};
		OPT opt=new OPT();
		opt.fun(a);//传入页面号
		FIFO fifo=new FIFO();
		fifo.fun(a);
		LRU lru=new LRU();
		lru.fun(a);
	}
}

*最优置换算法(OPT)

package yemianzhihuan;

public class OPT {
	public OPT() {}
	public void fun(int[] target) {//传入数组为页面号
		int[] a=new int[4];//内存块,数量为4
		int[] turn=new int[] {0,0,0,0};//记录是否已经找到后续的位置
		int i=0;
		int j=0;
		int maxlo=0;
		int court=0;//断页次数
		int sum=0;//总的页面置换次数
		while(i<a.length) {//填充内存块
			a[i]=target[i];
			i++;
		}
		while(i<target.length) {
			if(target[i]==a[0]||target[i]==a[1]||target[i]==a[2]||target[i]==a[3]) {//如果内存块中有相同的页面,不用置换,并跳过本次置换
				i++;
				sum++;
				System.out.println(a[0]+"  "+a[1]+"  "+a[2]+"  "+a[3]);
				continue;
			}
			else {//如果不存在,进行页面置换过程
				j=i;
				while(j<target.length) {//如果在后续页面中出现过内存块中的页面,并且为第一次出现,记录其出现位置
					if(target[j]==a[0]&&turn[0]==0) {
						maxlo=j;
						turn[0]=1;
					}
					if(target[j]==a[1]&&turn[1]==0) {
						maxlo=j;
						turn[1]=1;
					}
					if(target[j]==a[2]&&turn[2]==0) {
						maxlo=j;
						turn[2]=1;					}
					if(target[j]==a[3]&&turn[3]==0) {
						maxlo=j;
						turn[3]=1;
					}
					j++;
				}
				if(turn[0]==1&&turn[1]==1&&turn[2]==1&&turn[3]==1) {
					if(target[maxlo]==a[0]) {
						a[0]=target[i];
					}
					if(target[maxlo]==a[1]) {
						a[1]=target[i];
					}
					if(target[maxlo]==a[2]) {
						a[2]=target[i];
					}
					if(target[maxlo]==a[3]) {
						a[3]=target[i];
					}
				}
				else {
					for(int k=0;k<turn.length;k++) {
						if(turn[k]!=1) {
							a[k]=target[i];
							break;
						}
					}
				}
			}
			i++;
			for(int k=0;k<turn.length;k++) {
				turn[k]=0;
			}
			maxlo=0;
			System.out.println(a[0]+"  "+a[1]+"  "+a[2]+"  "+a[3]);
			court++;
			sum++;
		}
		System.out.println(court+"---"+sum);
	}
}

*先进先出算法(FIFO)

package yemianzhihuan;

public class FIFO {
	public FIFO() {};
	public void fun(int[] target) {
		System.out.println(target.length);
		int[] a=new int[4];//内存块数目
		int[] b=new int[4];//记录页面进入顺序
		int i=0;
		int temp=0;
		
		while(i<a.length) {//填充内存块
			a[i]=target[i];
			b[i]=i;
			i++;
			System.out.println(a[0]+"  "+a[1]+"  "+a[2]+"  "+a[3]);
		}
		while(i<target.length) {//进行页面置换
			if(target[i]==a[0]||target[i]==a[1]||target[i]==a[2]||target[i]==a[3]) {//如果内存块中有相同的页面,不用置换,并跳过本次置换
				i++;
				System.out.println(a[0]+"  "+a[1]+"  "+a[2]+"  "+a[3]);
				continue;
			}
			else {
				temp=0;
				while(temp<a.length-1) {
					a[temp]=a[temp+1];
					temp++;
				}
				a[temp]=target[i];
				System.out.println(a[0]+"  "+a[1]+"  "+a[2]+"  "+a[3]);
				i++;
			}
		}
	}
}

*最近最近未使用(LRU)

package yemianzhihuan;

public class LRU {
	public LRU() {}
	public void fun(int[] target) {
		System.out.println(target.length);
		int[] a=new int[4];
		int i=a.length-1;
		int temp=0;
		while(i>=0) {
			a[i]=target[temp];
			i--;
			temp++;
		}
		i=a.length;
		while(i<target.length) {
			if(target[i]==a[0]||target[i]==a[1]||target[i]==a[2]||target[i]==a[3]) {//如果内存块中有相同的页面,不用置换,并跳过本次置换
				if(target[i]==a[0]) {
					i++;
					continue;
				}
				if(target[i]==a[1]) {
					temp=a[1];
					a[1]=a[0];
					a[0]=temp;
					
				}
				if(target[i]==a[2]) {
					temp=2;
					while(temp>0) {
						a[temp]=a[temp-1];
						temp--;
					}
					a[temp]=target[i];
				}
				if(target[i]==a[3]) {
					temp=3;
					while(temp>0) {
						a[temp]=a[temp-1];
						temp--;
					}
					a[temp]=target[i];
				}
				i++;
				System.out.println(a[0]+"  "+a[1]+"  "+a[2]+"  "+a[3]);
			}
			else {
				temp=a.length-1;
				while(temp>0) {
					a[temp]=a[temp-1];
					temp--;
				}
				a[temp]=target[i];
				System.out.println(a[0]+"  "+a[1]+"  "+a[2]+"  "+a[3]);
				i++;
			}
		}
	}
}