模拟操作系统的页面置换

这个实验要求有点神奇,所以按照书上的要求写了

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.*;

/*
 *  @author Anima_libera
 */

/*
 * display
 */
public class Display extends JFrame implements ActionListener{
	
	/*
	 * 程序入口
	 */
	public static void main(String args[]){
		new Display();
	}
	
	/*
	 * 变量
	 */
	private int arr[],time[],blockArr[];
	private int lack = 0;
	
	private JPanel centre = new JPanel();
	private JPanel choice = new JPanel();
	private JPanel top = new JPanel();
	private JPanel cal = new JPanel();
	private JPanel par = new JPanel();
	private JPanel author = new JPanel();
	private JPanel chopar = new JPanel();
	
	private int pageNum,blockNum;
	
	private JButton create = new JButton("生成序列");
	
	private ButtonGroup bg = new ButtonGroup();
	
	private JLabel authorLab[] = new JLabel[3];
	private JLabel parLab[] = new JLabel[2];
	private JLabel calLab[] = new JLabel[2];
	
	private JTextField parJTF[] = new JTextField[2];
	private JTextField calJTF[] = new JTextField[2];
	
	private JScrollPane JSP[] = new JScrollPane[2];
	
	private JTextArea order = new JTextArea();
	private JTextArea JTA = new JTextArea();
	
	private JRadioButton choBut[] = new JRadioButton[3]; 

	
	/*
	 * 构造函数
	 */
	Display(){
		setTitle("页面置换");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(800,700);
		init();
		setVisible(true);
	}
	
