OPT算法,FIFO算法,LRU算法,LFU算法的java程序

import java.util.Scanner;


public class systemLab3 {
    final static int NUM=20;
    final static int FRAME = 3;
    public static int []pages = new int[NUM];
    public static void main(String[] args)
    {
        Scanner s = new Scanner(System.in);
        System.out.print("依次输入数组:");
        for(int i=0;i<NUM;i++)
        {
            pages[i] = s.nextInt();
        }
        System.out.println("opt:");
        opt(pages);
        System.out.println("fifo:");
        fifo(pages);
        System.out.println("lru:");
        lru(pages);
        System.out.println("lfu:");
        lfu(pages);
    }
    public static void opt(int []pages)
    {
        int []frames = new int[FRAME];
        for(int i=0;i<FRAME;i++)   //0-frame装入并输出
        {
            frames[i] = pages[i];
            System.out.print("当前页面:");
            for(int j=0;j<=i;j++)
            {
                System.out.print(frames[j]+" ");
            }
            System.out.print("\n");
        }

        for(int i=FRAME;i<pages.length;i++)  //后续数组内容opt置换
        {
            boolean isIncluded = false;   //判断页匡内是否含有下一个内容
            int posToSwitch;  //置换位置的下标
            for(int j=0;j<FRAME;j++)
            {
                if(frames[j] == pages[i])
                    isIncluded = true;
            }
            if(!isIncluded)
            {
                int []nextIndexOfFrames = new int[FRAME];
                for(int j=0;j<FRAME;j++)
                    nextIndexOfFrames[j] = getIndexOfNum(i,frames[j]);
                posToSwitch = getMaxOfArray(nextIndexOfFrames);
                frames[posToSwitch] = pages[i];
            }

            System.out.print("当前页面:");
            for(int j=0;j<FRAME;j++)
            {
                System.out.print(frames[j]+" ");
            }
            System.out.print("\n");
        }
    }
    private static int getMaxOfArray(int[] frames) {
        int i,index=0,max;
        for(i=0,max = frames[0];i<FRAME;i++)
            if(frames[i]>max)
            {
                index = i;
                max = frames[i];
            }
        return index;
    }
    private static int getMinOfArray(int[] frames) {
        int i,index=0,min;
        for(i=0,min = frames[0];i<FRAME;i++)
            if(frames[i]<min)
            {
                index = i;
                min = frames[i];
            }
        return index;
    }
    private static int getIndexOfNum(int i,int toFind) {
        int num=100;
        for(;i<pages.length;i++)
            if(pages[i] == toFind)
                return i;    //找到
        return num;  //未找到
    }
    public static void fifo(int []pages)
    {
        int []frames = new int[FRAME];
        int []timeOfInsert = new int[FRAME];
        for(int i=0;i<FRAME;i++)   //0-frame装入并输出
        {
            frames[i] = pages[i];
            timeOfInsert[i] = i;   //记录插入时间
            System.out.print("当前页面:");
            for(int j=0;j<=i;j++)
            {
                System.out.print(frames[j]+" ");
            }
            System.out.print("\n");
        }

        for(int i=FRAME;i<pages.length;i++)  //后续数组内容FIFO置换
        {
            boolean isIncluded = false;   //判断页匡内是否含有下一个内容
            int posToSwitch;  //置换位置的下标
            for(int j=0;j<FRAME;j++)
            {
                if(frames[j] == pages[i])
                    isIncluded = true;
            }
            if(!isIncluded)   //当前页面不包含所需内容
            {
                posToSwitch = getMinOfArray(timeOfInsert);
                frames[posToSwitch] = pages[i];
                timeOfInsert[posToSwitch] = i;  //记录修改时间
            }

            System.out.print("当前页面:");
            for(int j=0;j<FRAME;j++)
            {
                System.out.print(frames[j]+" ");
            }
            System.out.print("\n");
        }
    }
    public static void lru(int []pages)
    {
        int []frames = new int[FRAME];
        int []timeOfUse = new int[FRAME];
        for(int i=0;i<FRAME;i++)   //0-frame装入并输出
        {
            frames[i] = pages[i];
            timeOfUse[i] = i;   //记录最近一次使用的时间
            System.out.print("当前页面:");
            for(int j=0;j<=i;j++)
            {
                System.out.print(frames[j]+" ");
            }
            System.out.print("\n");
        }

        for(int i=FRAME;i<pages.length;i++)  //后续数组内容LRU置换
        {
            boolean isIncluded = false;   //判断页匡内是否含有下一个内容
            int posToSwitch;  //置换位置的下标
            for(int j=0;j<FRAME;j++)
            {
                if(frames[j] == pages[i])
                {
                    isIncluded = true;
                    timeOfUse[j] = i;
                }
            }
            if(!isIncluded)   //当前页面不包含所需内容
            {
                posToSwitch = getMinOfArray(timeOfUse);
                frames[posToSwitch] = pages[i];
                timeOfUse[posToSwitch] = i;  //记录修改时间
            }

            System.out.print("当前页面:");
            for(int j=0;j<FRAME;j++)
            {
                System.out.print(frames[j]+" ");
            }
            System.out.print("\n");
        }
    }
    public static void lfu(int []pages)
    {
        int numberOfNumbers=0;  //不同数字的个数
        int []num = new int[10];
        int k=0;
        boolean included = false;
        for(int i=0;i<pages.length;i++)
            for(int j=0;j<i;j++)
            {
                if(pages[j]==pages[i])
                    included = true;
                else if(pages[j]!=pages[i]&&!included)
                {
                    numberOfNumbers++;
                    num[k++]=pages[j];
                }
            }
        NumAndTimes[] numAndTimes = new NumAndTimes[numberOfNumbers];

        int []frames = new int[FRAME];
        for(int i=0;i<FRAME;i++)   //0-frame装入并输出
        {
            frames[i] = pages[i];
            System.out.print("当前页面:");
            for(int j=0;j<=i;j++)
            {
                System.out.print(frames[j]+" ");
            }
            System.out.print("\n");
        }

        for(int i=FRAME;i<pages.length;i++)  //后续数组内容LFU置换
        {
            boolean isIncluded = false;   //判断页匡内是否含有下一个内容
            int posToSwitch;  //置换位置的下标
            for(int j=0;j<FRAME;j++)
            {
                if(frames[j] == pages[i])
                {
                    isIncluded = true;
                    timesOfUse[j] = i;
                }
            }
            if(!isIncluded)   //当前页面不包含所需内容
            {

            }

            System.out.print("当前页面:");
            for(int j=0;j<FRAME;j++)
            {
                System.out.print(frames[j]+" ");
            }
            System.out.print("\n");
        }
    }
    public class NumAndTimes
    {
        public int num;
        public int times=0;
    }
}

 
 
 

猜你喜欢

转载自blog.csdn.net/qq_18757521/article/details/53768339