import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import javax.rmi.CORBA.Tie;
import com.sun.accessibility.internal.resources.accessibility;
public class Page_replacement {
private int n;//内储页框
private int m;//需要访问页面的次数(即页面走向长度
private int F;//没能直接找到的次数,(F/m)为缺页率
private List<Integer>list=null;//页面走向的存储
private Map<Integer,Integer>map=null;
public Page_replacement(){
F=0;
map=new HashMap<Integer,Integer>();//存储每一个内储页框所存的内容
Scanner cin=new Scanner(new BufferedInputStream(System.in));
System.out.println("请输入用户访问页地址走向");
list=new ArrayList<Integer>();
String s=cin.nextLine();
String []s1=s.split(" ");
m=s1.length;
for (int i=0;i<m;i++)
list.add(Integer.valueOf(s1[i]));//页面走向序列
//System.out.println("请输入内储叶框数量");
//n=cin.nextInt();
n = 3;
while(true) {
System.out.println("请输入要进行的置换算法1.最佳置换算法请按 (1) 2.先进先出置换算法 (2) 3.最近最远未使用置换算法(3) 4.退出程序(4)");
switch(cin.nextInt()){
case 1:OPT();break;
case 2:FIFO();break;
case 3:LRU();break;
default: System.out.println("程序结束!");System.exit(-1);
}
}
}
public void OPT(){//最佳置换算法
ArrayList<Integer> t1 = new ArrayList<Integer>();
ArrayList<Integer> t2 = new ArrayList<Integer>();
ArrayList<Integer> t3 = new ArrayList<Integer>();
ArrayList<Integer> t4 = new ArrayList<Integer>();
int j;
for (int i=0;i<m;i++)
{
int k=list.get(i);//待处理元素
//System.out.print(map);
if (!map.containsValue(k)){
F++;//不能直接找到次数加1
t4.add(0);
if (map.size()<n){//如果没有装满
int temp=map.size();
map.put(temp, k);
}
else{//如果装满了
int index=0;//把哪个位置的淘汰出去
int min=0;//初始最长长度
for (int t=0;t<n;t++)
{
for (j=i+1;j<m;j++){//看后面哪一个出现的最晚
if (list.get(j)==map.get(t)){//第一次找到
if (j-i>min){
index=t;//更新值
min=j-i;
}
break;
}
}
if (j==m){//如果到最后
index=t;
min=j-i;
}
}
map.remove(index);
map.put(index,k);//修改表内元素
}
}else {
t4.add(1);
}
t1.add(map.get(0));
t2.add(map.get(1));
t3.add(map.get(2));
}
print(t1, t2, t3, t4);
}
public void FIFO(){//先进先出置换算法
ArrayList<Integer> t1 = new ArrayList<Integer>();
ArrayList<Integer> t2 = new ArrayList<Integer>();
ArrayList<Integer> t3 = new ArrayList<Integer>();
ArrayList<Integer> t4 = new ArrayList<Integer>();
Queue<Integer>q=new LinkedList<Integer>();
for (int i=0;i<m;i++)
{
int k=list.get(i);//待处理元素
if (!map.containsValue(k)){
F++;//不能直接找到次数加1
t4.add(0);
if (map.size()<n){//如果没有装满
int temp=map.size();
map.put(temp, k);
q.offer(temp);//添加元素,如果已满返回false
}
else
{
int temp=q.poll();//排除的元素位置
map.remove(temp);
map.put(temp,k);
q.offer(temp);
}
}
else {
t4.add(1);
}
t1.add(map.get(0));
t2.add(map.get(1));
t3.add(map.get(2));
}
print(t1, t2, t3, t4);
}
public void LRU(){//最近最远未使用置换算法
ArrayList<Integer> t1 = new ArrayList<Integer>();
ArrayList<Integer> t2 = new ArrayList<Integer>();
ArrayList<Integer> t3 = new ArrayList<Integer>();
ArrayList<Integer> t4 = new ArrayList<Integer>();
ArrayList<Integer> t5 = new ArrayList<Integer>();
int[]a = new int[3];
List<Integer>linkedlist=new LinkedList<Integer>();
// int start=0;
for (int i=0;i<m;i++)
{
int k=list.get(i);//待处理元素
if (!map.containsKey(k)){
F++;//不能直接找到次数加1
t4.add(0);
if (map.size()<n){//如果没有装满
int temp=map.size();
map.put(k,temp);
a[temp] = k;
linkedlist.add(k);//添加位置
}
else
{
int temp=linkedlist.get(0);
int c= map.get(temp);//位置
map.remove(temp);
map.put(k,c);
a[c] = k;
linkedlist.remove(0);
linkedlist.add(k);
}
}
else//如果包含这个值,把这个值拿走并在后面压入
{ t4.add(1);
int d=linkedlist.indexOf(k);//查找存在位置
linkedlist.remove(d);
linkedlist.add(k);
}
for (int j = 0; j < 3; j++) {
switch(j) {
case 0:
t1.add(a[0]);
break;
case 1:
t2.add(a[1]);
break;
case 2:
t3.add(a[2]);
break;
}
}
}
print(t1, t2, t3, t4);
}
public void print(ArrayList<Integer> t1,ArrayList<Integer> t2,ArrayList<Integer> t3,ArrayList<Integer> t4) {
System.out.print("页面走向"+"\t");
for (Integer integer : list) {
System.out.print(integer+"\t");
}
System.out.println();
System.out.print("物理块1"+"\t");
for (Integer integer : t1) {
System.out.print(integer+"\t");
}
System.out.println();
System.out.print("物理块2"+"\t");
for (Integer integer : t2) {
System.out.print(integer+"\t");
}
System.out.println();
System.out.print("物理块3"+"\t");
for (Integer integer : t3) {
System.out.print(integer+"\t");
}
System.out.println();
System.out.print("是否缺页"+"\t");
for (Integer integer : t4) {
System.out.print(integer+"\t");
}
System.out.println();
System.out.println("缺页次数:"+F);
System.out.println("缺页次数:"+F);
System.out.println("误码率为:"+F*1.0/m);
F = 0;
for (int i = 0; i < 3; i++) {
map.remove(i);
}
}
public static void main(String args[]){
Page_replacement p=new Page_replacement();
}
}
实验四、虚拟存储管理
最新推荐文章于 2023-10-19 19:53:48 发布