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

📄 mosp2.java

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

//此类实现系统进程2的功能,包括检测输入井是否有作业,内存空间是否足以存放一个作业程序,
//若两者均满足,则将作业JCB项改为已调试(值为0),且在PCB就绪队列添加此作业;
public class MosP2 {
	MosMM mm = null;
	MosDisk disk = null;
	MosChannel3 chan3 = null;
	LinkedList que_jcb_ready = null;
	LinkedList que_jcb_start = null;
	LinkedList que_pcb_ready = null;
	MosJCB mj = null;
	MosPCB mp = null;
	MosBlock mb = null;
	MosVar var = null;
	int p2_interrupt = 0;
	int page_size = 0;
	long chan3_time = 0;
	byte[] block_table = null;
	byte[] page_table = null;
	MosCPU cpu = null;
	MosP1 p1 = null;
	byte[] mm_data = new byte[4];
	byte[] disk_data = new byte[40];
	String s1 = "";
	
	public MosP2(MosMM mm,MosDisk disk,MosChannel3 chan3,LinkedList que_jcb_ready,
			LinkedList que_jcb_start,LinkedList que_pcb_ready,MosVar var,
			MosCPU cpu,MosP1 p1) {
		this.mm = mm;
		this.disk = disk;
		this.chan3 = chan3;
		this.que_jcb_ready = que_jcb_ready;
		this.que_jcb_start = que_jcb_start;
		this.que_pcb_ready = que_pcb_ready;
		this.var = var;
		this.cpu = cpu;
		this.p1 = p1;
	}
	
	public void p2Start() {
//		p2_interrupt为0为检测que_jcb_ready队列是否为空;
		if(this.p2_interrupt == 0) {
			mj = test();
			if(null != mj) {
				mb = mj.getJcbInputTable();
				block_table = mb.getBlockTable();
				this.p2_interrupt = 1;
			}
		}
//		p2_interrupt为1表示申请内存空间;
		if(this.p2_interrupt == 1) {
			page_table = mm.mmMalloc((byte)block_table.length);
			if(null != this.page_table) {
				this.page_size = 0;
				this.p2_interrupt = 2;
			}
		}
//		p2_interrupt为2表示检测通道3是否为忙;
		if(this.p2_interrupt == 2) {
			if(chan3.getMosChst() == FinalVar.CHST_STAT_FREE) {
				chan3.setMosChst(FinalVar.CHST_STAT_BUSY);
				this.chan3_time = var.getTime();
				this.p2_interrupt = 3;
			}
		}
//		p2_interrupt为3表示本进程启动通道3后,检测是否一个时间片已到,若到达则传送数据;
		if(this.p2_interrupt == 3) {
			if(var.getTime() >= (this.chan3_time + 1)) {
				chan3.startChannel3(FinalVar.CHST3_WRITE, block_table[this.page_size], page_table[this.page_size]);
				chan3.setMosChst(FinalVar.CHST_STAT_FREE);
				this.page_size++;
				this.p2_interrupt = 4;
			}
		}
//		p2_interrupt为4时表示检测是否一个作业已经传送完毕;
		if(this.p2_interrupt == 4) {
			if(this.page_size == this.block_table.length) {
//				释放输入井资源;
				disk.diskFree((byte)block_table.length, block_table[0]);
				que_jcb_start.add(mj);
				var.incJobCount();
//				在PCB就绪队列添加此作业PCB的ID号为作业ID加10,以便处理;
				mp = new MosPCB((byte)(mj.getJcbId()+10),FinalVar.CPUMODE_USER,
						new MosPage(page_table),FinalVar.PCB_READY);
				mp.setTheName(chgStr(mj.getJcbName()));
				mp.setHaddr(mj.getHaddr());
				que_pcb_ready.add(mp);
				var.getMain().proMalloc(mp.getPcbId(),chgStr(mj.getJcbName()),mp.getHaddr()+1);
				var.getMain().jobnum_label.setText("" + String.valueOf(que_jcb_start.size()));
				this.p2_interrupt = 0;
			}
			else {
				this.p2_interrupt = 2;
			}
		}
	}
	
//	检测内存空间是否足以存放用户作业;
	private MosJCB test() {
		Iterator iter = que_jcb_ready.iterator();
		while(iter.hasNext()) {
			MosJCB jcb = (MosJCB)iter.next();
			byte[] aa = null;
			aa = jcb.getJcbName();
//			for(int i = 0;i < 4;i++)
//				System.out.print((char)aa[i]);
//			System.out.println("");
			que_jcb_ready.remove(jcb);
//			将作业PCB的ID号为作业ID加10,作为JCB中所生成PCB的ID;
			jcb.setJcbPcId((byte)(jcb.getJcbId()+10));
			jcb.setJcbInTime(cpu.getTime());
			return jcb;
		}
		return null;
	}
	
	private String chgStr(byte[] a)
	{
		String str = null;
		int i;
		for(i = 0;i < a.length;i++)
		{
			if(a[i] == 0)break;
		}
		try
		{
			str = new String(a,0,i,"ISO8859-1");
		}
		catch(Exception e){}
		return str;
	}
	
	
}

⌨️ 快捷键说明

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