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; } }
页面置换过程太长,这里就不截图了,想看的自己运行一下程序。