参考文章:磁盘调度算法的思想
模拟实现磁盘调度算法:最短寻道时间优先(SSTF)和扫描(SCAN)算法。
其中SCAN是在SSTF算法的基础上演化得来的。
SSTF:
package cipan;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class SSTF {
static int position;//磁头起始位置
static int len;//磁盘请求序列长度
static int arr[];//磁盘请求序列
static List<Integer> list = new ArrayList();//磁盘访问序列
static int sum;//磁道访问总数
static void f1(int position,int len,int arr[]) {
if (len == 0){
System.out.print("磁盘访问序列:[");
for (int i:list) {
System.out.print(i+",");
}
System.out.println("]");
System.out.println("磁道访问总数:"+sum);
System.out.println("平均寻道长度:"+sum/SSTF.len);
return;
}
int x = Integer.MAX_VALUE;//当前数组中距离position最近的值
int y = Integer.MAX_VALUE;//x在数组中的位置
for (int i = 0; i < arr.length; i++) {
if ((Math.abs(arr[i]-position)<Math.abs(x-position)) == true){
x = arr[i];
y = i;
}
}
list.add(x);
sum=sum+Math.abs(x-position);
arr[y] = Integer.MAX_VALUE;
f1(x,len-1,arr);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入磁盘请求序列长度:");
len = sc.nextInt();
System.out.print("请输入磁盘请求序列:");
arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = sc.nextInt();
}
System.out.print("请输入磁头起始位置:");
position = sc.nextInt();
f1(position,len,arr);
}
}
SCAN:
package cipan;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class SCAN {
static int position;//磁头起始位置
static boolean direction;//磁头移动方向
static int len;//磁盘请求序列长度
static int arr[];//磁盘请求序列
static List<Integer> list = new ArrayList();//磁盘访问序列
static int sum;//磁道访问总数
static void f1(int position,int len,int arr[],boolean direction) {
if (len == 0){
System.out.print("磁盘访问序列:[");
for (int i:list) {
System.out.print(i+",");
}
System.out.println("]");
System.out.println("磁道访问总数:"+sum);
System.out.println("平均寻道长度:"+sum/SCAN.len);
return;
}
boolean t = false;//本次递归是否对访问序列list进行操作,没有操作表示已到达最大值/最小值
int x = Integer.MAX_VALUE;//当前数组中距离position最近的值
int y = Integer.MAX_VALUE;//x在数组中的位置
if (direction == true) {
for (int i = 0; i < arr.length; i++) {
if ((Math.abs(arr[i] - position) < Math.abs(x - position)) == true && arr[i] >= position) {
x = arr[i];
y = i;
t = true;
}
}
} else {
for (int i = 0; i < arr.length; i++) {
if ((Math.abs(arr[i] - position) < Math.abs(x - position)) == true && arr[i] <= position) {
x = arr[i];
y = i;
t = true;
}
}
}
if (t == true){
list.add(x);
sum = sum + Math.abs(x - position);
arr[y] = Integer.MAX_VALUE;
f1(x,len-1,arr,direction);
}else{
f1(position,len,arr,!direction);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入磁盘请求序列长度:");
len = sc.nextInt();
System.out.print("请输入磁盘请求序列:");
arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = sc.nextInt();
}
System.out.print("请输入磁头起始位置:");
position = sc.nextInt();
System.out.print("请选择磁头移动方向:true/false");
direction = sc.nextBoolean();
f1(position,len,arr,direction);
}
}