磁碟排程演算法;先來先服務排程演算法、最短尋道時間優先排程演算法、掃描排程算
一、 實驗目的和要求
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;
}
五、 實驗結果
先來先服務排程演算法:
最短尋道時間排程演算法:
掃描排程演算法:
迴圈掃描排程演算法: