⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pagechange.java

📁 用JAVA实现操作系统的页面置换 其中包括 最佳置换算法(Optimal)、先进先出算法(First-in, First-out) 、最近最久不用的页面置换算法(LeastRecently Used
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class pageChange extends JPanel implements ActionListener {
	JPanel pan1, pan2, pan3, pan4;
	JButton button1, button2, button3, clearButton, randomButton;
	JTextField text1, text2, text3, text4;
	String m_random = "";// 页面序列
	int m, n, length;
	int myt[];
	randomNumber RN;
	displayView FIFOTA, LRUTA;
	public pageChange() {
		pan1 = new JPanel();
    	pan2 = new JPanel();
		pan3 = new JPanel();
		text1 = new JTextField(4);
		text2 = new JTextField(5);
		text3 = new JTextField();
		text4 = new JTextField();
		text4.setEditable(false);
	//	pan1.setLayout(new GridLayout(4, 2));
		pan1.add(new JLabel("    物理块数  "));
		pan1.add(text1);
		pan1.add(new JLabel("   置换页面数  "));
    	pan1.add(text2);
		pan1.add(new JLabel("    页表长度   "));
		pan1.add(text3);
		pan1.add(new JLabel("  页面号引用串 "));
    	pan1.add(text4);
		FIFOTA = new displayView();
		LRUTA = new displayView();
		pan2.setLayout(new GridLayout(1, 3));
		pan2.add(FIFOTA);
		pan2.add(LRUTA);
		button1 = new JButton("FIFO");
		button2 = new JButton("LRU");
		randomButton = new JButton("Random");
		clearButton = new JButton("Clear");
		button1.addActionListener(this);
		button2.addActionListener(this);
		clearButton.addActionListener(this);
		randomButton.addActionListener(this);
		pan3.add(randomButton);
		pan3.add(button1);
		pan3.add(button2);
		pan3.add(clearButton);
		setLayout(new BorderLayout());
		add(BorderLayout.NORTH, pan1);
		add(BorderLayout.CENTER, pan2);
		add(BorderLayout.SOUTH, pan3);
	}
	public void misInPut() {
		try {
			String str1, str2;
			str1 = "";
			str2 = "";
			m = Integer.parseInt(text1.getText());
			n = Integer.parseInt(text2.getText());
			length = Integer.parseInt(text3.getText());
			if (m == 0 || n == 0 || length == 0) {
				JOptionPane.showMessageDialog(this, "请输入数字字符", "提示!",
						JOptionPane.ERROR_MESSAGE);
			}
			if (m > n && length != 0) {
				JOptionPane.showMessageDialog(this, "输入的物理块数大于页面数或页表长度为0",
						"警告!", JOptionPane.WARNING_MESSAGE);
				text1.setText("0");
				text2.setText("0");
				text3.setText("0");
				text4.setText("");
			} else {
				myt = new int[n];
				RN = new randomNumber();
				myt = RN.rand(n, length);
				for (int i = 0; i < n; i++) {
					str2 = String.valueOf(myt[i]);
					str1 = str1 + " " + str2;
				}
				m_random = str1;
				// 产生随即页面序列
				text4.setText("" + m_random);
			}
		} catch (NumberFormatException ee) {
			JOptionPane.showMessageDialog(this, "输入数字字符!", "警告!",
					JOptionPane.WARNING_MESSAGE);
			text1.setText("0");
			text2.setText("0");
			text3.setText("0");
			text4.setText("");
			//FIFOTA.text1.setText("0");		
		    //FIFOTA.text2.setText("0");		
			//FIFOTA.text3.setText("0");			
			//FIFOTA.text4.setText("0");
			FIFOTA.textarea.setText(null);			
			LRUTA.text1.setText("0");
		    LRUTA.text2.setText("0");
			LRUTA.text3.setText("0");
			LRUTA.text4.setText("");
			LRUTA.textarea.setText(null);
		}
	}
	public void FIFO() {
		int m_absent;// 缺页数
		double m_absentf;// 缺页率
    	int m_change; // 置换次数
    	double m_changef;// 页面置换率
		int mym[];// 存放物理块中现有的页面号
		int m1 = 0, r;
		int as = 0;// 置换页面数
		boolean x; // 页面是否需要置换
		String str1, str2;
		String m_list = "FIFO置换算法";
		mym = new int[m];
		for (int i = 0; i < n; i++) {
			str1 = "";
			str2 = "";
			x = true;
			for (int k = 0; k < m; k++) {
				if (myt[i] == mym[k]) {
					for (r = k; r < m - 1; r++)
						mym[r] = mym[r + 1];
					mym[r] = myt[i];
					x = false;// 判断物理块中是不是有跟当前须替换的页面
					break;
				}
			}
			if (x) {
				mym[0] = myt[i];
				for (r = 0; r < m - 1; r++)
					mym[r] = mym[r + 1];
				mym[r] = myt[i];
				as++;
			}
			int b;
			for (int j = 0; j < m; j++) {
				b = mym[j];
				str2 = String.valueOf(b);
				str1 = str1 + " " + str2;
			}
			m_list = m_list + '\n' + str1;
		}
		m_absent = as;
		m_absentf = (double) as / n;
		if ((as - m) <= 0) {
			m_change = 0;
			m_changef = 0;
		} else {
			m_change = as - m;
			m_changef = (double) (as - m) / n;
		}
		//FIFOTA.text1.setText("" + m_absent);
		//FIFOTA.text2.setText("" + m_absentf);
		//FIFOTA.text3.setText("" + m_change);		
		//FIFOTA.text4.setText("" + m_changef);
		FIFOTA.textarea.setText("" + m_list);
	}
	public void LRU() {
		int m_absent;// 缺页数
		double m_absentf;// 缺页率
		int m_change; // 置换次数
		double m_changef;// 页面置换率
		int mym[];// 存放物理块中现有的页面号
		int myb[];
		int as = 0;// 置换页面数
		myb = new int[n];
		int m1 = 0, a;
		boolean x; // 页面是否需要置换
		String str2, str1;
		String m_list = "LUR置换算法";
		mym = new int[m];
		for (int i = 0; i < n; i++) {
			str1 = "";
			str2 = "";
			x = true;
			for (int k = 0; k < m; k++) {
				if (myt[i] == mym[k])// 判断物理块中的页面是否与当前页面相等
				{
					myb[k] = myb[0];
					for (int j = 0; j < m; j++) {
						if (j != k)
							myb[j] = myb[j] + 1;// 使物理块中的每个未使用页面的时间增一
					}
					x = false;// 判断物理块中是不是有跟当前须替换的页面
					m1++;
					break;
				}
			}
			if (x) {
				int c = 0, d;
				if ((i - m1) < m) {
					a = i - m1;
				} // 当前物理页面未填满时直接装入
				else {
					d = myb[0];
					for (int h = 0; h < m; h++) {
						if (d < myb[h]) {
							d = myb[h];
							c = h;
						}
					}
					a = c; // 找出物理块中最久未使用的页面号
				}
				mym[a] = myt[i];// 将其替换
				myb[a] = 0;
				for (int k = 0; k < m; k++) {
					if (k != a)
						myb[k] = myb[k] + 1;// 使物理块中的每个未改变页面的时间增一
				}
				myb[a] = 0;
				as++;
			}
			for (int j = 0; j < m; j++) {
				int b;
				b = mym[j];
				str2 = String.valueOf(b);
				str1 = str1 + " " + str2;
			}
			m_list = m_list + "\n" + str1;
		}
		m_absent = as;
		m_absentf = (double) as / n;
		if ((as - m) <= 0) {
			m_change = 0;
			m_changef = 0;
		} else {
	    	m_change = as - m;
			m_changef = (double) (as - m) / n;
		}
    	//LRUTA.text1.setText("" + m_absent);
		//LRUTA.text2.setText("" + m_absentf);
        //LRUTA.text3.setText("" + m_change);
    	//LRUTA.text4.setText("" + m_changef);
		LRUTA.textarea.setText("" + m_list);
	}

	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource() == randomButton) {
			misInPut();
		}
		if (e.getSource() == button1) {
		FIFO();
		}
		if (e.getSource() == button2) {
			LRU();
		}
	    
		if (e.getSource() == clearButton) {
			text1.setText("0");
			text2.setText("0");
			text3.setText("0");			
			text4.setText("");
			FIFOTA.text1.setText("0");
		    FIFOTA.text2.setText("0");
		    FIFOTA.text3.setText("0");			
		    FIFOTA.text4.setText("0");
			FIFOTA.textarea.setText(null);
		    LRUTA.text1.setText("0");			
		    LRUTA.text2.setText("0");			
		    LRUTA.text3.setText("0");
			LRUTA.text4.setText("0");
			LRUTA.textarea.setText(null);
		    
			myt=new int[0];
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -