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;

}

五、  實驗結果

先來先服務排程演算法:

 

最短尋道時間排程演算法:

 

掃描排程演算法:


迴圈掃描排程演算法: