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

一、  实验目的和要求

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

#include

#include

#include

#include

#include

#include

#include

#include

#include

#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

       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

       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

       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

        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

           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

        retrack[k]= track[k+locate];

    }

    for(r=k; r

        retrack[r]= track[--t];

    }

    for(int i=0;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

        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;

}

 

 

 

五、  实验结果

 

先来先服务调度算法:

磁盘调度算法;先来先服务调度算法、最短寻道时间优先调度算法、扫描调度算_第1张图片 

最短寻道时间调度算法:

 磁盘调度算法;先来先服务调度算法、最短寻道时间优先调度算法、扫描调度算_第2张图片

扫描调度算法:

磁盘调度算法;先来先服务调度算法、最短寻道时间优先调度算法、扫描调度算_第3张图片

循环扫描调度算法:

磁盘调度算法;先来先服务调度算法、最短寻道时间优先调度算法、扫描调度算_第4张图片


你可能感兴趣的:(算法,C++,操作系统,操作系统,磁盘调度算法)