?? mosp1.java
字號:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.LinkedList;
//進程P1,主要實現將作業送至輸入井,同時啟動通道1和通道3;
public class MosP1{
int job_end=0; //批作業結束地址;
byte job_count=0; //批作業中的作業個數;
byte job_tot_length=0; //用戶作業的大小(以字為單位);
int job_pro_start=0; //用戶作業程序區開始地址;
int job_pro_end=0; //用戶作業程序區結束地址;
int job_data_start=0; //用戶作業數據區開始地址;
int job_data_end=0; //用戶作業數據區結束地址;
int job_line_start=0;
int job_line_end=0;
int job_begin_start = 0;
int p1_interrupt = 0; //"0"為檢查是否還有作業;"1"為檢查通道1是否為忙;
// "2"檢查通道1是否啟動完;"3"檢查通道3是否為忙;
// "4"檢查通道3是否啟動完;"5"檢查是否還有下一頁;
int page_size = 0;
byte[] jcb_name = new byte[4];
byte[] jcb_supposed_time = new byte[4];
byte[] jcb_supposed_output = new byte[4];
String tot_job_word=""; //用于保存從文件讀出的所有字符串;
byte tom[]=new byte[25]; //用于保存逐次從文件讀出的字符;
String s; //用于保存逐次從文件讀出的字符串;
byte page_tab[][][]=new byte[10][10][4];//每個作業最多10頁,每頁為10字,每字4個字節;
int b;
byte reg[]=new byte[40];
MosMM mm = null;
MosDisk disk = null;
MosBlock mb = null;
byte[] page_table = null;
MosJCB mj = null;
MosChannel1 chan1 = null;
MosChannel3 chan3 = null;
long chan1_time = 0;
long chan3_time = 0;
LinkedList que_jcb_ready = null;
MosVar var = null;
byte[] mm_data = new byte[4];
byte[] disk_data = new byte[40];
String s1 = "";
int haddr = 0;
public MosP1(MosMM mm,MosDisk disk,MosChannel1 chan1,MosChannel3 chan3,LinkedList que_jcb_ready,
MosVar var) {
this.mm = mm;
this.disk = disk;
this.chan1 = chan1;
this.chan3 = chan3;
this.que_jcb_ready = que_jcb_ready;
this.var = var;
}
public String p1Read(String s1) {
// 讀取作業文件并將字符串保存于tot_job_word中;
try {
tot_job_word = "";
File f=new File(s1);
FileInputStream refi=new FileInputStream(f);
while((b=refi.read(tom,0,25))!=-1){
s=new String(tom,0,b);
tot_job_word=tot_job_word+s;
}
refi.close();
} catch (IOException e) {
// TODO: handle exception
}
// 將作業中字符串"$JOE"的首地址保存于job_end,以便檢測是否是批作業中的最后一個作業;
job_end=tot_job_word.indexOf("$JOE");
var.p1_switch = 1;
return s;
}
public void p1Start() {
// 若有作業輸入,則執行P1;
if(var.p1_switch != 0) {
// 若p1_interrupt為0,則檢查是否為最后一條作業;
if(this.p1_interrupt == 0) {
// 檢測條件為字符串"$JOE"與"$POE"或"$DOE"的首地址相差6個unicode字符;
if((job_end!=(job_data_end+5))&&(job_end!=(job_pro_end+6))){
// 用戶作業程序大小(以字為單位);
byte job_pro_length=0;
// 用戶作業數據大小(以字為單位);
byte job_data_length=0;
// 對每個保存作業的數組進行初始化;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
for(int k=0;k<4;k++)
page_tab[i][j][k]=-1;
}
}
// 每個作業程序區從"$POB"開始,到"$POE"結束,每次檢測均以上一程序區結束首地址為檢測新程序區
// 的起始地址
job_pro_start=job_pro_end;
job_pro_end=job_pro_end+1;
job_pro_start=tot_job_word.indexOf("$POB",job_pro_start);
job_pro_end=tot_job_word.indexOf("$POE",job_pro_end);
// 已測試;
job_begin_start =tot_job_word.indexOf("$BEGIN",job_begin_start+1);
for(int i = 0;i < 4;i++) {
jcb_name[i] = (byte)tot_job_word.charAt(job_begin_start+i+7);
jcb_supposed_time[i] = (byte)tot_job_word.charAt(job_begin_start+i+12);
jcb_supposed_output[i] = (byte)tot_job_word.charAt(job_begin_start+i+17);
}
haddr = -1;
// 讀出每行的指令,用字節數組保存每一條指令
job_line_end=job_line_start=job_pro_start;
while(job_pro_end!=(job_line_start+7)){
job_line_start=job_line_end;
job_line_start=tot_job_word.indexOf(' ',job_line_start+1);
job_line_end=tot_job_word.indexOf(' ',job_line_start+1)-2;
char chartest = tot_job_word.charAt(job_line_start+1);
if(((byte)tot_job_word.charAt(job_line_start+1) != MosChar.H)&&((byte)tot_job_word.charAt(job_line_start+1) != MosChar.AT))
{++haddr;}
for(int i=0;i<4;i++){
if((job_line_end-job_line_start-i-1)>0){
page_tab[job_pro_length/10][job_pro_length%10][i]=(byte)tot_job_word.charAt(job_line_start+i+1);
}
else{
page_tab[job_pro_length/10][job_pro_length%10][i]=0;
}
}
job_pro_length++;
}
// 作業數據區從"$DATA"開始,到"$DOE"結束,每次檢測均以上一數據區結束首地址為檢測新數據區的
// 起始地址
job_data_start=tot_job_word.indexOf("$DATA",job_data_start);
job_data_end=tot_job_word.indexOf("$DOE",job_data_end);
// 檢測當前作業是否有數據區,檢測條件為若存在數據區,則字符串"$POE"與"$DATA"的首地址相差6個
// unicode字符
if(job_data_start==(job_pro_end+6)){
// 保存數據區中的數據前加'*'以便識別程序中數據區的開始;
page_tab[(job_pro_length)/10][(job_pro_length)%10][0]=(byte)'*';
for(int i=1;i<4;i++)
page_tab[(job_pro_length)/10][(job_pro_length)%10][i]=0;
// 若本作業有數據區,則應該讀入輸入井,每個作業的數據區從job_data_start開始至job_data_end
// 結束,星號(*)前一個空格地址至"$DOE"首地址相差4個UNICODE字符,以此來判斷本數據區的數據是否
// 讀完,數據包括'*'
job_line_end=job_line_start=job_data_start;
while(job_data_end!=(job_line_start+4)){
job_line_start=job_line_end;
job_line_start=tot_job_word.indexOf(' ',job_line_start);
job_line_end=tot_job_word.indexOf(' ',job_line_start+1);
for(int i=0;i<4;i++){
page_tab[(job_pro_length+job_data_length+1)/10][(job_pro_length+job_data_length+1)%10][i]=
(byte)tot_job_word.charAt(job_line_start+i+1);
if(((char)page_tab[(job_pro_length+job_data_length+1)/10][(job_pro_length+job_data_length+1)%10][0])=='*'){ //遇到"*"結束;并將其余三個字節置"0";
page_tab[(job_pro_length+job_data_length+1)/10][(job_pro_length+job_data_length+1)%10][1]=
page_tab[(job_pro_length+job_data_length+1)/10][(job_pro_length+job_data_length+1)%10][2]=
page_tab[(job_pro_length+job_data_length+1)/10][(job_pro_length+job_data_length+1)%10][3]=0;
break;
}
}
job_data_length++;
}
job_data_start=job_data_end;
job_data_end=job_data_end+1;
// System.out.println("data has come "+job_data_length);
}
else{
job_data_length=0;
// System.out.println("not data come "+job_data_length);
}
job_tot_length = (byte)(job_pro_length+job_data_length);
this.p1_interrupt = 1;
this.page_size = 0;
}
else {
tot_job_word = "";
var.p1_switch = 0;
job_end=0;
job_count=0;
job_tot_length=0;
job_pro_start=0;
job_pro_end=0;
job_data_start=0;
job_data_end=0;
job_line_start=0;
job_line_end=0;
job_begin_start = 0;
p1_interrupt = 0;
page_size = 0;
}
}
// 當p1_interrupt為1時對輸入井進行檢查;
if(this.p1_interrupt == 1) {
this.page_table = disk.diskMalloc((byte)(job_tot_length/10+1), FinalVar.IN_BUFFER_ADDR);
if(this.page_table != null) {
mb = new MosBlock(this.page_table);
this.page_size = 0;
this.p1_interrupt = 2;
}
}
// p1_interrupt為2時檢查通道1是否為忙;
if(this.p1_interrupt == 2) {
if(chan1.getMosChst() == FinalVar.CHST_STAT_FREE) {
chan1.setMosChst(FinalVar.CHST_STAT_BUSY);
for(int j=0;j<10;j++){
if(page_tab[this.page_size][j][0]==-1)
break;
for(int k=0;k<4;k++){
reg[j*4+k]=page_tab[this.page_size][j][k];
}
}
this.chan1_time = var.getTime();
this.p1_interrupt = 3;
}
}
// p1_interrupt為3表示當本進程啟動通道1后,檢測是否三個時間片已到,若到達則傳送數據;
if(this.p1_interrupt == 3) {
if(var.getTime() >= (this.chan1_time + 3)) {
chan1.startChannel1(reg);
chan1.setMosChst(FinalVar.CHST_STAT_FREE);
this.p1_interrupt = 4;
}
}
// p1_interrupt為4表示檢查通道3是否為忙;
if(this.p1_interrupt == 4) {
if(chan3.getMosChst() == FinalVar.CHST_STAT_FREE) {
chan3.setMosChst(FinalVar.CHST_STAT_BUSY);
this.chan3_time = var.getTime();
this.p1_interrupt = 5;
}
}
// p1_interrupt為5表示當本進程啟動通道3后,檢測是否一個時間片已到,若到達則傳送數據;
if(this.p1_interrupt == 5) {
if(var.getTime() >= (this.chan3_time + 1)) {
chan3.startChannel3(FinalVar.CHST3_READ, FinalVar.KB_BUFFER_ADDR, page_table[this.page_size]);
this.page_size++;
chan3.setMosChst(FinalVar.CHST_STAT_FREE);
for(int l = 0;l < 40;l++) {
reg[l] = 0;
}
this.p1_interrupt = 6;
}
}
// p1_interrupt為6表示是否已傳送完一個作業到輸入井;
if(this.p1_interrupt == 6) {
if(this.page_size == (job_tot_length/10+1)) {
mj = new MosJCB(job_count,jcb_name,jcb_supposed_time,jcb_supposed_output,mb);
mj.setHaddr(haddr);
que_jcb_ready.add(mj);
job_count++;
this.p1_interrupt = 0;
}
else {
this.p1_interrupt = 2;
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -