⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diskdispatcharithmetic.java

📁 一个简单的SSTF磁盘调度算法
💻 JAVA
字号:
/**
 * @version 1.0
 * @Copyright: Copyright (c) 2008 IT Home Inc. All rights reserved.
 * @see java.lang.Class
 * @Class: DiskDispatchArithmetic 2008/05/28
 * @Summary: 先到先服务算法FCFS、最短寻道时间优先算法SSTF和扫描算法Scan的演示
 * @author kobe
 * @since JDK 1.5
 */

import java.io.*;

public class DiskDispatchArithmetic{
	int[] track = {23,62,31,50,70,85,92,12,99};//定义要访问的磁道
		
	int first = 45;//定义当前所在的磁道
	
	int count = 0 ;//用于统计移动磁道的总数
	
	int trackCount = 0;//当前磁道与要访问的磁头间的磁道数
	
	int len = track.length;//数组长度
	
	int c = 0;//访问次序
	
	BufferedReader streamin = new BufferedReader(
	    	new InputStreamReader(System.in));
	//声明并创建缓冲字符输入流BufferedReader对象
	
	public DiskDispatchArithmetic(){
		//显示该程序所要执行的主要信息
		System.out.println ();
		System.out.println ("***********************************");
		System.out.println ("请选择磁盘调度算法:");
		System.out.println ("1.先到先服务算法FCFS");
		System.out.println ("2.最短寻道时间优先算法SSTF");
		System.out.println ("3.扫描算法SSTF");
		System.out.println ("4.退出(exit)");
		System.out.println ("***********************************");
		System.out.print ("请输入你的选择(1-4):");
		
		int select;	//定义要选择的数字	
	    try{
	    	select = Integer.parseInt(streamin.readLine());//从命令行读取输入的字符并返回
			switch (select) {
		    	case 1: System.out.println ();
		    			System.out.println ("1.先到先服务算法FCFS");
		    			fcfs();//选择1,执行FCFS算法
		    			break;
		    	case 2: System.out.println ();
		    			System.out.println ("2.最短寻道时间优先算法SSTF");
		    			sstf();//选择2,执行SSTF算法
		    			break;
		    	case 3: System.out.println ();
		    			System.out.println ("3.扫描算法SSTF");
		    			scan();//选择3,执行Scan算法
		    			break;		
		    	case 4: System.out.println ();
		    			System.out.println ("安全退出!");break;//退出
		    	default :System.out.println ();
		    			 System.out.println ("错误提示:请输入规定中的数字(即1-4其中一个)!");
		    			  new DiskDispatchArithmetic();//输入选择不是1,2,3 提示重新输入正确数字	
		    			
		    }
	    	
	    }catch(IOException e){
	    	e.printStackTrace();
	    }
		
	}
	

	
	/**先到先服务算法FCFS
	 * count 用于统计移动磁道的总数
	 * trackCount 当前磁道与要访问的磁头间的磁道数
	 */
	public void fcfs(){		
		this.getInformation();
		for (int j = 0; j<len; j++){
			trackCount = Math.abs(first-track[j]);
			System.out.println ("  "+(j+1)+"		  "+track[j]+"	   		"+trackCount);
			count+= trackCount;
			first = track[j];
		}		
		System.out.println ("磁头移动的磁道总数是:"+count);
		float average = (float)count/(track.length);
		String s = String.valueOf(average);
		System.out.println ("磁头移动的平均磁道数是:"+s.substring(0,4));
		toContinue();
	}
	
	/**最短寻道时间优先算法SSTF
	 * count 用于统计移动磁道的总数
	 * trackCount 当前磁道与要访问的磁头间的磁道数
	 */
	 
	public void sstf(){
		this.getInformation();	
		//int c = 0;//访问次序
		int a = 0;//即将要访问的磁道所在数组对应的下标
		int one = 0;//当前磁道与数组中第一个磁道的距离
		int temp = 0;//打印访问当前的磁道
		int two = 0;//用于与one值比较大小
		while(len>1){
			one = Math.abs(first - track[0]);
			for (int i = 1; i<len; i++){					
				two = Math.abs(first - track[i]);
				if (one>two){
					one = two;
					a = i;
					temp = track[a];
			    }
			    else{
			    	temp = track[a]; 	
			    }
			}
			trackCount = Math.abs(first-track[a]);
			count+= trackCount;
			System.out.println ("  "+(++c)+"		  "+temp+"	   		"+trackCount);
			first = track[a];//指示磁头当前位于的地方
			if ((len-1)==a){//如果a是数组中最后一个数,数组长度减1			
				len--;
		    }
		    else{//如果track[a]不是数组中最后一个数,将track[a]后面的数向前移一位,数组长度减1
		    
		    	for (int n = a; n<len-1; n++){
		    		track[n]=track[n+1];
		    	}
		    	//track[a] = track[len-1];
		    	len--;
		    }
		    a = 0;//a清零,重新算起
			
		}
		
		trackCount = Math.abs(first-track[a]);
		count+= trackCount;	
		System.out.println ("  "+(++c)+"		  "+track[0]+"	   		"+trackCount);
		System.out.println ("磁头移动的磁道总数是:"+count);
		float average = (float)count/(track.length);
		String s = String.valueOf(average);
		System.out.println ("磁头移动的平均磁道数是:"+s.substring(0,4));
		toContinue();		
	}
	
