实验四、虚拟存储管理




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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的】 1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方式  段式管理  页式管理  段页式管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值