磁盘调度算法;先来先服务调度算法、最短寻道时间优先调度算法、扫描调度算

6 篇文章 0 订阅
3 篇文章 1 订阅

一、  实验目的和要求

1.  了解磁盘调度技术的特点

2.  掌握磁盘调度算法,如先来先服务(firstcome first served,FCFS)调度算法、最短寻道时间优先(shortest seek timefirst,SSTF)调度算法、扫描(SCAN)调度算法、循环扫描(C-SCAN)调度算法。

二、    实验内容

设计模拟实现FCFS、SSTF、SCAN和C-SCAN调度算法的C语言程序。

1.  FCFS算法:根据进程请求访问磁盘的先后次序进行调度。

2.  SSTF算法:要求访问的磁道与当前磁头所在的磁道距离最近,以便每次的寻道时间最短。

3.  SCAN算法:不仅考虑了欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。

三、  实验步骤

1.  使用C++语言编译程序。

2.  完成算法代码。

3.  运行程序,算出结果。

四、     实验源程序

代码:         

#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <list>
#define MAX 1111
#define INF 0x3f3f3f3f

using namespace std;

typedef struct Disk_Scheduling
{
    doubleTrackhao;
    doubleTrackshu;
}DKSG;

DKSG ds[MAX];
double track[MAX];
int mark[MAX];


int input(int &n,double &now)
{
    int im;
    int Min = INF;
    printf("请输入所求磁道号个数和开始磁道号(用空格隔开!):\n");
    scanf("%d%lf",&n,&now);
    printf("请输入%d个磁道号(各磁道号之间用空格隔开!):\n",n);
    for(int i=0;i<n; i++){
       scanf("%lf",&track[i]);
        double temp= fabs(track[i]-now);
        if(temp< Min){
            Min =temp;
            im = i;
        }
    }

    return im;
}



void output(int n)
{
   printf("%s  %s\n","被访问的下一个磁道号","横跨磁道数");
    for(int i=0;i<n; i++){
       printf("%12.2f %16.2f\n",ds[i].Trackhao,ds[i].Trackshu);
    }
}



void FCFS()
{
    int n;
    double now;
    input(n,now);
    for(int i=0;i<n; i++){
       ds[i].Trackhao = track[i];
        ds[i].Trackshu = fabs(track[i]-now);
        now =track[i];
    }
    printf("\n先来先服务:\n");
    output(n);

}



void SSTF()
{
   memset(mark,0,sizeof(mark));
    int n;
    double now;
    int im =input(n,now);
    int cnt1,cnt2;
    double t1,t2;
    for(int i=0;i<n; i++){
        int Min =INF;
       ds[i].Trackhao = track[im];
       ds[i].Trackshu = fabs(track[im]-now);
        now =track[im];
        mark[im] =1;
        for(intj=0; j<n; j++){
           if(!mark[j]){
                doubletemp = fabs(track[j]-now);
               if(temp < Min){
                   Min = temp;
                   im = j;
                }
            }
        }
    }
    printf("\n最短寻道时间优先:\n");

    output(n);

}



void SCAN()
{
    double retrack[MAX];
    int n;
    double now;
    input(n,now);
   sort(track,track+n);
    int locate =upper_bound(track,track+n,now) - track;
    int t = locate;
    int k,r;
    for(k=0;k<n-locate; k++){
        retrack[k]= track[k+locate];
    }

    for(r=k; r<n;r++){
        retrack[r]= track[--t];

    }

    for(int i=0;i<n; i++){
       ds[i].Trackhao = retrack[i];
       ds[i].Trackshu = fabs(retrack[i]-now);
        now =retrack[i];
    }

    printf("\n扫描调度算法:\n");

    output(n);

}



void C_SCAN()
{
    int n;
    double now;
    input(n,now);
   sort(track,track+n);
    int locate =upper_bound(track,track+n,now) - track;
    int im;
    for(int i=0;i<n; i++){
        im =(i+locate)%n;
       ds[i].Trackhao = track[im];
       ds[i].Trackshu = fabs(track[im]-now);
        now =track[im];
    }
    printf("\n循环扫描调度算法:\n");

    output(n);

}



int main()
{
   printf("%*s\n",80,"欢迎您!");
    int ca = 0;
    do{
       printf("\n%*s\n",80,"请选择磁盘调度算法或结束程序:");
       printf("0、结束程序\n1、先来先服务\n2、最短寻道时间优先\n3、扫描\n4、循环扫描\n");
       scanf("%d",&ca);
        if(ca == 1)FCFS();
        if(ca == 2)SSTF();
        if(ca == 3)SCAN();
        if(ca == 4)C_SCAN();
       printf("\n\n");

    }while(ca);

    return 0;

}

五、  实验结果

先来先服务调度算法:

最短寻道时间调度算法:

 

扫描调度算法:

循环扫描调度算法:

  • 15
    点赞
  • 173
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值