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

📄 mosp3.java

📁 这是由Java编写的小型模拟操作系统
💻 JAVA
字号:
import java.util.Iterator;
import java.util.LinkedList;

//此类实现系统进程P3的功能,主要功能包括检测是否有作业完成需要打印;
//同时启动通道3,通道2,数据从输出井到内存缓存区时成块读出,而打印时则逐字打印;
public class MosP3 {
	MosMM mm = null;
	MosDisk disk = null;
	MosBlock mb = null;
	MosJCB mj = null;
	MosChannel2 chan2 = null;
	MosChannel3 chan3 = null;
	int p3_interrupt = 0;
	int page_size = 0;
	long chan2_time = 0;
	long chan3_time = 0;
	byte[] block_table = null;
	byte[] data = null;
	byte[] non_data = new byte[40];
	LinkedList que_jcb_finish = null;
	MosVar var = null;
	int addr;
	byte[] mm_data = new byte[4];
	String s = "";
	int mypoint = 1;
	MosBlock mosblo = null;
	
	public MosP3(MosMM mm,MosDisk disk,MosChannel2 chan2,MosChannel3 chan3,LinkedList que_jcb_finish,
			MosVar var) {
		this.mm = mm;
		this.disk = disk;
		this.chan2 = chan2;
		this.chan3 = chan3;
		this.que_jcb_finish = que_jcb_finish;
		this.var = var;
	}
	
	public void p3Start() {
//		p3_interrupt为0表示检测que_jcb_finish是否为空;
		if(this.p3_interrupt == 0) {
			mj = test();
			if(null != mj) {
//				mb = mj.getJcbOutputTable();
//				block_table = mb.getBlockTable();
				mosblo = mj.getJcbOutputTable();
				block_table = mosblo.getBlockTable();
//				System.out.println("blocktable" + block_table[0] +block_table[1]);
				this.page_size = 0;
				this.p3_interrupt = 1;
			}
		}
//		p3_interrupt为1表示检测通道3是否忙;
		if(this.p3_interrupt == 1) {
			if(this.chan3.getMosChst() == FinalVar.CHST_STAT_FREE) {
				this.chan3.setMosChst(FinalVar.CHST_STAT_BUSY);
				this.chan3_time = var.getTime();
				this.p3_interrupt = 2;
			}			
		}
//		p3_interrupt为2表示当本进程启动通道3后,检测是否一个时间片已到,若到达则传送数据;
		if(this.p3_interrupt == 2) {
			if(var.getTime() >= (this.chan3_time + 1)) {
				chan3.startChannel3(FinalVar.CHST3_WRITE, block_table[this.page_size], 
						(byte)(FinalVar.PRT_BUFFER_ADDR + this.page_size));
				this.chan3.setMosChst(FinalVar.CHST_STAT_FREE);
				this.page_size++;
				this.p3_interrupt = 3;
			}
		}
//		p3_interrupt为3检测是否已将一个作业送到输出井;
		if(this.p3_interrupt == 3) {
			if(this.page_size == this.block_table.length) {
//				disk.diskFree((byte)block_table.length, block_table[0]);
				addr = FinalVar.PRT_BUFFER_ADDR * 40;
				data = mm.mmRead(addr,  FinalVar.MM_READ_WORD);
				this.p3_interrupt = 4;
			}
			else {
				this.p3_interrupt = 1;
			}
		}
//		p3_interrupt为4检测是否已经读到输出井中作业的最后一个字;
		if(this.p3_interrupt == 4) {
			if((data[0] != 0) || (data[1] !=0) || (data[2] != 0) || (data[3] != 0)) {
				this.p3_interrupt = 5;
			}
			else {
				for(int j = 0;j < 4;j++) {
					mm.mmWrite(this.non_data, FinalVar.PRT_BUFFER_ADDR + j);
				}
				this.p3_interrupt = 0;
				mypoint = 1;
			}
		}
//		p3_interrupt为5检测通道2是否忙;
		if(this.p3_interrupt == 5) {
			if(this.chan2.getMosChst() == FinalVar.CHST_STAT_FREE) {
				this.chan2.setMosChst(FinalVar.CHST_STAT_BUSY);
				this.chan2_time = var.getTime();
				this.p3_interrupt = 6;
			}
		}
//		p3_interrupt为6表示当本进程启动通道2后,检测是否三个时间片已到,若到达则传送数据;
		if(this.p3_interrupt == 6) {
			if(var.getTime() >= (this.chan2_time + 3)) {
				if(mypoint == 1){var.getMain().prt_area.append("----------------------------------------"+"\n"+"作业名:"+"\n");}
				else if(mypoint == 2){var.getMain().prt_area.append("占用CPU时间:"+"\n");}
				else if(mypoint == 3){var.getMain().prt_area.append("I/O次数:"+"\n");}
				else if(mypoint == 4){var.getMain().prt_area.append("进入系统时间:"+"\n");}
				else if(mypoint == 5){var.getMain().prt_area.append("退出系统时间:"+"\n");}
				else if(mypoint == 6){var.getMain().prt_area.append("周转时间:"+"\n");}
				else if(mypoint == 7){var.getMain().prt_area.append("估计最大运行时间:"+"\n");}
				else if(mypoint == 8){var.getMain().prt_area.append("估计最大输出行数:"+"\n");}
				else if(mypoint == 9){var.getMain().prt_area.append("程序运行结果:"+"\n");}
				++mypoint;
				chan2.startChannel2(addr);
				this.chan2.setMosChst(FinalVar.CHST_STAT_FREE);
				addr = addr + 4;
				data = mm.mmRead(addr,  FinalVar.MM_READ_WORD);
				this.p3_interrupt = 4;
			}
		}
	}
	
	private MosJCB test() {
		Iterator iter = que_jcb_finish.iterator();
		while(iter.hasNext()) {
			MosJCB jcb = (MosJCB)iter.next();
			que_jcb_finish.remove(jcb);
			return jcb;
		}
		return null;
	}
}

⌨️ 快捷键说明

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