磁盘调度算法 scan sstf

本文介绍了一种基于Scan和Sstf算法的磁盘调度实现。通过用户输入的磁盘访问序列和初始位置,程序使用冒泡排序进行排序,并根据所选算法计算磁头移动路径及平均磁道长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法解释:点击打开链接

代码:

package exper3;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Disk {
	private boolean bool;
	
	public void BubbleSortint(int num,int str[]){       
		for(int i=0;i<num-1;i++)
		{
			bool=true;
			for(int j=0;j<num-i-1;j++){
				if(str[j]>str[j+1])
				{
					int temp=str[j];
					str[j]=str[j+1];
					str[j+1]=temp;	
					bool=false;
				}
			}
			if(bool)
				break;
		}
		System.out.print("数组经过冒泡排序后(升序):");
		for(int i=0;i<num;i++){
			System.out.print(str[i]+" ");
		}
		System.out.println();
	}
	
	public void BubbleSortlist(List<Integer> list1){
		for(int i=0;i<list1.size()-1;i++){
			bool=true;
			for(int j=0;j<list1.size()-i-1;j++){
				if(list1.get(j)>list1.get(j+1)){
					int temp=list1.get(j);
					list1.set(j,list1.get(j+1));
					list1.set(j+1,temp);
					bool=false;
				}
			}
			if(bool){
				break;
			}
		}
		System.out.print("集合经过冒泡排序后(升序):");
		for(int i=0;i<list1.size();i++){
			System.out.print(list1.get(i)+" ");
		}
		System.out.println();
	}
	
	public void Scan(int num,int start,int[] str,String arrow){
		int sum=0;
		int mem2=0;
		int[] mem3=new int[num];
		for(int i=0;i<num-1;i++){
			if(start>str[i] && start<=str[i+1]){
				if(arrow.equals("in")){             //磁头位于磁道的中间,且更靠近后边
					int mem1=i;
					int w=0;
					for(int j=i+1;j<num;j++){  
						mem2=str[j]-start;
						sum=sum+mem2;
						start=str[j];
						mem3[w++]=str[j];
					}
					for(int k=i;k>=0;k--){
						mem2=start-str[k];
						sum=sum+mem2;
						start=str[k];
						mem3[w++]=str[k];
					}
					break;
				}else if(arrow.equals("out")){         //磁头位于磁道的中间,且更靠近前边
					int mem1=i;
					int w=0;
					for(int k=i;k>=0;k--){
						mem2=start-str[k];
						sum=sum+mem2;
						start=str[k];
						mem3[w++]=str[k];
					}
					for(int j=i+1;j<num;j++){
						mem2=str[j]-start;
						sum=sum+mem2;
						start=str[j];
						mem3[w++]=str[j];
					}	
					break;
			    }
			}else if(i==num-1 && str[i]<=start ){               //磁头位于磁道的最右侧
					int w=0;
					for(int k=num-1;k>=0;k--){
						mem2=start-str[k];
						sum=sum+mem2;
						start=str[k];
						mem3[w++]=str[k];
					}
					break;
			}else if(i==num-1 && str[i]>=start ){               //磁头位于磁道的最左侧
					int w=0;
					for(int k=0;k<num;k++){
						mem2=start-str[k];
						sum=sum+mem2;
						start=str[k];
						mem3[w++]=str[k];
					}
					break;
			}
		}
		System.out.print("磁头移动的轨迹:");
		for(int i=0;i<num;i++){
			System.out.print(mem3[i]+" ");
		}
		System.out.println();
		System.out.println("平均磁道长度:"+(sum)/num);
	}
	
	public void Sstf(int num,List<Integer> list1,int start){
		int sum=0;
		int[] mem3=new int[num];
		int w=0;
		for(int j=0;j<list1.size();j++){
			Boolean bool=true;
			for(int i=0;i<list1.size()-1;i++){     
				if(start>list1.get(i) && start<=list1.get(i+1)){
					if(start-list1.get(i)>list1.get(i+1)-start){            
						sum=sum+list1.get(i+1)-start;
						start=list1.get(i+1);
						mem3[w++]=list1.get(i+1);
						list1.remove(i+1);
						BubbleSortlist(list1);
						bool=false;
						break;
					}
					else{
						sum=sum+start-list1.get(i);
						start=list1.get(i);
						mem3[w++]=list1.get(i);
						list1.remove(i);
						BubbleSortlist(list1);
						bool=false;
						break;
					}
				}
			}
			if(bool)
				break;
		}
		int m=list1.size();
		if(start<list1.get(0)){
			for(int i=0;i<m;i++){
				sum=sum+list1.get(0)-start;
				start=list1.get(0);
				mem3[w++]=list1.get(0);
				list1.remove(0);
				BubbleSortlist(list1);
			}
		}					
		System.out.print("磁头移动的轨迹:");
		for(int i=0;i<num;i++){
			System.out.print(mem3[i]+" ");
		}
		System.out.println();
		System.out.println("平均磁道长度:"+sum/num);
	}
	
	public static void main(String args[]){
		Disk dsk=new Disk();
		Scanner sc=new Scanner(System.in);
		boolean choose=true;
		while(choose){
			System.out.println("请输入您选择的功能序列号:");
			System.out.println("1:采用Scan算法进行磁盘序列调度");
			System.out.println("2: 采用Sstf算法进行磁盘序列调度");
			System.out.println("3:退出此程序");
			int choice=sc.nextInt();
			if(choice==1){
				 System.out.print("请输入访问磁盘的个数:");
				 int num=sc.nextInt();
				 System.out.print("请输入磁盘访问序列:");
				 int[] str=new int[8];
				 for(int i=0;i<num;i++){
					str[i]=sc.nextInt();
				 }
				 System.out.print("请输入读写头起始位置:");
				 int start=sc.nextInt();
				 System.out.print("请选择磁盘调度方向:如果选择向里,输入in;如果选择向外,输入out");
				 String arrow=sc.next();
				 dsk.BubbleSortint(num,str);
				 dsk.Scan(num,start,str,arrow);				
			}else if(choice==2){
				 System.out.print("请输入访问磁盘的个数:");
				 int num=sc.nextInt();
				 System.out.print("请输入磁盘访问序列:");
				 List<Integer> list1=new ArrayList<>();
				 for(int i=0;i<num;i++){
					 list1.add(sc.nextInt());
				 }
				 System.out.print("请输入读写头起始位置:");
				 int start=sc.nextInt();			 
				 dsk.BubbleSortlist(list1);
				 dsk.Sstf(num,list1,start);				
			}else if(choice==3){
				System.exit(0);
				sc.close();
			}else{
				System.out.println("输入错误,请重新输入功能序列号。");
			}
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值