操作系统--电梯算法和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);
	}

}

欢迎指正!!!!!!!!不胜感激!!!!!!