操作系统--电梯算法和SSTF(Java)
题目描述:
假定一磁盘有200个柱面,编号为0~199,当前移动臂的位置在143号柱面上,并刚刚完成125号柱面的服务请求,如果请求队列的先后顺序是86,147,91,177,94,150,102,175,130。请按下列算法分别计算为完成上述各次访问总共需要的磁头移动量,并写出磁头的移动顺序。要求通过编写模拟程序实现,开发工具任选。
(1)电梯算法;
(2)最短寻找时间优先算法(SSTF)。
电梯算法演示:
为了便于演示,当前移动臂在3号磁道,将请求队列为 2,1,5,7,8,0,4(emmm好曲折的数值)

SSTF演示:
当前移动臂在3号磁道,将请求队列为 4 ,0,7,1,8

代码:
Mes类,存放访问队列里磁道的信息
package DiskScheduling;
public class Mes {
public Mes(int i, int j) {
id=i;
num=j;
}
public int num;
public int id;
}
package DiskScheduling;
import java.util.ArrayList;
public class Diskscheduling {
private static ArrayList<Mes> finish = new ArrayList<Mes>();
private static ArrayList<Mes> finish1 = new ArrayList<Mes>();
private static ArrayList<Mes> tip = new ArrayList<Mes>();
private static int sum;
private static boolean flag = true;
private static ArrayList<Mes> wait = tip;
private static int min;
private static int sum0;
//电梯
// 147--->150--->175--->177--->130--->102--->94--->91--->86
// 磁头移动量:125
// SSTF
// 147--->150--->130--->102--->94--->91--->86--->175--->177
public static void main(String[] args) {
// 信息加载
Mes s1 = new Mes(1, 86);
tip.add(s1);
Mes s2 = new Mes(2, 147);
tip.add(s2);
Mes s3 = new Mes(3, 91);
tip.add(s3);
Mes s4 = new Mes(4, 177);
tip.add(s4);
Mes s5 = new Mes(5, 94);
tip.add(s5);
Mes s6 = new Mes(6, 150);
tip.add(s6);
Mes s7 = new Mes(7, 102);
tip.add(s7);
Mes s8 = new Mes(8, 175);
tip.add(s8);
Mes s9 = new Mes(9, 130);
tip.add(s9);
System.out.println("电梯算法结果:");
elevator(wait, 143);
System.out.println("磁头移动量:" + sum0);
System.out.println("SSTF算法结果:");
sstf(143);
System.out.println("磁头移动量:" + sum);
}
private static int min(ArrayList<Mes> wait, int now) {
min = 1000;
int minplace = 0;
for (int i = 0; i < wait.size(); i++) {
int difference = (now - wait.get(i).num);
if (difference <= 0)
difference *= -1;
if (difference <= min) {
min = difference;
minplace = i;
}
}
return minplace;
}
public static void elevator(ArrayList<Mes> wait, int now) {
int id = min(wait, now);
// sum+=min;
Mes get = new Mes(id, wait.get(id).num);
finish1.add(get);
int compare = wait.get(id).num;
// System.out.println("now="+now);
// System.out.println("min="+wait.get(id).num);
if (now >= wait.get(id).num) {
// 123.....147往左
System.out.println("向左");
for (int h = 0; h < wait.size(); ++h) {
for (int k = 0; k < wait.size(); ++k) {
if (wait.get(h).num >= wait.get(k).num) {
int tt = wait.get(h).id;
int t = wait.get(h).num;
wait.get(h).id = wait.get(k).id;
wait.get(h).num = wait.get(k).num;
wait.get(k).id = tt;
wait.get(k).num = t;
}
}
}
for (int h = 0; h < wait.size(); ++h) {
if (wait.get(h).num < finish1.get(0).num) {
finish1.add(new Mes(h, wait.get(h).num));
}
}
if (finish1.size() != 9) {
for (int h = 0; h < wait.size(); ++h) {
for (int k = 0; k < wait.size(); ++k) {
if (wait.get(h).num <= wait.get(k).num) {
int tt = h;
int tem = wait.get(h).num;
h = k;
wait.get(h).num = wait.get(k).num;
k = tt;
wait.get(k).num = tem;
}
}
}
}
for (int h = 0; h < wait.size(); ++h) {
// finish1.add(new Mes(h,wait.get(h).num));
if (wait.get(h).num > finish1.get(0).num) {
finish1.add(new Mes(h, wait.get(h).num));
}
}
} else {
// 往右
// System.out.println("向右");
// small--big
for (int h = 0; h < wait.size(); ++h) {
for (int k = 0; k < wait.size(); ++k) {
if (wait.get(h).num <= wait.get(k).num) {
int tt = wait.get(h).id;
int t = wait.get(h).num;
wait.get(h).id = wait.get(k).id;
wait.get(h).num = wait.get(k).num;
wait.get(k).id = tt;
wait.get(k).num = t;
}
}
}
for (int h = 0; h < wait.size(); ++h) {
if (wait.get(h).num > finish1.get(0).num) {
finish1.add(new Mes(h, wait.get(h).num));
}
}
if (finish1.size() != 9) {
for (int h = 0; h < wait.size(); ++h) {
for (int k = 0; k < wait.size(); ++k) {
if (wait.get(h).num >= wait.get(k).num) {
int tt = wait.get(h).id;
int t = wait.get(h).num;
wait.get(h).id = wait.get(k).id;
wait.get(h).num = wait.get(k).num;
wait.get(k).id = tt;
wait.get(k).num = t;
}
}
}
}
for (int h = 0; h < wait.size(); ++h) {
if (wait.get(h).num < finish1.get(0).num) {
finish1.add(new Mes(h, wait.get(h).num));
}
}
}
sum0=Math.abs(now-finish1.get(0).num);
for(int i=1;i<finish1.size();++i) {
sum0+=Math.abs(finish1.get(i).num-finish1.get(i-1).num);
}
// 输出
for (int i = 0; i < finish1.size() - 1; ++i) {
System.out.print(finish1.get(i).num + "--->");
}
System.out.println(finish1.get(8).num);
}
private static void sstf(int now) {
while (flag) {
if (finish.size() >= 8) {
flag = false;
}
int id = min(wait, now);
sum += min;
Mes get = new Mes(id, wait.get(id).num);
finish.add(get);
now = wait.get(id).num;
wait.remove(id);
}
for (int i = 0; i < finish.size() - 1; ++i) {
System.out.print(finish.get(i).num + "--->");
}
System.out.println(finish.get(8).num);
}
}
欢迎指正!!!!!!!!不胜感激!!!!!!