	/**扫描算法Scan
	 * count 用于统计移动磁道的总数
	 * trackCount 当前磁道与要访问的磁头间的磁道数
	 */
	public void scan(){

    	System.out.println ("磁头当前位于第"+first+"磁道,假定对如下磁道进行由外向内访问:");
		int test = 0;
		int p = 0;//当前磁道要访问的下一个磁道的下标
    	
		for (int i = 0; i<len; i++){
			System.out.print (track[i]+"  ");
		}
		System.out.println ();
		System.out.println ("请求次序:"+"	访问磁道:"+"	磁头移动的磁道数:");
		for (int i = 0; i<len-1; i++){
			
			//将数组按从小到大排序
			for (int n = i+1; n<len; n++){
				if(track[i]>track[n]){
				test = track[i];
				track[i]=track[n];
				track[n] = test;
		    	}
			}
		}
		
		//求p值,即是求出当前磁道即将要访问的是哪个磁道
		for (int j = 0; j<len; j++){
			if (first>track[j]){		
		    	p = j;	
		    }		    
		}
		//p=0即是磁道单纯从内向外访问
		if(p == 0){
			for (int i = 0; i<len; i++){
				trackCount = Math.abs(first-track[i]);
				count+= trackCount;
				System.out.println ("  "+(++c)+"		  "+track[i]+"	   		"+trackCount);
				first = track[i];
			}
			
	    }
	    //p=len - 1即是磁道单纯从外向内访问
	    else if(p == len-1){
	    	for (int j = len-1; j>=0; j--){
	    		trackCount = Math.abs(first-track[j]);
				count+= trackCount;
				System.out.println ("  "+(++c)+"		  "+track[j]+"	   		"+trackCount);
	    		first = track[j];
	    	}
			
	    }
	    //p=j即是当前磁道即将从track[j]向内访问然后再从内向外访问
	    else{
	    	for (int e1 = p; e1>=0; e1--){
	    		trackCount = Math.abs(first-track[e1]);
				count+= trackCount;
				System.out.println ("  "+(++c)+"		  "+track[e1]+"	   		"+trackCount);
	    		first = track[e1];
	    	}
	    	for (int e2 = p+1; e2<len; e2++){
	    		trackCount = Math.abs(first-track[e2]);
				count+= trackCount;
				System.out.println ("  "+(++c)+"		  "+track[e2]+"	   		"+trackCount);
				first = track[e2];	    	
	    	}
	    }
	    System.out.println ("磁头移动的磁道总数是:"+count);
		float average = (float)(count/len);
		String s = String.valueOf(average);
		System.out.println ("磁头移动的平均磁道数是:"+s.substring(0,4));
		toContinue();
		
    }
	//表头信息
	public void getInformation(){
		System.out.println ("磁头当前位于第"+first+"磁道,对如下磁道进行访问:");
		for (int i = 0; i<track.length; i++){
			System.out.print (track[i]+"  ");
		}
		System.out.println ();
		System.out.println ("请求次序:"+"	访问磁道:"+"	磁头移动的磁道数:");
	}
	
	/**提示操作是否继续*/
	
	public void toContinue(){
		System.out.println ();
		System.out.print ("是否继续操作(Y/N):");
		
		try {
			String str = streamin.readLine();
			if (str.equals("Y")||str.equals("y")){
			new DiskDispatchArithmetic();
	    }
	    else{
	    	System.out.println ();
	    	System.out.println ("安全退出!");
	    	System.exit(0);
	    }	
	    }
	    catch (Exception ex) {
	    }
		
	}
	
	/**主函数*/
	
	public static void main(String args[]){		
		 new DiskDispatchArithmetic();	    	
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -