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