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

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

一、如果内存空间没满:

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

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

二、如果内存已经占满:

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

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

 

 

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

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

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

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("  ");
		}
	}
}

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整虚拟存储管理器实验报告!一、实验目的请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。二、实验环境 Turbo C 2.0/3.0或VC++6.0三、实验内容本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFOLRU算法进行页面置换的情形。其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。四、实验说明 1.设计中虚页和实页的表示本设计利用C语言的结构体来描述虚页和实页的结构。pnpfntimepnpfnnext 虚页结构 实页结构在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。pfn代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。在实页结构中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。2.关于缺页次数的统计为计算命中率,需要统计在20次的虚页访问中命中的次数。为此,程序应设置一个计数器count,来统计虚页命中发生的次数。每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内,此虚页被命中,count加1。最终命中率=count/20*100%。3.LRU算法中“最近最久未用”页面的确定为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前countime值,表示该虚页的最后一次被访问时间。当LRU算法需要置换时,从所有已分配实页的虚页中找出time值为最小的虚页就是“最近最久未用”的虚页面,应该将它置换出去。4.算法中实页的组织因为能分配的实页数n是在程序运行时由用户动态指派的,所以应使用链表组织动态产生的多个实页。为了调度算法实现的方便,可以考虑引入free和busy两个链表:free链表用于组织未分配出去的实页,首指针为free_head,初始时n个实页都处于free链表中;busy链表用于组织已分配出去的实页,首指针为busy_head,尾指针为busy_tail,初始值都为null。当所要访问的一个虚页不在实页中时,将产生缺页中断。此时若free链表不为空,就取下链表首指针所指的实页,并分配给该虚页。若free链表为空,则说明n个实页已全部分配出去,此时应进行页面置换:对于FIFO算法要将busy_head 所指的实页从busy链表中取下,分配给该虚页,然后再将该实页插入到busy链表尾部;对于LRU算法则要从所有已分配实页的虚页中找出time值为最小的虚页,将该虚页从装载它的那个实页中置换出去,并在该实页中装入当前正要访问的虚页。~

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值