JAVA 页面置换-最近最少使用算法(LRU)

import java.util.Scanner;
import java.util.Random;
class Node {  
     Node next; //头指针  
     Node pre;   //尾指针
     int data;//数据域         
     Node( int data) {  
           this. data = data;  
     }       
     //显示此节点  
     void display() {  
          System. out.print( data + " ");  
     }  
}   
//链队列
class LinkQueue {  
     Node first; // 定义一个头结点 
     Node last; //定义一个尾节点
     int length;// 队列长度   
     LinkQueue() {     //初始化
           this. first = null; 
           this.last=null;
           length=0;
     }    
     // 进队  
     void come( int data) { 
    	 if(length==0){
           Node node = new Node(data);
           node.pre=null;
           node.next=null;
           first=node;  
           last= node;
           length++;
    	 }
    	 else{
    		 Node node = new Node(data);
    		 node.pre=last;
    		 node.next=null;
    		 last.next=node;
    		 last=node;
    		 length++;
    	 }
     }  
     // 出队  
     void out() {  
           first = first. next; 
           first.pre=null;
           length--; 
     }  
     // 根据节点的data删除节点(从队尾到队头,仅仅删除第一个)  
     boolean deleteData( int data) {  
          Node current = last;  
          Node previous; 
          if(first == null || last==null)
        	  return false;
           while (current. data != data) {  
        	   if (current. pre == null) {  
        	   			return false;  
        	   }  
        	   current=current.pre;
           }  
           if(current == last) {  
               last= last. pre;
               last.next=null;
               length--;
           } 
           else if(current.pre==null){  
        	   previous=current. next ;
        	   previous.pre=null;
        	   this.first=previous;
        	   length--;
           }  
           else{
        	   previous=current. pre;
        	   previous.next=current.next;
        	   current=current.next;
        	   current.pre=previous;
        	   length--;
           }
           return true;  
     }  
     // 从队头显示出所有的节点信息  
     void displayF() {  
          Node current = first;  
           while (current != null) {  
              current.display();  
              current = current. next;  
          }  
          System. out.println();  
     }  
      //从队尾显示出所有的节点信息
     void displayL() {  
         Node current = last;  
          while (current != null) {  
             current.display();  
             current = current. pre;  
         }  
         System. out.println();  
    }  
}     
public class aaaa {  
     public static void main(String[] args) {  
/*          LinkQueue linkqueue = new LinkQueue();  
          Scanner reader=new Scanner(System.in);
         int input=reader.nextInt();
          while(input!=233){
        	  linkqueue.addFirstNode(input);
        	  input=reader.nextInt();              
          }
          linkqueue.displayAllNodes();
          linkqueue.deleteByData(4);
          linkqueue.displayAllNodes();
          linkqueue.displayallNodes();  */
          int order=8;           //指令数
      	int [] c=new int[order];     //地址访问顺序
      	int [] b=new int[order];     //页面访问顺序
      	int memory=4;            //内存容量
      	int lose=0;         //页面失效次数
      	double hit_rate=0;  //命中率
      	int i,j,k;
      	int count1=0;
      	int count2=0;
      	int m1,m2,m3;
      	Random rand = new Random();  
  /////////////////////////////////////////////////////////////////////////////////////////
      	System.out.println("产生的随机数为:");
      	for(i=0;;i++){
      		m1=rand.nextInt(320);     //在0--319之间随机产生一个数
      		c[count1]=m1+1;
       		System.out.print(c[count1]+" ");
      		count1++;
      		count2++;
      		if(count1==order)
      			break;
      		if(count2==32){
      			System.out.print("\n");
      			count2=0;
      		}
      		m2=rand.nextInt(m1+1);    //在0--m1+1之间随机产生一个数
      		c[count1]=m2+1;
      		System.out.print(c[count1]+" ");
      		count1++;
      		count2++;
      		if(count1==order)
      			break;
      		if(count2==32){
      			System.out.print("\n");
      			count2=0;
      		}
      		m3=rand.nextInt(320-m2-2)+m2+2;    //在m2+2--319之间随机产生一个数
      		c[count1]=m3+1;
      		System.out.print(c[count1]+" ");
      		count1++; 	
      		count2++;
      		if(count1==order)
      			break;
      		if(count2==32){
      			System.out.print("\n");
      			count2=0;
      		}
      	}
      	System.out.print("\n");
  ///////////////////////////////////////////////////////////////////////////////////////
      	System.out.println("访问页面的顺序为:");
      	count2=0;
      	for(i=0;i<order;i++){
      		b[i]=c[i]/10;
      		System.out.print(b[i]+" ");
      		count2++;
      		if(count2==32){
      			System.out.print("\n");
      			count2=0;
      		}
      	}
      	System.out.print("\n");
  ///////////////////////////////////////////////////////////////////////////////////////
   //   	for(memory=4;memory<=32;memory++){
      		System.out.println("页面进入内存的步骤为:");
      		LinkQueue queue=new LinkQueue();  
      		for(i=0;i<order;i++){
      			if(queue.length==memory){    //如果内存满了,就淘汰最早进入内存的页面,否则直接进入内存
      				if(queue.deleteData(b[i])==false) {   //如果没有命中,缺页次数加一,更新一次队列,否则淘汰最早进入内存的页面
      					lose++;
      					queue.out();
      					queue.come(b[i]);
      				}
      				else{          
      					queue.come(b[i]);
      				}
      			}
      			else{
      				if(queue.deleteData(b[i])==false)   //如果没有命中,缺页次数加一,更新一次队列
      					lose++;
      				queue.come(b[i]);		      				
      			}
      			queue.displayF();
      		}
  /////////////////////////////////////////////////////////////////////////////////////////    	
      		System.out.println("页面失效次数为:"+lose);
      		hit_rate=1-(lose/320.0);
      		System.out.println("命中率="+hit_rate);
      		lose=0;
      		hit_rate=0;
     }  
} 


页面置换过程太长,这里就不截图了,想看的自己运行一下程序。


猜你喜欢

转载自blog.csdn.net/abc1498880402/article/details/80388240
今日推荐