磁盘调度算法-FCFS-SSTF-SCAN-CSCAN

#include<stdio.h>
#include<math.h>
int array[9]={55,58,39,18,90,160,150,38,184},intial_num;
//FCFS
int FCFS(){    
        int begin=intial_num,sum=0;    
        for(int i=0;i<9;i++){
            sum+=abs(array[i]-begin);
            begin=array[i];
            printf("%5d",array[i]);
            }
        printf("\n");
        return sum;
}
//sstf
//1已被寻 0没有被寻 全为1 寻完了 
bool IsUsed(int *flag){
        for(int i=0;i<9;i++){
        if(flag[i]==0)
            return false;
        }
        return true;

//寻找与磁头最小距离磁道的下标
int Get_SSTF_Index(int x,int *flag){
        int t=0,min_d=1000;
        for(int i=0;i<9;i++){
            int d=abs(array[i]-x);
            if(d<min_d&&flag[i]==0){
                min_d=d;
                t=i;
            }    
        }
        return t;
    }
int SSTF(){
            int begin=intial_num,sum=0,index;
            int flag[9]={0};
            while(!IsUsed(flag)){
                index=Get_SSTF_Index(begin,flag);
                sum+=abs(array[index]-begin);
                begin=array[index];
                flag[index]=1;//已寻道 标记1 
                printf("%5d",array[index]);
            } 
            printf("\n");
            return sum;
}
//SCAN
//冒泡排序 大到小 
int sort(int *a){
    for(int i=0;i<8;i++){
        int t;
        for(int j=0;j<8-i;j++){
            if(a[j]<a[j+1]){
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }

int Get_SCAN_Index(int x,int *a){
    int t;
    for(int i=0;i<9;i++){
        //首个比磁头所在磁道大或等于对应磁道的下标 
        if(x<a[i]&&x>a[i+1]||x==a[i]){
            t=i;
        }
        //边界 磁头比所有磁道大 
        else if(x>a[0]){
            t=0;
        }
        //边界 磁头比所有磁道小 
        else if(x<a[8]){
            t=8;
        }
    }
    return t;
}

int SCAN(){
        int begin=intial_num,sum=0,index,array2[9]; 
        for(int i=0;i<9;i++){
            array2[i]=array[i];
        }
        sort(array2);
        index=Get_SCAN_Index(begin,array2);
        //边界 寻道从小到大 
        if(index==0||index==8){
            for(int i=8;i>=0;i--){
                sum+=abs(array2[i]-begin);
                begin=array2[i];
                printf("%5d",array2[i]);
            }
        }
        //中间 
        else{
        for(int i=index;i>=0;i--){
            sum+=abs(array2[i]-begin);
            begin=array2[i];
            printf("%5d",array2[i]);    
        }
        for(int i=index+1;i<9;i++){
            sum+=abs(array2[i]-begin);
            begin=array2[i];
            printf("%5d",array2[i]);
        }
        }
        printf("\n");
            
        return sum;    
}
//CSCAN
int CSCAN(){
        int begin=intial_num,sum=0,index,array2[9];
        for(int i=0;i<9;i++){
            array2[i]=array[i];
            }
        sort(array2);
        index=Get_SCAN_Index(begin,array2);
        //边界 寻道从小到大 
        if(index==0||index==8){
            for(int i=8;i>=0;i--){
                sum+=abs(array2[i]-begin);
                begin=array2[i];
                printf("%5d",array2[i]);
            }
        }
        //中间 index 
        else{
        for(int i=index;i>=0;i--){
            sum+=abs(array2[i]-begin);
            begin=array2[i];    
            printf("%5d",array2[i]);    
        }
        for(int i=8;i>=index+1;i--){
            sum+=abs(array2[i]-begin);
            begin=array2[i];
            printf("%5d",array2[i]);    
        }
        }
        printf("\n");        
        return sum;    
}
int main(){
    int num;
    printf("请输入当前磁头位置:");
    scanf("%d",&intial_num);
//    printf("\n请输入磁道请求顺序:");
//    for(int i=0;i<9;i++){
//        scanf("%d",&array[i]);
//    }
    printf("\n请选择算法:"); 
    while(num){
    scanf("%d",&num);
    switch (num) {
        case 1:
            printf("FCFS:\n调度顺序:");
            printf("平均寻道长度:%.1f\n",FCFS()/9.0);
            break;
        case 2:
            printf("SSTF:\n调度顺序:");
            printf("平均寻道长度:%.1f\n",SSTF()/9.0);
            break;
        case 3:
            printf("SCAN:\n调度顺序:");
            printf("平均寻道长度:%.1f\n",SCAN()/9.0);
            break;    
        case 4:
            printf("CSACN:\n调度顺序:");
            printf("平均寻道长度:%.1f\n",CSCAN()/9.0);
            break;        
        default:
            printf("输入错误。"); 
            break;
    }                
    }
}

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值