📄 mosp3.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 + -