?? 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 + -