单道批处理模拟作业调度:
模拟作业调度的实现,分别实现
先来先服务(FCFS)、最短作业优先(SJF)、响应比高者优先(HRN)
实现思想:
1) 先来先服务算法:是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。
2) 最短作业优先算法:在作业到达的情况下,总是按作业要求运行的时间来选择作业,每次挑选要求运行时间短且资源要求能满足的作业先进入主存执行。
3) 当作业执行结束进入完成状态时,做好释放资源等善后工作。
4) 本实验主要模拟作业调度,所以对处理器调度、作业控制过程简化。用输入随机数模拟处理器调度,用输出“用户名、作业名”模拟一个作业已经执行结束。
5) 为作业分配资源可用修改资源分配表来代替。
主程序流程图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QvXw3UIQ-1611392854678)(file:///C:/Users/www24/AppData/Local/Packages/oice_16_974fa576_32c1d314_35ca/AC/Temp/msohtmlclip1/01/clip_image002.gif)] 先来先服务算法JAVA实验报告 java先来先服务算法实现_操作系统](https://s2.51cto.com/images/blog/202401/08181108_659bca3c6324233028.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
先来先服务算法:
流程图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hedGlMTq-1611392809185)(file:///C:/Users/www24/AppData/Local/Packages/oice_16_974fa576_32c1d314_35ca/AC/Temp/msohtmlclip1/01/clip_image002.gif)] 先来先服务算法JAVA实验报告 java先来先服务算法实现_java_02](https://s2.51cto.com/images/blog/202401/08181108_659bca3c7d7dd67316.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
关键代码:
public void fcfs()/*先来先服务*/ { sort(); running(); output();}短作业优先:
流程图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jwUyAe8O-1611392809186)(file:///C:/Users/www24/AppData/Local/Packages/oice_16_974fa576_32c1d314_35ca/AC/Temp/msohtmlclip1/01/clip_image004.gif)] 先来先服务算法JAVA实验报告 java先来先服务算法实现_先来先服务算法JAVA实验报告_03](https://s2.51cto.com/images/blog/202401/08181108_659bca3c943a684674.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
关键代码:
public void sjf()/*短作业优先*/ {
int min;
sort();
for (m = 0; m < num; m++) {
i = 0;
if (m == 0)
jk.get(m).finish = jk.get(m).arrivetime + jk.get(m).runtime;
else
jk.get(m).finish = jk.get(m - 1).finish + jk.get(m).runtime;
for (n = m + 1; n < num; n++) {
if (jk.get(n).arrivetime <= jk.get(m).finish)//判断每次作业完成之后又有多少作业到达
i++;
}
for (k = m + 1; k < i + m; k++)//找出到达后的作业中运行时间最小的作业
{
min = k;
for (int j = k + 1; j < i + m + 1; j++) {
//printf("%f\n", jk[j].runtime);
//printf("%f\n", jk[min].runtime);
if (jk.get(j).runtime < jk.get(min).runtime) {
min = j;
}
}
Collections.swap(jk, k, min);
}
}
running();
output();
}高响应比优先:
流程图:

关键代码:
public void hrrf()/*最高响应比优先*/ {
int max;
sort();
for (m = 0; m < num; m++) {
i = 0;
if (m == 0)
jk.get(m).finish = jk.get(m).arrivetime + jk.get(m).runtime;
else
jk.get(m).finish = jk.get(m - 1).finish + jk.get(m).runtime;
for (n = m + 1; n < num; n++) {
if (jk.get(n).arrivetime <= jk.get(m).finish)
i++;
}
for (k = m + 1; k < i + m; k++) {
max = k;
for (int j = k + 1; j < i + m + 1; j++) {
// printf("%d\n", i + m + 1);
if ((jk.get(m).finish - jk.get(max).arrivetime + jk.get(max).runtime) / jk.get(max).runtime <=
(jk.get(m).finish - jk.get(j).arrivetime + jk.get(j).runtime) / jk.get(j).runtime)//响应比大的先执行
{
max = j;
}
}
Collections.swap(jk, k, max);
}
}
running();
output();
}重复调用的函数:
public void output( ) {
float numT = 0, numW = 0, avgT = 0, avgW = 0;
System.out.println("-----------------------------------------------------------------------\n");
System.out.println(" 作业名 提交时间 运行时间 开始时间 完成时间 周转时间 带权周转时间\n");
for (i = 0; i < num; i++) {
System.out.println(jk.get(i).name + "\t\t" + jk.get(i).arrivetime + "\t\t" +
jk.get(i).runtime + "\t\t" + jk.get(i).run + "\t\t" + jk.get(i).finish + "\t\t" + jk.get(i).T + "\t\t" + jk.get(i).W);
System.out.println("\n");
numT = numT + jk.get(i).T;
numW = numW + jk.get(i).W;
}
System.out.println("-----------------------------------------------------------------------\n");
avgT = numT / num;
avgW = numW / num;
System.out.println("平均作业周转时间:" + avgT);
System.out.println("\n");
System.out.println("平均带权作业周转时间:" + avgW);
System.out.println("\n");
}
public void sort() {
int i, j;
for (j = 0; j < num; j++) {
for (i = 0; i < num - j - 1; i++) {
if (jk.get(i).arrivetime > jk.get(i + 1).arrivetime) {
Collections.swap(jk, i, i + 1);}
}
}
}
public void running() {
for (k = 0; k < num; k++) {
if (k == 0)/*运行第一个作业*/ {
jk.get(k).run = jk.get(k).arrivetime;
jk.get(k).finish = jk.get(k).run + jk.get(k).runtime;
} else {
if (jk.get(k).arrivetime >= jk.get(k - 1).finish)/*当前作业已经结束,下一个作业还没有到达或者刚好到达*/ {
jk.get(k).run = jk.get(k).arrivetime;
jk.get(k).finish = jk.get(k).run + jk.get(k).runtime;
} else/*当前作业未完成,下一个作业已到达*/ {
jk.get(k).run = jk.get(k - 1).finish;
jk.get(k).finish = jk.get(k).run + jk.get(k).runtime;
}
}
}
for (k = 0; k < num; k++) {
jk.get(k).T = jk.get(k).finish - jk.get(k).arrivetime;
jk.get(k).W = jk.get(k).T / jk.get(k).runtime;
}
}
















