java实现——最短寻道时间优先(SSTF)和扫描(SCAN)算法

模拟实现磁盘调度算法:最短寻道时间优先(SSTF)和扫描(SCAN)算法。

实验步骤:

理解各调度算法的工作原理

对给出的任意的磁盘请求序列、计算平均寻道长度;要求可定制磁盘请求序列长度、磁头起始位置、磁头移动方向。

测试:假设磁盘访问序列:98,183,37,122,14,124,65,67;读写头起始位置:53,方向:磁道增加的方向。输入此类数据后,程序按照选定的算法,自动给出访问序列,并且算出经过的磁道总数。

最短寻道时间优先(SSTF)算法

package 磁盘调度算法;
import java.util.List;  
import java.util.Scanner;

//最短寻道时间优先
public class SSTF{
	private int visit[];
	private int nearIndex=0;
	public int[] sstf(int queue[],int start){
		int nearNum=9999;
		visit=new int[queue.length];
		for(int i=0;i<queue.length;i++){
			for(int j=0;j<queue.length;j++){
				if(queue[j]!=-1){
					if(Math.abs(nearNum-start)>Math.abs(queue[j]-start)){
						nearNum=queue[j];
						nearIndex=j;
					}
				}
			}
			visit[i]=nearNum;
			queue[nearIndex]=-1;
			start=nearNum;
			nearNum=9999;
		}
	return visit;
	}	
	public void print(int visit[],int start){
		double sum=0;
		System.out.print("访问序列:");
		for(int i=0;i<visit.length;i++){
			System.out.print(visit[i]+" ");
			sum=Math.abs(visit[i]-start)+sum;
			start=visit[i];
		}
		System.out.println();
		System.out.println("经过的磁道总数:"+sum);
		System.out.println("平均寻道长度:"+sum/visit.length);
	}

	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入磁盘请求序列长度:");
		int a=sc.nextInt();
		System.out.println("请输入磁盘请求访问序列:");
		int[] queue=new int[a];
		for(int i=0;i<a;i++){
			queue[i]=sc.nextInt();
		}
		SSTF sstf=new SSTF();
		System.out.println("请输入读写头起始位置:");
		int start=sc.nextInt();
		sstf.print(sstf.sstf(queue, start),start);
	}
}

实验结果:

扫描(SCAN)算法:

package 磁盘调度算法2;
import java.util.List;
import java.util.Scanner;

public class SCAN{
	private int visit[];
	private int nearIndex=0;
	public int[] scan(int queue[],int start,int direction){
		int nearNum=9999;
		int index=0;
		visit=new int[queue.length];
		for(int i=0;i<queue.length;i++){
			index=-1;
			for(int j=0;j<queue.length;j++){
				if(queue[j]!=-1){
					if((direction==1)&&(queue[j]>start)&&(Math.abs(nearNum-start)>Math.abs(queue[j]-start))){
						nearNum=queue[j];
						nearIndex=j;
						index=0;
					}
					else if((direction==0)&&(queue[j]<start)&&(Math.abs(nearNum-start)>Math.abs(queue[j]-start))){
						nearNum=queue[j];
						nearIndex=j;
						index=0;
					}
				}
			}
			if((direction==1)&&(index==-1)){
				direction=0;
				i=i-1;
			}
			else if((direction==0)&&(index==-1)){
				direction=1;
				i=i-1;
			}
			if(index==0){
				visit[i]=nearNum;
				queue[nearIndex]=-1;
				start=nearNum;
				nearNum=9999;
			}
		}
		return visit;
	}
	
	public void print(int visit[],int start){
		double sum=0;
		System.out.print("访问序列:");
		for(int i=0;i<visit.length;i++){
			System.out.print(visit[i]+" ");
			sum=Math.abs(visit[i]-start)+sum;
			start=visit[i];
		}
		System.out.println();
		System.out.println("经过的磁道总数:"+sum);
		System.out.println("平均寻道长度:"+sum/visit.length);
	}

	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入磁盘请求序列长度:");
		int a=sc.nextInt();
		System.out.println("请输入磁盘请求访问序列:");
		int[] queue=new int[a];
		for(int i=0;i<a;i++){
			queue[i]=sc.nextInt();
		}
		SCAN scan=new SCAN();
		System.out.println("请输入读写头起始位置:");
		int start=sc.nextInt();
		System.out.println("磁道增加的方向:(0向磁道号减少的方向移动,1向磁道号增加的方向移动)");
		int direction=sc.nextInt();
		scan.print(scan.scan(queue, start,direction),start);
	}
}

实验结果:


  • 3
    点赞
  • 0
    评论
  • 26
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值