实验内容
⑴ 选择1~3种磁盘调度算法(先来先服务法、最短寻道时间优先、电梯算法)模拟实现磁盘调度; ⑵ 能够输入当前磁头的位置、磁头移动方向、磁道访问请求序列等; ⑶ 计算磁头移动的总磁道数; ⑷ 能够显示磁盘调度结果(磁头依次访问的磁道号顺序等)。
实验分析
先来先服务:相当于是按顺序进行输入,然后按顺序进行输出
最短寻道时间:即找到离当前磁道最近的哪个磁道,类似贪心的思想,即只注重眼前离得最近的那个磁道。
电梯算法:先指定一个方向,然后一头走到底,这一头走完在走另一头;在图上我们不难看出电梯算法的磁道是已经排列整齐的数组,因此在进行程序设计的时候我们可以先将磁道按照从小到大或者从大到小的顺序进行排列,然后在来进行调度。
JAVA代码实现
具体代码部分分四个部分实现,三个方法部分加一个main
先来先服务(idea1):
package Experiment;
//先来先服务
public class idea1 {
int a[]={};
int n,start,SumCount=0;
//初始化磁道
public idea1(int S[],int num,int start) {
this.a=S;
this.n=num;
this.start=start;
}
//计算磁道数
public void Count()
{
int Num1=start;
for(int i=0;i<n;i++)
{
if(a[i]<=Num1)
{
SumCount+=Num1-a[i];
}
else{
SumCount+=a[i]-Num1;
}
Num1=a[i];
}
}
//顺序输出即可
public void print()
{
Count();
System.out.print(start+"->");
for(int i=0;i<n;i++)
{
if(i==n-1)
{
System.out.println(a[i]);
}else{
System.out.print(a[i]+"->");
}
}
System.out.print("磁头移动的总磁道数:"+SumCount);
}
}
最短寻道时间(idea2):
package Experiment;
//最短寻道时间优先
public class idea2 {
int a[]={};
int num,start,Sumcount=0;
//String direction;
public idea2(int a[],int num,int start) {
this.a=a;
this.num=num;
this.start=start;
//this.direction=str;
}
public void print()
{
int num1=start,num2=-1;
int min;
System.out.print(num1+"->");
for(int j=0;j<num;j++)
{
min=100000;
for(int i=0;i<a.length;i++)
{
if((Math.abs(num1-a[i])<min))
{
min=Math.abs(num1-a[i]);
num2=a[i];
}
}
Sumcount+=min;
num1=num2;
a=removeElement(a,num2);
if(j!=num-1)
{
System.out.print(num1+"->");
}
else{
System.out.println(num1);
}
}
System.out.print("磁头移动的总磁道数:"+Sumcount);
}
//删除数组中元素的方法
public int []removeElement(int[] nums, int val) {
int len = nums.length;
int i = 0;
int j = 0;
while (i < len && j < len) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
j++;
}
int newArray[]=new int[i];
for(int k=0;k<i;k++)
{
newArray[k]=nums[k];
}
return newArray;
}
}
电梯算法(idea3):
package Experiment;
//电梯算法
public class idea3 {
int a[]={};
int num,start,Sumcount=0;
String direction;
public idea3(int a[],int num,int start,String str) {
this.a=a;
this.num=num;
this.start=start;
this.direction=str;
}
//将数组由小到大排列
public int []sortArray(int a[])
{
if (a == null || a.length < 2) {
return null;
}
/*规定每次两两比较的末尾元素的位置,最多为数组的最后一个位置*/
for (int end = a.length - 1; end > 0; end--) {
/*从第一个元素开始,两两进行比较,如果前面的元素大于后面的
元素,就交换,最终的结果就是最大的数在最后面
*/
for (int i = 0; i < end; i++) {
if (a[i] > a[i + 1]) {
int tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
}
}
}
return a;
}
//打印函数
public void print()
{
int newA[]={};
newA=sortArray(a);
if(direction.equals("左"))
{
left(newA,start);
}else{
right(newA,start);
}
}
//向左情况
public void left(int array[],int S)
{
int mid=location(array,S);
int num1;
num1=start;
System.out.print(num1+"->");
for(int i=mid-1;i>=0;i--)
{
Sumcount+=Math.abs(num1-a[i]);
num1=a[i];
System.out.print(num1+"->");
}
for(int i=mid;i<array.length;i++)
{
Sumcount+=Math.abs(num1-a[i]);
num1=a[i];
if(i!=array.length-1)
{
System.out.print(num1+"->");
}else{
System.out.println(num1);
}
}
System.out.print("磁头移动的总磁道数:"+Sumcount);
}
//向右情况
public void right(int array[],int S)
{
int mid=location(array,S);
int num1;
num1=start;
System.out.print(num1+"->");
for(int i=mid;i<array.length;i++)
{
Sumcount+=Math.abs(num1-a[i]);
num1=a[i];
System.out.print(a[i]+"->");
}
for(int i=mid-1;i>=0;i--)
{
Sumcount+=Math.abs(num1-a[i]);
num1=a[i];
if(i!=0)
{
System.out.print(a[i]+"->");
}else{
System.out.println(a[i]);
}
}
System.out.print("磁头移动的总磁道数:"+Sumcount);
}
//找出start在排完序的数组中的位置
public int location(int array[],int S)
{
int flag=0;
for(int i=0;i<array.length;i++)
{
if(array[i]>=S)
{
flag=i;
break;
}
}
return flag;
}
}
调用(main):
package Experiment;
import java.util.Scanner;
public class main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入当前磁头位置:");
int start=sc.nextInt();
System.out.println("请输入磁道的数目:");
int num=sc.nextInt();
System.out.println("请输入磁道访问请求序列(8):");
int a[]=new int[num];
for(int i=0;i<num;i++)
{
a[i]=sc.nextInt();
}
System.out.println("调度算法:");
System.out.println("1.先来先服务");
System.out.println("2.最短寻道时间优先");
System.out.println("3.电梯算法");
System.out.println("请选择算法:");
int choice = sc.nextInt();
if(choice ==1)
{
idea1 i1=new idea1(a,num,start);
i1.print();
}else if(choice ==2)
{
idea2 i2=new idea2(a,num,start);
i2.print();
}else{
System.out.println("请输入磁头移动的方向(左/右):");
String direction= sc.next();
idea3 i3=new idea3(a,num,start,direction);
i3.print();
}
}
}
//这里采用的磁道数目为8
//测试用例 start=53,磁道序号分别为98 183 37 122 14 124 65 67
结果展示
先来先服务:
最短寻道时间: