//ChangPage.java
//java core package
//此页面置换算法中地址流限定了地址为20个
import java.awt.*;
import java.awt.event.*;
//java extension package
import javax.swing.*;
public class ChangPage extends JFrame{
private JPanel panel1,panel2,panel3,panel4;
private JLabel label1,label2,label3,label4;
private JTextField text1,text2,text3;
private JButton button1,button2,button3,button4,button5,button6;
private int numBlock=0;//记录用户输入的内存块数
private int sign=0;//标记输入的地址的个数
private Page page=new Page(),pageLRU,pageOPT;
private int timeFIFO=0,timeLRU=0,timeOPT=0;// 缺页次数
private int changFIFO=0,changLRU=0,changOPT=0;//置换次数
private String outputFIFO,outputLRU,outputOPT;//记录置换信息
private JTextArea texta1,texta2,texta3;
private JScrollPane scroller1,scroller2,scroller3;
public ChangPage()
{
super("页面置换算法:此程序的页面访问序列限定为20个");
ActionEventHandler handler=new ActionEventHandler ();
Container container=getContentPane();
container.setLayout(new GridLayout(2,1));//两行一列
label1 = new JLabel( "请您先输入:" ) ;
label2 = new JLabel( "系统所分的物理内存块数:" );
label3 = new JLabel( "地址序号:" );
label4 = new JLabel( " 地址:" );
panel1 = new JPanel();
panel1.setLayout( new GridLayout(2,1) );
panel2 = new JPanel();
panel2.setLayout( new FlowLayout() );
panel3 = new JPanel();
panel3.setLayout( new FlowLayout() );
panel4 = new JPanel();
panel4.setLayout( new FlowLayout() );
texta1=new JTextArea();
texta3=new JTextArea();
texta2=new JTextArea();
scroller1=new JScrollPane( texta1 );
scroller2=new JScrollPane( texta2 );
scroller3=new JScrollPane( texta3 );
text1 = new JTextField(10);
text2 = new JTextField(10);
text3 = new JTextField(10);
button1 = new JButton( "OK" );
button1.addActionListener( handler );
button2 = new JButton( "OK" );
button2.addActionListener( handler );
button3 = new JButton( "Start" );
button3.addActionListener( handler );
button4 = new JButton( "FIFO" );
button4.addActionListener( handler );
button5 = new JButton( "LRU" );
button5.addActionListener( handler );
button6 = new JButton( "OPT" );
button6.addActionListener( handler );
panel2.add( button3 );
panel2.add( button4 );
panel2.add( button5 );
panel2.add( button6 );
panel3.add( label1 );
panel3.add( label2 );
panel3.add( text1 );
panel3.add( button1 );
panel4.add( label3 );
panel4.add( text2 );
panel4.add( label4 );
panel4.add( text3 );
panel4.add( button2 );
panel1.add( panel3 );
panel1.add( panel4 );
container.add( panel1 );
container.add( panel2 );
text1.setEnabled( false );
text2.setEnabled( false );
text3.setEnabled( false );
button1.setEnabled( false );
button2.setEnabled( false );
button4.setEnabled( false );
button5.setEnabled( false );
button6.setEnabled( false );
}
public static void main(String args[])
{
ChangPage wm=new ChangPage();
wm.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
wm.setSize( 500,190 );//第一个参数是宽,第二个是高
wm.setVisible( true );
}
private class ActionEventHandler implements ActionListener
{
public void actionPerformed( ActionEvent event )
{
if( event.getSource()==button3 )
{
text1.setEnabled( true );
button1.setEnabled( true );
}
if( event.getSource()==button1 )
{
numBlock=Integer.parseInt( text1.getText() );
//JOptionPane.showMessageDialog(null,"内存块数 "+numBlock,"温馨提示:",JOptionPane.INFORMATION_MESSAGE);
text2.setText( "地址 1" );
text3.setEnabled( true );
button2.setEnabled( true );
text1.setEnabled( false );
button1.setEnabled( false );
}
if( event.getSource()==button2 )
{
if( sign<20 )
{
page.setAddress( sign,Integer.parseInt( text3.getText() ) );
//JOptionPane.showMessageDialog(null,"第 "+sign+"地址 "+Integer.parseInt( text3.getText()),"温馨提示:",JOptionPane.INFORMATION_MESSAGE);
sign++;
text2.setText( "地址 "+(sign+1) );
text3.setText( "" );
}
if( sign==20 )
{
JOptionPane.showMessageDialog(null,"地址输入完毕,您可以进行页面置换了!","温馨提示:",JOptionPane.INFORMATION_MESSAGE);
button4.setEnabled( true );
button5.setEnabled( true );
button6.setEnabled( true );
pageLRU=new Page( page );
pageOPT=new Page( page );
}
}
if( event.getSource()==button4 )
{
FIFO();
}
if( event.getSource()==button5 )
{
LRU();
}
if( event.getSource()==button6 )
{
OPT();
}
}//end inner class
public int FIFO()
{
int xia;//标记当前地址在block中的下标
int num;//当前地址
outputFIFO="在第二行中,空格表示命中,数字是被置换掉的,*表示直接进入\n"+"1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17\t18\t19\t20\n";
JOptionPane.showMessageDialog(null,"测试成功命中!","温馨提示:",JOptionPane.INFORMATION_MESSAGE);
for( int i=0;i<20;i++ )
{
xia=page.isInBlock( page.getAddress( i ) );//找出当前地址在block中的下表
num=page.getAddress( i );
if( xia!=-1 )//当前的地址在block中已经有了
{
JOptionPane.showMessageDialog(null,"成功命中!" ,"温馨提示:",JOptionPane.INFORMATION_MESSAGE);
//page.moveTo( page.isInBlock( num ) );
//page.putToTop( num );
outputFIFO=outputFIFO+"\t";
}
else{
timeFIFO++;
if( page.getTop()<numBlock-1 )
{
page.putToTop( num );//将page.getAddress( i )放到block的顶端
JOptionPane.showMessageDialog(null,"内存块有空闲,缺页可以直接进入","温馨提示:",JOptionPane.INFORMATION_MESSAGE);
outputFIFO=outputFIFO+"*\t";
}else{
JOptionPane.showMessageDialog(null,"置换成功"+num+" 置换了 "+page.getBlock(0),"温馨提示:",JOptionPane.INFORMATION_MESSAGE);
changFIFO++;
outputFIFO=outputFIFO+page.getBlock(0)+"\t";
page.moveTo( 0 );
page.putToTop( num );
page.printBlock();
}
}
}
outputFIFO=outputFIFO+"\n缺页总次数\t"+timeFIFO+"置换总次数\t"+changFIFO;
texta1.setText( outputFIFO );
JOptionPane.showMessageDialog(null,"FIFO算法置换完毕~","温馨提示:",JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(null,scroller1,"温馨提示:",JOptionPane.INFORMATION_MESSAGE);
return -1;
}
}
public void LRU()
{
int xia;//标记当前地址在block中的下标
int num;//当前地址
outputLRU="在第二行中,空格表示命中,数字是被置换掉的,*表示直接进入\n"+"1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17\t18\t19\t20\n";
JOptionPane.showMessageDialog(null,"测试成功命中!","温馨提示:",JOptionPane.INFORMATION_MESSAGE);
for( int i=0;i<20;i++ )
{
xia=pageLRU.isInBlock( pageLRU.getAddress( i ) );//找出当前地址在block中的下表
num=pageLRU.getAddress( i );
if( xia!=-1 )//当前的地址在block中已经有了
{
JOptionPane.showMessageDialog(null,"成功命中! ","温馨提示:",JOptionPane.INFORMATION_MESSAGE);
pageLRU.moveTo( pageLRU.isInBlock( num ) );
pageLRU.putToTop( num );
outputLRU=outputLRU+"\t";
}
else{
timeLRU++;
if( pageLRU.getTop()<numBlock-1 )
{
pageLRU.putToTop( num );//将pageLRU.getAddress( i )放到block的顶端
JOptionPane.showMessageDialog(null,"内存块有空闲,缺页可以直接进入","温馨提示:",JOptionPane.INFORMATION_MESSAGE);
outputLRU=outputLRU+"*\t";
}else{
JOptionPane.showMessageDialog(null,"置换成功"+num+" 置换了 "+pageLRU.getBlock(0),"温馨提示:",JOptionPane.INFORMATION_MESSAGE);
changLRU++;
outputLRU=outputLRU+pageLRU.getBlock(0)+"\t";
pageLRU.moveTo( 0 );
pageLRU.putToTop( num );
pageLRU.printBlock();
}
}
}
outputLRU=outputLRU+"\n缺页总次数\t"+timeLRU+"置换总次数\t"+changLRU;
texta2.setText( outputLRU );
JOptionPane.showMessageDialog(null,"LRU算法置换完毕~","温馨提示:",JOptionPa