	/*
	 * 初始化
	 */
	public void init(){
		initTop();
		initCal();
		initCent();
	}
	/*
	 * 事件处理
	 */
	public void actionPerformed(ActionEvent e){
		if(parJTF[0].getText().toString().matches("[0-9]+") && parJTF[1].getText().toString().matches("[0-9]+")){
			blockNum = Integer.parseInt(parJTF[0].getText().toString());
			pageNum = Integer.parseInt(parJTF[1].getText().toString());
			if((pageNum >= blockNum) && pageNum > 2 && blockNum > 1){
				orderChange();
				}
			else{
				JOptionPane.showMessageDialog(null, "页数要大于或等于块数且页数要大于2,块数大于1", "输入错误", JOptionPane.INFORMATION_MESSAGE);
			}
		}else{
			JOptionPane.showMessageDialog(null, "输入格式错误或者无输入", "输入错误", JOptionPane.INFORMATION_MESSAGE);
		}
			
	}
	/*
	 * initTop
	 */
	public void initTop(){
		top.setLayout(new GridLayout(2,1));
		author.setLayout(new FlowLayout(FlowLayout.CENTER,60,1));
		
		for(int i = 0;i < authorLab.length;++ i){
			authorLab[i] = new JLabel();
		}
		
		authorLab[0].setText("王勇杰");
		authorLab[1].setText("20112004037");
		authorLab[2].setText("8班");
		
		for(int i = 0;i < authorLab.length; ++ i){
			author.add(authorLab[i]);
		}
		
		chopar.setLayout(new GridLayout(1,2));
		
		par.setBorder(new TitledBorder("输入参数"));
		for(int i = 0;i < parJTF.length; ++ i){
			parLab[i] = new JLabel();
			parJTF[i] = new JTextField(5);
		}
		
		parLab[0].setText("分配块数:");
		parLab[1].setText("程序页数:");
		
		par.add(parLab[0]);
		par.add(parJTF[0]);
		par.add(parLab[1]);
		par.add(parJTF[1]);
		par.add(create);
		create.addActionListener(this);
		
		
		choice.setBorder(new TitledBorder("算法选择"));
		for(int i = 0;i < choBut.length;++ i){
			choBut[i] = new JRadioButton();
			choice.add(choBut[i]);
			bg.add(choBut[i]);
		}
		
		choBut[0].setSelected(true);
		choBut[0].setText("OPT");
		choBut[1].setText("FIFO");
		choBut[2].setText("LRU");
		
		chopar.add(choice);
		chopar.add(par);
		top.add(author);
		top.add(chopar);
		
		Container con = getContentPane();
		con.add(top,BorderLayout.NORTH);
		setVisible(true);
	}
	/*
	 * initCent
	 */
	public void initCent(){
		for(int i = 0;i < JSP.length;++ i){
			JSP[i] = new JScrollPane();
		}
		GridBagLayout GBL = new GridBagLayout();
		GridBagConstraints GBC = new GridBagConstraints();
		centre.setLayout(GBL);
		
		GBC.fill = GridBagConstraints.BOTH;
		GBC.weightx = 10;
		GBC.weighty = 2;
		GBC.gridwidth = GridBagConstraints.REMAINDER;//换行
		GBL.setConstraints(JSP[0], GBC);

		GBC.weighty = 50;
		GBC.gridheight = 5;
		GBL.setConstraints(JSP[1], GBC);
		
		JSP[0].setBorder(new TitledBorder("页面序列"));
		JSP[1].setBorder(new TitledBorder("置换过程"));
		
		JSP[0].setViewportView(order);
		JSP[1].setViewportView(JTA);
		
		order.setEditable(false);
		JTA.setEditable(false);
		
		centre.add(JSP[0]);
		centre.add(JSP[1]);//JScrollPane是个面板,是容器,应该吧contenPane里面加上一个JScrollPane子容器
		
		Container con = getContentPane();
		con.add(centre,BorderLayout.CENTER);
		setVisible(true);
	}
	/*
	 * initCal
	 */
	public void initCal(){
		for(int i = 0;i < calJTF.length; ++ i){
			calLab[i] = new JLabel();
			calJTF[i] = new JTextField(10);
		}
		
		calLab[0].setText("缺页次数:");
		calLab[1].setText("缺页率:");
		
		
		for(int i = 0;i < calLab.length;++ i){
			cal.add(calLab[i]);
			cal.add(calJTF[i]);
			calJTF[i].setEditable(false);
		}

		cal.setBorder(new TitledBorder("性能评估"));
		Container con = getContentPane();
		con.add(cal,BorderLayout.SOUTH);
		setVisible(true);
	}
	/*
	 * orderChange
	 */
	public void orderChange(){
		order.setText(" ");
		int num = (pageNum + 1)/ 2;
		
		arr = new int[pageNum];

		for(int i = 0 ;i < num;++ i){
			arr[i] = (int)(Math.random() * Integer.MAX_VALUE + 1);
		}
		Arrays.sort(arr, 0, num );
		for(int i = 0;i < num / 2;++ i){//25%前向取值
			arr[num + i] = arr[(int)(Math.random() * num / 2)];
		}
		for(int i = 0;i < (pageNum - num - num / 2);++ i){//25%后向取值
			arr[num + i + (num / 2)] = arr[(int)(Math.random() * num / 2) + (num / 2)];
		}
		for(int i = 0 ;i < arr.length;++ i){
			order.append(arr[i] + "	");
		}
		
		blockChange();
	}
	/*
	 * JTAChange,参数用于直接添加还是晴空后添加
	 */
	public void JTAChange(){
		for(int i = 0;i < blockNum;++ i){
			JTA.append(blockArr[i] + "	");
		}	
		JTA.append("\n");
	}
	/*
	 * calChange
	 */
	public void calChange(){
		calJTF[0].setText(Integer.toString(lack));
		float lackp = (float)(lack) / (float)(pageNum);
		calJTF[1].setText(Float.toString(lackp) + "%");
	}
	/*
	 * blockChange
	 */
	public void blockChange(){

		blockArr = new int[blockNum];
		time = new int[blockNum];
		boolean flag = true;
		for(int i = 0; i < blockNum;++ i){//第一次把整个队列填满
			for(int j = 0;j < blockArr.length;++ j){
				if(blockArr[j] == arr[i])
					flag = false;
			}
			if(flag){
				blockArr[i] = arr[i];
				time[i] = blockNum - i - 1;
			}
		}
		
		JTA.setText("");
		for(int i = 0 ;i < blockNum;++ i){
			if(blockArr[i] == 0 || blockNum == ((pageNum + 1) / 2)){
				JTA.append("无需替换:\n");
				for(int j = 0;j < blockNum;++ j){
					if(blockArr[j] != 0){
						JTA.append(blockArr[j] + "	");
					}
				}
				lack = 0;
				calChange();
				return ;
			}
		}
		if(choBut[0].isSelected())
			OPT();
		if(choBut[1].isSelected())
			FIFO();
		if(choBut[2].isSelected())
			LRU();
	}
	/*
	 * OPT
	 */
	public void OPT(){
		lack = 0;
		int cha = 0,j = 0;
		for(int i = 0;i < (pageNum - blockNum);++ i,cha ++){
			j = cha + blockNum + 1;
			JTA.append("正在执行第" + j + "页:\n");
			OPTRun(cha);
			JTAChange();
		}
		calChange();
	}
	/*
	 * OPTrun
	 */
	public void OPTRun(int cha){
		int tem = 0,tem1 = 0;
		boolean fl = false;
		boolean fla = false;
		for(int i = 0;i < blockNum;++ i){
			if(arr[blockNum + cha] == blockArr[i])
				fla = true;
		}
		if(fla)
			return;
		for(int i = 0;i < blockNum;++ i){
			for(int j = blockNum + cha;j < pageNum;j ++){
				if(blockArr[i] == arr[j]){
					if(j > tem){
						tem = j;//记录多久后交换
						tem1 = i;//记录要换的序号
						fl = true;
						break;
					}
					fl = true;
				}
			}
			if(!fl){//没找到
				tem1 = i;
				break;
			}
			fl = false;
		}
		blockArr[tem1] = arr[blockNum + cha];
		lack ++;
	}
	/*
	 * FIFO
	 */
	public void FIFO(){
		lack = 0;
		int cha = 0,j = 0,k = 0;
		for(int i = 0;i < (pageNum - blockNum);++ i,cha ++){
			j = cha + blockNum + 1;
			JTA.append("正在执行第" + j + "页:\n");
			
			boolean fla = false;
			for(int x = 0;x < blockNum;++ x){
				if(arr[blockNum + cha] == blockArr[x])
					fla = true;
			}
			if(!fla){
				blockArr[k] = arr[blockNum + cha];
				k = (k + 1) % blockNum;
				lack ++;
			}
			
			JTAChange();
		}
		calChange();
	}
	/*
	 * LRU
	 */
	public void LRU(){
		lack = 0;
		int cha = 0,j = 0;
		for(int i = 0;i < (pageNum - blockNum);++ i,cha ++){
			j = cha + blockNum + 1;
			JTA.append("正在执行第" + j + "页:\n");
			
			boolean fla = false;
			for(int x = 0;x < blockNum;++ x){
				if(arr[blockNum + cha] == blockArr[x]){
					fla = true;
					time[x] = 0;
				}
				else{
					time[x]++;
				}
			}
			if(!fla){
				int tem = 0,tem1 = 0;
				for(int y = 0;y < blockNum;y ++){
					if(time[y] > tem){
						tem = time[y];
						tem1 = y;
					}
				}
				blockArr[tem1] = arr[blockNum + cha];
				time[tem1] = 0;
				lack ++;
			}
			
			JTAChange();
		}
		calChange();
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值