CENTRALSOUTHUNIVERSITY计算机体系结构实验报告题目使用LRU方法更新Cache一、实验目的了解和掌握寄存器分配和内存分配的有关技术。二、实验环境EclipseIDEforJavaDevelopers(Version:KeplerRelease)Win7三、实验内容结合数据结构的相关知识,使用LRU的策略,对一组访问序列进行内部的Cache更新。LRU置换算法是选择最近最久未使用的页面予以置换。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来经历的时间T,当须淘汰一个页面时,选择现有页面中T值最大的,即最近最久没有访问的页面。这是一个比较合理的置换算法。举例说明此问题,例如:有一个CACHE采用组相连映象方式。每组有四块,为了实现LRU置换算法,在快表中为每块设置一个2位计数器。我们假设访问序列为“1,1,2,4,3,5,2,1,6,7,1,3”。在访问CACHE的过程中,块的装入,置换及命中时,具体情况如下表所示:四、关键代码程序分情况讨论了,当一个cache装满的情况下,2个,3个4个装满的情况下,当输入访问序列的时候,自动进行识别,并进行相应的处理,这个就是当四个块都被装满的情况else{//四个cache块都装满的情况if(jtf2.getText().equals(jt.getValueAt(list-3,1))){//要访问的页面刚好在cache0中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),jt.getValueAt(list-3,2),jt.getValueAt(list-3,3),jt.getValueAt(list-3,4),命中});System.out.println(1);time1=0;time2++;time3++;time4++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);}五、运行截图及源代码如果按照访问序列“1,1,2,4,3,5,2,1,6,7,1,3”输入,运行结果如图可以看到,始终满足的是LRU源代码:package使用LRU方法更新Cache;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.table.*;publicclassLRUCacheextendsFrame{publicstaticvoidmain(String[]args){JFrame.setDefaultLookAndFeelDecorated(true);LRUCachelruc=newLRUCache();lruc.lauchFrame();}JLabeljlabel2;JTextFieldjtf2;JButtonjb_input;JScrollPanejsp;JTablejt;DefaultTableModeldtm;staticintlist=1,count=list-1;inttime1=0;inttime2=0;inttime3=0;inttime4=0;publicvoidlauchFrame(){this.setLayout(null);this.setBounds(100,100,540,320);this.setBackground(Color.cyan);this.setVisible(true);jlabel2=newJLabel(请输入第+list+个访问页面:);jtf2=newJTextField();jb_input=newJButton(输入);jlabel2.setBounds(20,50,140,20);jtf2.setBounds(155,50,50,20);jb_input.setBounds(240,50,60,20);this.add(jlabel2);this.add(jtf2);this.add(jb_input);this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});jb_input.addActionListener(newInputActionListener());Object[]title={访问序列,Cache块0,Cache块1,Cache块2,Cache块3,状态};dtm=newDefaultTableModel(title,0);jt=newJTable(dtm);jsp=newJScrollPane(jt);jsp.setBounds(50,80,440,197);jsp.setBackground(Color.black);this.add(jsp);}classInputActionListenerimplementsActionListener{publicvoidactionPerformed(ActionEvente){if(jtf2.getText().equals()){Object[]options={OK};JOptionPane.showOptionDialog(null,你的输入存在“”,请按提示输入!,警告,JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE,null,options,options[0]);}list++;if(count4){//count记录装入cache块的页面数switch(count){case0://cache块中没有装入页面的情况dtm.addRow(newObject[]{jtf2.getText(),jtf2.getText(),,,,装入});time2++;time3++;time4++;count++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);break;case1://cache块中装入一个页面的情况if(jtf2.getText().equals(jt.getValueAt(list-3,1))){//要访问的页面刚好在cache0中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),,,,命中});time2++;time3++;time4++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);}else{//要访问的页面不在cache块中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),jtf2.getText(),,,装入});time1++;time2=0;time3++;time4++;count++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);}break;case2://cache块中装入两个页面的情况if(jtf2.getText().equals(jt.getValueAt(list-3,1))){//要访问的页面刚好在cache0中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),jt.getValueAt(list-3,2),,,命中});time1=0;time2++;time3++;time4++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);}elseif(jtf2.getText().equals(jt.getValueAt(list-3,2))){//要访问的页面刚好在cache1中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),jt.getValueAt(list-3,2),,,命中});time1++;time2=0;time3++;time4++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);}else{//要访问的页面不在cache块中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),jt.getValueAt(list-3,2),jtf2.getText(),,装入});time1++;time2++;time3=0;time4++;count++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);}break;case3://cache块中装入三个页面的情况if(jtf2.getText().equals(jt.getValueAt(list-3,1))){//要访问的页面刚好在cache0中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),jt.getValueAt(list-3,2),jt.getValueAt(list-3,3),,命中});time1=0;time2++;time3++;time4++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);}elseif(jtf2.getText().equals(jt.getValueAt(list-3,2))){//要访问的页面刚好在cache1中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),jt.getValueAt(list-3,2),jt.getValueAt(list-3,3),,命中});time1++;time2=0;time3++;time4++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);}elseif(jtf2.getText().equals(jt.getValueAt(list-3,3))){//要访问的页面刚好在cache2中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),jt.getValueAt(list-3,2),jt.getValueAt(list-3,3),,命中});time1++;time2++;time3=0;time4++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);}else{//要访问的页面不在cache块中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),jt.getValueAt(list-3,2),jt.getValueAt(list-3,3),jtf2.getText(),装入});time1++;time2++;time3++;time4=0;count++;jtf2.setText();jlabel2.setText(请输入第+list+个访问页面:);}break;}}else{//四个cache块都装满的情况if(jtf2.getText().equals(jt.getValueAt(list-3,1))){//要访问的页面刚好在cache0中dtm.addRow(newObject[]{jtf2.getText(),jt.getValueAt(list-3,1),jt.getValueAt(list-3,2),