操作系统——OPT、LRU、FIFO java语言实现

这三种算法在实现的过程中的分析过程是这样的:

一、如果内存空间没满:

(1)加入的数据与现有的数据不相等怎么办

(2)加入的数据与现有的数据相等怎么办

二、如果内存已经占满:

(1)加入的数据与现有的数据不相等怎么办

(2)加入的数据与现有的数据相等怎么办

这四种情况中    二、(2)是最繁琐的一部分。

在这里也仅仅介绍这一部分的实现过程:

OPT算法:采用数组记录   t[30]   的方式,从当前位置向后遍历数据最远出现的数据的下标,然后进行替换。

扫描二维码关注公众号,回复: 8937374 查看本文章

LRU算法:其实思路与OPT算法的实现思路异曲同工,比LRU要简单,设置一个时间数组,对于数据进行时间记录,最终替换时间最久的数据。

FIFO算法:FIFO就非常巧妙了,在内存满,数据不相等时,利用预先设置好的flag数组进行记录替换次数,FIFO又称为先进先出,假设数据自顶向下存储,那么最顶端的就是最早出现的数据。每次都替换flag数值位置上的数据,当flag与存储空间相等时,再次将flag置0。

OPT 算法:

 opt思想是:最久不使用的被替换,

package OPT;
import java.util.*;
public class OPT {
	public static void sort(ArrayList p)
	{
		for(int i=0;i<p.size();i++)
			System.out.print(p.get(i)+" ");
		System.out.println("\n");
	}
	public static void main(String[] args) {
		Scanner input =new Scanner(System.in);
		System.out.println("请输入数据数量:");
		int n=input.nextInt();
		System.out.println("页面大小固定为3");
		int t=3;
		ArrayList<ArrayList> OPT = new ArrayList<>();
		ArrayList<Integer> page = new ArrayList<>();
		int []a = new int [20];
		System.out.println("请输入数据:");
		for(int i=0;i<n;i++)
			a[i] = input.nextInt();
		page.add(a[0]);
		ArrayList<Integer> pp=new ArrayList<>(page);
		OPT.add(pp);
		for(int i=1;i<n;i++)
		{
			if(page.size()<t)
			{
				boolean pos = page.contains(a[i]);
				if(!pos)
				{
					page.add(page.size(),a[i]);
					//sort(page);
					ArrayList<Integer> p=new ArrayList<>(page);
					OPT.add(p);
				}
				else
				{
					ArrayList<Integer> p=new ArrayList<>(page);
					OPT.add(p);
					//sort(page);
				}
			}
			else
			{
				boolean pos = page.contains(a[i]);
				if(pos)
				{
					ArrayList<Integer> p=new ArrayList<>(page);
					OPT.add(p);
					//sort(page);
				}
				else
				{
					int tt[] = new int [t];
					for(int j=0;j<t;j++)
					{
						tt[j]=10000;
					}
					for(int k=0;k<t;k++)
					{
						int comp = page.get(k);
						for(int j=i;j<n;j++)
						{
							if(comp==a[j])
								if(j<tt[k]) tt[k]=j;
						}
					}
					int MAX=tt[0],MAXi=0;
					for(int j=1;j<t;j++)
						if(MAX==tt[j]) {}
						else if(MAX<tt[j]) {MAX=tt[j];MAXi=j;}
					page.set(MAXi, a[i]);
					//sort(page);
					ArrayList<Integer> p=new ArrayList<>(page);
					OPT.add(p);
				}
			}
		}
		//System.out.println(OPT.size());
		for(int i=0;i<OPT.size();i++)
		{
			ArrayList cho = OPT.get(i);
			if(cho.size()>=1)
			{
				System.out.print(cho.get(0)+" ");
			}
			else
				System.out.println("  ");
		}
		System.out.println();
		for(int i=0;i<OPT.size();i++)
		{
			ArrayList cho = OPT.get(i);
			if(cho.size()>=2)
			{
				System.out.print(cho.get(1)+" ");
			}
			else
				System.out.print("  ");
		}
		System.out.println();
		for(int i=0;i<OPT.size();i++)
		{
			ArrayList cho = OPT.get(i);
			if(cho.size()>=3)
			{
				System.out.print(cho.get(2)+" ");
			}
			else
				System.out.print("  ");
		}
	}
}

 

LRU算法:

