模拟操作系统的页面置换

来源:互联网 发布:淘宝可以卖香烟吗 编辑:程序博客网 时间:2024/06/02 07:31

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

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();}}


 

原创粉丝点击