具體的要求是這樣的:編寫程序完成批處理系統(tǒng)中的作業(yè)調(diào)度,要求采用響應(yīng)比高者優(yōu)先的作業(yè)調(diào)度算法。實(shí)驗(yàn)具體包括:首先確定作業(yè)控制塊的內(nèi)容,作業(yè)控制塊的組成方式;然后完成作業(yè)調(diào)度;最后編寫主函數(shù)對所作工作進(jìn)程測試。
下面是代碼:
JOB類:
package com.wk.job;
public class JOB {
public JOB() {
super();
}
// 作業(yè)名
String name = null;
// 作業(yè)長度,所需主存大小
int length = 0;
// 作業(yè)執(zhí)行所需打印機(jī)的數(shù)量
int printer = 0;
// 作業(yè)執(zhí)行所需磁帶機(jī)的數(shù)量
int tape = 0;
// 作業(yè)估計執(zhí)行時間
float runtime = 0;
// 作業(yè)在系統(tǒng)中的等待時間
float waittime = 0;
public int getLength() {
return length;
}
public String getName() {
return name;
}
public int getPrinter() {
return printer;
}
public float getRuntime() {
return runtime;
}
public int getTape() {
return tape;
}
public float getWaittime() {
return waittime;
}
public void setLength(int length) {
this.length = length;
}
public void setName(String name) {
this.name = name;
}
public void setPrinter(int printer) {
this.printer = printer;
}
public void setRuntime(float runtime) {
this.runtime = runtime;
}
public void setTape(int tape) {
this.tape = tape;
}
public void setWaittime(float waittime) {
this.waittime = waittime;
}
}
這是Client測試類:
package com.wk.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.wk.job.*;
public class Client {
// 定義裝載作業(yè)的容器
static List<JOB> jobs = new ArrayList<JOB>();
// 記錄響應(yīng)比
static float xk = 0;
// 記錄當(dāng)前的作業(yè)記錄相應(yīng)時間比
static float k = 0;
// 作業(yè)調(diào)度函數(shù)
static void shedule(JOB job, long memory, int tape, int printer) {
// 系統(tǒng)可用資源是否滿足作業(yè)需求
if (job.getLength() <= memory && job.getTape() <= tape
&& job.getPrinter() <= printer) {
xk = job.getWaittime() / job.getRuntime();
// 如果這是第一個進(jìn)入容器的作業(yè)
if (jobs.size() == 0) {
k = xk;
jobs.add(job);
} else {
if (k > xk) { // 如果這不是第一個進(jìn)入容器的作業(yè),則和第一個作業(yè)比較
jobs.add(job);
} else {
k = xk;
jobs.add(job);
Collections.swap(jobs, 0, jobs.size()-1); // 交換兩個作業(yè)的執(zhí)行順序
}
}
} else {
System.out.println("error");
}
}
public static void main(String[] args) {
// 系統(tǒng)可容納作業(yè)的個數(shù)
int n = 3;
// 定義一個作業(yè)集
// List<JOB> jobs = new ArrayList<JOB>();
// 系統(tǒng)中磁帶機(jī)數(shù)量
int tape = 4;
// 系統(tǒng)打印機(jī)的數(shù)量
int printer = 3;
// 系統(tǒng)內(nèi)存
long memory = 65536;
// 定義一個作業(yè)
JOB job = null;
// 定義輸入流
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < n; i++) {
try {
//實(shí)例化一個作業(yè)
job = new JOB();
System.out.println("------------------");
job.setName(bf.readLine());
System.out.println("輸入作業(yè)名稱:" + job.getName());
job.setLength(Integer.parseInt(bf.readLine()));
System.out.println("輸入作業(yè)使用內(nèi)存大小:" + job.getLength());
job.setTape(Integer.parseInt(bf.readLine()));
System.out.println("輸入作業(yè)使用磁帶機(jī)數(shù):" + job.getTape());
job.setPrinter(Integer.parseInt(bf.readLine()));
System.out.println("輸入作業(yè)打印機(jī)數(shù):" + job.getPrinter());
job.setWaittime(Integer.parseInt(bf.readLine()));
System.out.println("輸入作業(yè)等待時間:" + job.getWaittime());
job.setRuntime(Integer.parseInt(bf.readLine()));
System.out.println("輸入作業(yè)估計執(zhí)行時間:" + job.getRuntime());
// 調(diào)用函數(shù)
Client.shedule(job, memory, tape, printer);
} catch (IOException e) {
System.out.println("輸入內(nèi)容不允許為空!!");
}
}
System.out.println("當(dāng)前執(zhí)行的程序?yàn)?:" + jobs.get(0).getName());
// 為第一個作業(yè)分配資源
memory = memory - jobs.get(0).getLength();
System.out.println("系統(tǒng)剩余內(nèi)存:" + memory);
tape = tape - jobs.get(0).getTape();
System.out.println("系統(tǒng)剩余磁帶機(jī):" + tape);
printer = printer - jobs.get(0).getPrinter();
System.out.println("系統(tǒng)剩余打印機(jī):" + printer);
}
}
經(jīng)過測試上面的代碼是沒有錯誤的!!下面說一下自己在寫代碼的時候的感想:
1.好多東西想的總是好的,但是真正的用著二十四個英文字母表達(dá)的時候是很費(fèi)力的。所以建議向我們這樣的初學(xué)者要經(jīng)常敲代碼,經(jīng)常寫東西。這樣自己才能進(jìn)步更快。
2.向List容器插入數(shù)據(jù)時,是按順序逐步插入的。檢點(diǎn)通俗點(diǎn)說就是按插入的順序誰先插入誰占第一個位置。好像很簡單,但是在寫這個東西時,自己是不知道的。相信還有好多人也不太清楚。