package LRU;
import java.util.*;
public class LRU {
	public static void sort(ArrayList p,int time[])
	{
		for(int i=0;i<p.size();i++)
			System.out.print(p.get(i)+" ");
		System.out.println();
		for(int i=0;i<time.length;i++)
			System.out.print(time[i]+" ");
		System.out.println("\n");
	}
	public static void main(String[] args) {
		Scanner input =new Scanner(System.in);
		System.out.println("请输入数据数量:");
		int n=input.nextInt();
		System.out.println("页面大小固定为3");
		int t=3;
		ArrayList<ArrayList> LRU = new ArrayList<>();
		ArrayList<Integer> page = new ArrayList<>();
		int []a = new int [20];
		
		int []time = new int [t];
		for(int i=0;i<t;i++)
			time[i]=0;
		
		System.out.println("请输入数据:");
		for(int i=0;i<n;i++)
			a[i] = input.nextInt();
		
		page.add(a[0]);
		ArrayList<Integer> pp=new ArrayList<>(page);
		LRU.add(pp);
		for(int mar=0;mar<page.size();mar++)
			time[mar]++;
		sort(page,time);
		
		for(int i=1;i<n;i++)
		{
			if(page.size()<t)//内存不满
			{
				boolean pos = page.contains(a[i]);//元素不等
				if(!pos)
				{
					page.add(page.size(),a[i]);//首先加入page 中
					for(int mar=0;mar<page.size();mar++)//再将时间累加
						time[mar]++;
					sort(page,time);
					ArrayList<Integer> p=new ArrayList<>(page);
					LRU.add(p);
				}
				else//元素相等
				{
					for(int mar=0;mar<page.size();mar++)//先将时间累加
						time[mar]++;
					int rep = page.indexOf(a[i]);//查找对应相等元素下标
					time[rep] = 1; //时间置1
					sort(page,time);
					ArrayList<Integer> p=new ArrayList<>(page);
					LRU.add(p);
					//sort(page);
				}
			}
			else//内存满
			{
				boolean pos = page.contains(a[i]);
				if(pos)//元素相等
				{
					for(int mar=0;mar<t;mar++)//先将时间累加
						time[mar]++;
					int rep = page.indexOf(a[i]);//查找对应相等元素下标
					time[rep] = 1; //时间置1
					sort(page,time);
					ArrayList<Integer> p=new ArrayList<>(page);
					LRU.add(p);
				}
				else//元素不等
				{
					//查找时间最久元素
					int MAX = time[0],MAXi = 0;
					for(int j=1;j<t;j++)
						if(MAX==time[j]) {}
						else if(MAX<time[j]) {MAX = time[j]; MAXi = j;}
					
					for(int mar=0;mar<t;mar++)//遍历累加时间
						time[mar]++;
					time[MAXi] = 1;//置改变位置时间为1
					page.set(MAXi, a[i]);//替换元素
					sort(page,time);
					ArrayList<Integer> p=new ArrayList<>(page);
					LRU.add(p);
				}
			}
		}
		for(int i=0;i<LRU.size();i++)
		{
			ArrayList cho = LRU.get(i);
			if(cho.size()>=1)
			{
				System.out.print(cho.get(0)+" ");
			}
			else
				System.out.println("  ");
		}
		System.out.println();
		for(int i=0;i<LRU.size();i++)
		{
			ArrayList cho = LRU.get(i);
			if(cho.size()>=2)
			{
				System.out.print(cho.get(1)+" ");
			}
			else
				System.out.print("  ");
		}
		System.out.println();
		for(int i=0;i<LRU.size();i++)
		{
			ArrayList cho = LRU.get(i);
			if(cho.size()>=3)
			{
				System.out.print(cho.get(2)+" ");
			}
			else
				System.out.print("  ");
		}
	}
}

FIFO算法:

package FIFO;

import java.util.ArrayList;
import java.util.Scanner;

public class FIFO {
	public static void sort(ArrayList p,int time[])
	{
		for(int i=0;i<p.size();i++)
			System.out.print(p.get(i)+" ");
		System.out.println();
		for(int i=0;i<time.length;i++)
			System.out.print(time[i]+" ");
		System.out.println("\n");
	}
	public static void main(String[] args) {
		Scanner input =new Scanner(System.in);
		System.out.println("请输入数据数量:");
		int n=input.nextInt();
		System.out.println("页面大小固定为3");
		int t=3;
		ArrayList<ArrayList> LRU = new ArrayList<>();
		ArrayList<Integer> page = new ArrayList<>();
		int []a = new int [20];
		
		int []time = new int [t];
		int flag = 0;
		for(int i=0;i<t;i++)
			time[i]=0;
		
		System.out.println("请输入数据:");
		for(int i=0;i<n;i++)
			a[i] = input.nextInt();
		
		page.add(a[0]);
		ArrayList<Integer> pp=new ArrayList<>(page);
		LRU.add(pp);
		for(int mar=0;mar<page.size();mar++)
			time[mar]++;
		//sort(page,time);
		
		for(int i=1;i<n;i++)
		{
			if(page.size()<t)//内存不满
			{
				boolean pos = page.contains(a[i]);//元素不等
				if(!pos)
				{
					page.add(page.size(),a[i]);//首先加入page 中
					//sort(page,time);
					ArrayList<Integer> p=new ArrayList<>(page);
					LRU.add(p);
				}
				else//元素相等
				{
					int rep = page.indexOf(a[i]);//查找对应相等元素下标
					//sort(page,time);
					ArrayList<Integer> p=new ArrayList<>(page);
					LRU.add(p);
				}
			}
			else//内存满
			{
				boolean pos = page.contains(a[i]);
				if(pos)//元素相等
				{
					int rep = page.indexOf(a[i]);//查找对应相等元素下标
					//sort(page,time);
					ArrayList<Integer> p=new ArrayList<>(page);
					LRU.add(p);
				}
				else//元素不等
				{
					page.set(flag, a[i]);//替换元素
					flag++;
					if(flag==t)
						flag = 0;
					//sort(page,time);
					ArrayList<Integer> p=new ArrayList<>(page);
					LRU.add(p);
				}
			}
		}
		for(int i=0;i<LRU.size();i++)
		{
			ArrayList cho = LRU.get(i);
			if(cho.size()>=1)
			{
				System.out.print(cho.get(0)+" ");
			}
			else
				System.out.println("  ");
		}
		System.out.println();
		for(int i=0;i<LRU.size();i++)
		{
			ArrayList cho = LRU.get(i);
			if(cho.size()>=2)
			{
				System.out.print(cho.get(1)+" ");
			}
			else
				System.out.print("  ");
		}
		System.out.println();
		for(int i=0;i<LRU.size();i++)
		{
			ArrayList cho = LRU.get(i);
			if(cho.size()>=3)
			{
				System.out.print(cho.get(2)+" ");
			}
			else
				System.out.print("  ");
		}
	}
}

发布了77 篇原创文章 · 获赞 7 · 访问量 9070

猜你喜欢

转载自blog.csdn.net/qq_41886231/article/details/102760799