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

📄 cpu.java

📁 操作系统课程设计CPU管理源码 用JAVA实现
💻 JAVA
字号:
package cpu;
import memory.*;

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;
import equipment.*;
import equipment.VirtualEquipment.EquipmentBusyException;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
 *该类模拟了操作系统中的CPU(中央处理器单元)
 *
 *@version 1.0
 *@author Hinker from Hebei University
 */
public class CPU extends JPanel{
	private static final long serialVersionUID = -8578888626890705510L;
	/**
	 *程序计数器
	 */
	public static int PC;//程序计数器
	/**
	 *程序状态寄存器
	 */
	public static int PSW;//程序状态寄存器;
	/**
	 *代表程序状态寄存器的无中断状态
	 */
	public static final int NONE_INTERMIT=0;//无中断
	/**
	 *代表程序状态寄存器的时间片到中断状态
	 */
	public static final int TIME_INTERMIT=1;//时间片到中断
	/**
	 *代表程序状态寄存器的程序正常结束软中断状态
	 */
	public static final int NORMAL_END_SOFT_INTERMIT=2;//程序正常结束软中断
	/**
	 *代表程序状态寄存器的申请设备中断状态
	 */
	public static final int APPLY_EQUIPMENT_INTERMIT=3;//申请设备中断
	/**
	 *指令寄存器
	 */
	public static final char[] IR=new char[3];//指令寄存器
	/**
	 *数据在内存中的索引表
	 */
	public static DataTable dTable;//数据在内存中的索引表
	private static int timesize=5;//时间片大小
	private static JProgressBar progress;
	private JTextField txt;
	private static JSlider slider;
	private static JTextField field;
	private static JTextArea middleResult;
	public CPU(){
		setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"CPU(中央处理器单元)(吴侃)"));
		//滑块
		slider=new JSlider(2,15,timesize);
		slider.setMajorTickSpacing(2);
		slider.setMinorTickSpacing(1);
		slider.setPaintTicks(true);
		slider.setSnapToTicks(true);
		slider.addChangeListener(new ChangeListener(){
			public void stateChanged(ChangeEvent event){
				timesize=slider.getValue();
				txt.setText(String.valueOf(timesize));
				progress.setMaximum(timesize);
			}
		});
		//文本域
		JPanel panel=new JPanel();
		JLabel timeLabel=new JLabel("时间片的大小:");
		timeLabel.setEnabled(false);
		panel.add(timeLabel);
		panel.add(txt=new JTextField(10));
		txt.setEditable(false);
		timesize=slider.getValue();
		txt.setText(String.valueOf(timesize));
		//水平箱子
		Box box=Box.createVerticalBox();
		box.add(slider);
		box.add(panel);
		//当前正在执行的指令
		JPanel fieldPanel=new JPanel();
		JLabel fieldLabel=new JLabel("正在执行指令:");
		fieldLabel.setEnabled(false);
		fieldPanel.add(fieldLabel);
		fieldPanel.add(field=new JTextField(10));
		field.setEditable(false);
		box.add(fieldPanel);
		//中间结果
		middleResult=new JTextArea(4,10);
		middleResult.setBackground(new Color(0x6699ff));
		middleResult.setForeground(Color.yellow);
		middleResult.setEditable(false);
		JPanel middlePanel=new JPanel();
		middlePanel.setPreferredSize(new Dimension(30,120));
		middlePanel.add(new JScrollPane(middleResult));
		middlePanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"中间结果"));
		box.add(middlePanel);
		//进度条
		progress=new JProgressBar(0,timesize);
		box.add(progress);
		add(box);
	}
	/**
	 *调用run()将使CPU运行
	 */
	public static void run(){
		int hasExecuteOrderNum=1;
		String order="";//指令
		int time=timesize;
		while(true){
			if(PSW==CPU.NORMAL_END_SOFT_INTERMIT)return;
			if(CPU.PSW==CPU.TIME_INTERMIT)return;
			else if(PSW==CPU.APPLY_EQUIPMENT_INTERMIT){
				return;
			}
			//进度条指示
			progress.setValue(hasExecuteOrderNum++);
			order=MemoryPanel.readUserArea(PC);
			//当前正在执行的指令
			field.setText(order);
			for(int i=0;i<3;i++)IR[i]=order.charAt(i);
			executeOrder();
			//显示中间结果
			VeriableIndex[] result=dTable.getVeriableAddress();
			String resultString="";
			if(result!=null){
				for(int i=0;i<result.length;i++){
					resultString+=(result[i].getVariable()+"=");
					resultString+=(MemoryPanel.readUserArea(result[i].getIndex())+"\n");
				}
			}
			middleResult.setText(resultString);
			time--;
			/*如果时间片到了而程序还未正常结束就把PSW的状态设置成时间片到中断,
			 *但是如果时间片到了此时程序正好结束就把PSW设置成程序正常结束软中
			 *断而忽略时间片到中断*/
			if(time==0&&CPU.PSW!=CPU.NORMAL_END_SOFT_INTERMIT)
				CPU.PSW=CPU.TIME_INTERMIT;
			PC++;
		}
	}
	private static void executeOrder(){
		int address;
		int variable;
		if(IR[0]=='e'&&IR[1]=='n'&&IR[2]=='d'){
			PSW=CPU.NORMAL_END_SOFT_INTERMIT;
			return;
		}
		else if(IR[0]=='!'){
			try {
				EquipmentManagePanel.applyEquipment(IR[1], IR[2]);
			} catch (EquipmentBusyException e) {
				PSW=CPU.APPLY_EQUIPMENT_INTERMIT;//设备中断
			}
			return;
		}//设备管理
		else{
			address=dTable.queryTableItem(IR[0]);
			if(IR[1]=='='){
				variable=IR[2]-48;
				MemoryPanel.writeUserArea(String.valueOf(variable), address);
			}
			else if(IR[1]=='+'){
				int result=Integer.parseInt(MemoryPanel.readUserArea(address))+1;
				MemoryPanel.writeUserArea(String.valueOf(result), address);
			}
			else if(IR[1]=='-'){
				int result=Integer.parseInt(MemoryPanel.readUserArea(address))-1;
				MemoryPanel.writeUserArea(String.valueOf(result), address);
			}
			return;
		}
	}
}

⌨️ 快捷键说明

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