JAVA FCFS、SSTF、CSAN、CSCAN算法

设计五:磁盘调度管理

设计目的:

加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法。

设计内容:

通过编程实现不同磁盘调度算法。

设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。

常用的磁盘调度算法简介如下,请在以下算法中任意选择两种实现,并对算法性能进行分析对比。

1. 最短寻道优先算法SSTF:该算法选择这样的进程:其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。

2. 扫描算法SCAN:该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。

3.循环扫描算法CSCAN:CSCAN算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问的磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。

import java.util.Random; 
import java.util.Arrays;
public class Hello {  
    public static void main(String[] args){
        RANDOM Random=new RANDOM();
        Random.show();
        System.out.println("/////////////////////////////////");
        System.out.println("//            先进先出          //");
        System.out.println("/////////////////////////////////");
        FIFO fifo=new FIFO();
        fifo.Way(Random);
        System.out.println("/////////////////////////////////");
        System.out.println("//         最短寻道时间算法      //");
        System.out.println("/////////////////////////////////");       
    	SSTF sstf=new SSTF();
    	sstf.Way(Random);
        System.out.println("/////////////////////////////////");
        System.out.println("//            扫描算法          //");
        System.out.println("/////////////////////////////////");
        CSAN csan=new CSAN();
        csan.Way(Random);
    	System.out.println("/////////////////////////////////");
        System.out.println("//           循环扫描算法        //");
        System.out.println("/////////////////////////////////");
        CSCAN cscan=new CSCAN();
        cscan.Way(Random);
    }
}  
class RANDOM{
	int num=5;   //磁道数
	int head=50;         //假设磁头一开始指向50  
	int i;
	int a[]=new int[num];           //记录寻到序列
	int b[]=new int[num];           //记录磁道访问顺序
    void show(){ 
       	Random rand = new Random();             //从1-100随机产生要进行寻道的磁道号序列,并放在数组a里
    	System.out.println("磁道序号为:");
    	for(i=0; i=0;j--,k++) {    //先去左边
				one=head-a[j];
				sum=sum+one;
				b[k]=a[j];
				head=a[j];
			}
			for(j=i,k=k;j=0;j--,k++) {         //再去左边
				one=head-a[j];
				sum=sum+one;
				b[k]=a[j];
				head=a[j];
			}
		}
		System.out.println("磁道访问顺序为:");
		for(i=0;i=head) {            //先计算大于磁头的
				if(a[i]!=0){            //0表示已经访问
					b[j]=a[i];          //记录磁道访问顺序
					one=a[i]-head;      //计算一次移动的磁道数
					sum=sum+one;        //计算移动的磁道总数
					head=a[i];
					a[i]=0;
					j++;
				}       			
			}
		}
		int k=1;
		for(i=0;i=1 && a[i]<50){
				if(a[i]!=0 && k==1){     //第一次当磁头返回到最里的欲访问的磁道
					b[j]=a[i];
					one=100-head+a[i];
					sum=sum+one;    //计算移动的磁道总数
					head=a[i];
					a[i]=0;
					j++;
					k=0;
				}
				else{
					b[j]=a[i];
					one=a[i]-head;
					sum=sum+one;    //计算移动的磁道总数
					head=a[i];
					a[i]=0;
					j++;
				}
			}
		}      	
		System.out.println("磁道访问顺序为:");
		for(i=0;i
JAVA FCFS、SSTF、CSAN、CSCAN算法_第1张图片

你可能感兴趣的:(JAVA FCFS、SSTF、CSAN、CSCAN算法)