package edu.hut.util;
import java.util.*;
import edu.hut.bean.Member;
import edu.hut.bean.Page;
public class MyRandom {
public static List<Member> list=new ArrayList();//用于存放随机数对象
//在生成一个区间内的随机数地址
public static List getRandom(int left,int right)
{
Member member=new Member();
int self = 0;
Random rand=new Random();
if(left==right)
{
member.setLeftmin(left);
member.setLeftmax(left-1);
member.setRightmax(left);
member.setRightmin(left+1);
member.setSelf(left);
list.add(member);
}
if(left<right){
int r =rand.nextInt(right-left) ;//java产生的随机数
if(r<0)//如果随机数小于0则取绝对值
{
r=Math.abs(rand.nextInt());
}
self=r+left;//生成一个在区间[left,right]中的绝对值
if(self==left)//如果产生的随机数是区间的最小值,则相当于没有左区间
{
member.setLeftmax(left);
}
else
{
member.setLeftmax(self-1);
}
if(self==right)//如果产生的随机数是区间的最大值,则相当于没有右区间
{
member.setRightmin(right);
}
else
{
member.setRightmin(self+1);
}
member.setLeftmin(left);
member.setRightmax(right);
member.setSelf(self);
list.add(member);
MyRandom.getRandom(left, self-1);
MyRandom.getRandom(self+1, right);
}
return list;
}
//创建一个链表集合list,每个元素的值为随机数(得到访问的随机数序列)
public static List array()
{
List<Integer> list=new ArrayList();
Random rand=new Random();
System.out.println("随机数访问串:");
for(int i=0;i<320;i++)
{
list.add(rand.nextInt(319));//(0-319之间的随机数)
// System.out.print(list.get(i)+"\t");
// if(i%10==9)
// {
// System.out.println();
// }
}
return list;
}
//换算成页号序列(把随机数与地址序列中的值比较,从而得到该随机数的地址,把地址除以10得到页号)
public static List caculatepage( )
{
float count = 0;
List<Integer> page=new ArrayList();//存放页号的集合
List<Member> list=MyRandom.getRandom(0, 319);//随机地址序列
int a[]=new int[320];
for(int z=0;z<a.length;z++)
{
a[z]=list.get(z).getSelf();
}
List<Integer> intlist=MyRandom.array();//得到访问的随机数序列
//从intlist中依次取值,查找该数在地址序列中的位置。并按位置分页
for(int i=0;i<intlist.size();i++)
{
int num=intlist.get(i);//循环取出随机数
//查找该随机数的位置
for(int j=0;j<a.length;j++)
{
if(num==a[j])//得到该随机数的位置为j
{
int pagenum=j/10;//得到页号
//System.out.println("换算前的地址:"+j+"\t"+"换算后的页号:"+pagenum);
page.add(pagenum);
}
}
}
System.out.println("访问指令所在的页号序列:");
//输出访问的指令所在的页号序列
// for(int k=0;k<page.size();k++)
// {
// System.out.print(page.get(k)+"\t");
// if(k%10==9)
// {
// System.out.println();
// }
// }
return page;
}
//求一个集合的最大值
public static int max(List<Integer> list)
{
int max=0;
for(int i=0;i<list.size();i++)
{
if(list.get(i)>max)
{
max=list.get(i);
}
}
return max;
}
//求一个集合的最小值
public static int min(List<Integer> list)
{
int min=1000000;
for(int i=0;i<list.size();i++)
{
if(list.get(i)<min)
{
min=list.get(i);
}
}
return min;
}
//先来先服务算法的命中率
public static float FIFO(int n)
{
int count=0;//用于统计出错的页面总数
float shoot = 0;
//定义一个驻留集链表集合
List<Page> zlj=new ArrayList();
//获取页表访问序列
List<Integer> page=MyRandom.caculatepage();
//通过Page对象来比较,判断是否在驻留集中
for(int i=0;i<page.size();i++)
{
int union=-1;
// System.out.println("访问页号为:"+page.get(i));
Page p=new Page();//创建一个页面对象(包括页面的大小和该页的一个标识(用于替换策略))
//page.get(i);获取访问序列中的第i个
p.setValue(page.get(i));//设置页面对象的值
if(zlj.size()==0)
{
p.setFlag(i);
zlj.add(p);
count+=1;
// System.out.println("出错的页号为:"+page.get(i)+"\t"+"页号标识为:"+p.getFlag());
}
else if(zlj.size()>0)//如果驻留集中存在有页面,则循环比较,是否是相同页面的访问
{
for(int j=0;j<zlj.size();j++)//循环比较是否是相同页面
{
if(page.get(i)==zlj.get(j).getValue())//如果是相同页,则不改变驻留集
{
union=1;
break;
}
}
if(union==-1&&zlj.size()<n)//如果驻留集大小小于n,且与驻留集中的不同
{
//得到驻留集中最后一个页的标识flag的值
int flag=zlj.get(zlj.size()-1).getFlag();
p.setFlag(flag+1);//设置该页的标识为上一个页面的标识+1;
zlj.add(p);//把该页面添加到驻留集中
count+=1;
// System.out.println("出错的页号为:"+page.get(i)+"\t"+"页号标识为:"+p.getFlag());
}
else if(union==-1&zlj.size()==n)//此时驻留集已满,且与驻留集中的不同
{
//查找驻留集中页面对象的标识
List<Integer> flag=new ArrayList();
for(int f=1;f<=n;f++)
{
int flag1=zlj.get(zlj.size()-f).getFlag();
flag.add(flag1);
}
//求出最大和最小的标识
int flagmax=MyRandom.max(flag);
int flagmin=MyRandom.min(flag);
for(int k=0;k<zlj.size();k++)
{
if(zlj.get(k).getFlag()==flagmin)// 找到最先进入驻留集的页面对象
{
p.setFlag(flagmax+1);
zlj.set(k, p);//替换最先进入驻留集的页面对象
count+=1;
// System.out.println("出错的页号为:"+page.get(i)+"\t"+"页号标识为:"+p.getFlag());
}
}
}
}
}
System.out.println("驻留集大小为"+n+"时,页面出错数:"+count);
return 1-(float)count/320;
}
//计算命中率(假设页面大小为3)
// public static float FIFO()
// {
//
// int count=0;//用于统计出错的页面总数
// float shoot = 0;
// //定义一个驻留集链表集合
// List<Page> zlj=new ArrayList();
// //获取页表访问序列
// List<Integer> page=MyRandom.caculatepage();
// //通过Page对象来比较,判断是否在驻留集中
// for(int i=0;i<page.size();i++)
// {
// int union=-1;
// System.out.println("访问页号为:"+page.get(i));
// Page p=new Page();//创建一个页面对象(包括页面的大小和该页的一个标识(用于替换策略))
// //page.get(i);获取访问序列中的第i个
// p.setValue(page.get(i));//设置页面对象的值
// if(zlj.size()==0)
// {
// p.setFlag(i);
// zlj.add(p);
// count+=1;
// System.out.println("出错的页号为:"+page.get(i)+"\t"+"页号标识为:"+p.getFlag());
// }
// else if(zlj.size()>0)//如果驻留集中存在有页面,则循环比较,是否是相同页面的访问
// {
// for(int j=0;j<zlj.size();j++)//循环比较是否是相同页面
// {
// if(page.get(i)==zlj.get(j).getValue())//如果是相同页,则不改变驻留集
// {
// union=1;
// break;
// }
// }
// if(union==-1&&zlj.size()<3)//如果驻留集大小小于3,且与驻留集中的不同
// {
// //得到驻留集中最后一个页的标识flag的值
// int flag=zlj.get(zlj.size()-1).getFlag();
// p.setFlag(flag+1);//设置该页的标识为上一个页面的标识+1;
// zlj.add(p);//把该页面添加到驻留集中
// count+=1;
// System.out.println("出错的页号为:"+page.get(i)+"\t"+"页号标识为:"+p.getFlag());
// }
// else if(union==-1&zlj.size()==3)//此时驻留集已满,且与驻留集中的不同
// {
// //查找驻留集中页面对象的标识
// int flag1=zlj.get(zlj.size()-1).getFlag();
// int flag2=zlj.get(zlj.size()-2).getFlag();
// int flag3=zlj.get(zlj.size()-3).getFlag();
// //求出最大和最小的标识
// int flagmax=Math.max(Math.max(flag1, flag2), flag3);
// int flagmin=Math.min(Math.min(flag1, flag2), flag3);
// for(int k=0;k<zlj.size();k++)
// {
// if(zlj.get(k).getFlag()==flagmin)// 找到最先进入驻留集的页面对象
// {
// p.setFlag(flagmax+1);
// zlj.set(k, p);//替换最先进入驻留集的页面对象
// count+=1;
// System.out.println("出错的页号为:"+page.get(i)+"\t"+"页号标识为:"+p.getFlag());
// }
// }
// }
// }
//
//
// }
// System.out.println("页面出错数:"+count);
// return 1-(float)count/320;
// }
public static void main(String[] args) {
List<Integer> intlist=new ArrayList();
List<Member> list=new ArrayList();//创建一个List 集合,用于存�
没有合适的资源?快使用搜索试试~ 我知道了~
存储管理系统设计----操作系统课程设计源代码(Java编写)
共6个文件
class:3个
java:3个
5星 · 超过95%的资源 需积分: 9 63 下载量 71 浏览量
2011-05-06
20:03:21
上传
评论 4
收藏 7KB RAR 举报
温馨提示
存储管理系统设计----操作系统课程设计源代码使用Java编写,写得比较简洁易懂,就是注释少了点
资源推荐
资源详情
资源评论
收起资源包目录
os_cksj.rar (6个子文件)
bin
edu
hut
bean
Page.class 647B
Member.class 1KB
util
MyRandom.class 5KB
src
edu
hut
bean
Member.java 800B
Page.java 316B
util
MyRandom.java 8KB
共 6 条
- 1
资源评论
- 程序小兵的成长2012-06-04写的比较简单,再改进一下就更好了
- ttuyj2013-05-01写的不全面。
- dearkemeng2012-10-29还可以,需要改进一下。
huangfa
- 粉丝: 1
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功