问题描述:
设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。
程序要求:
1)利用先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法模拟磁道访问过程。
2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。
3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。
4)输出:每种算法的平均寻道长度。
程序主要构成部分及其算法说明
主函数里调用了四个函数分别是Input()、FCFS()、SSTF()、SCAN()、CSCAN()。Input()引导用户对数据的输入。FCFS()先来先服务算法,就是按照磁盘访问的顺序进行调度。最短寻道时间优先SSTF()在磁盘中找到距离上一个磁盘最近的,进行调度,用循环查找比较磁盘距离就可以实现。SCAN()算法设定移动方向为向磁盘增加方向,从设定方向找到距离现在磁盘最短距离的磁盘进行调度,在设定方向上没有磁盘时,回到还未访问的磁盘里最外面的,之后再向磁盘设定的反方向进行调度,找距离近的用循环就可以实现。CSCAN()算法设定移动方向为向磁盘增加方向,从设定方向找到距离现在磁盘最短距离的磁盘进行调度,在设定方向上没有磁盘时,回到最里面在往磁盘增加方向调度。同样我设定haveAdd判定设定方向是否还有,同样找距离近的用循环就可以实现。
调试过程和运行结果
附:源码
#include#include using namespace std; const int MaxNumber = 100; int TrackOrder[MaxNumber], SSTFTrackOrder[MaxNumber], SCANTrackOrder[MaxNumber], CSCANTrackOrder[MaxNumber]; bool SSTFUsedTrack[MaxNumber], SCANUsedTrack[MaxNumber], CSCANUsedTrack[MaxNumber]; int n, FirstOrder, DistanceSum; int MoveDistance[MaxNumber]; double AverageDistance; void Input() { cout << "请输入磁道个数n:"; cin >> n; cout << "请输入开始的磁头:"; cin >> FirstOrder; cout << "请输入磁盘访问序列:"; for (int i = 0; i < n; i++) { cin >> TrackOrder[i]; } } void FCFS() { cout << "FCFS:"; cout << "从" << FirstOrder << "号磁道开始" << endl; cout << "移动方向" << " " << "被访问的下一个磁道号" << " " << "移动距离(磁道数)" << endl; if (FirstOrder > TrackOrder[0]) { MoveDistance[0] = FirstOrder - TrackOrder[0]; cout << "往前移" << " " << TrackOrder[0] << " " << MoveDistance[0] << endl; } else { MoveDistance[0] = TrackOrder[0] - FirstOrder; cout << "往后移" << " " << TrackOrder[0] << " " << MoveDistance[0] << endl; } DistanceSum = MoveDistance[0]; for (int i = 1; i < n; i++) { if (TrackOrder[i] > TrackOrder[i - 1]) { MoveDistance[i] = TrackOrder[i] - TrackOrder[i - 1]; DistanceSum += MoveDistance[i]; cout << "往后移" << " " << TrackOrder[i] << " " << MoveDistance[i] << endl; } else { MoveDistance[i] = TrackOrder[i - 1] - TrackOrder[i]; DistanceSum += MoveDistance[i]; cout << "往前移" << " " << TrackOrder[i] << " " << MoveDistance[i] << endl; } } AverageDistance = (double)DistanceSum / n; cout << "平均寻道长度:" << fixed << setprecision(1) << AverageDistance << endl; } void SSTF() { cout << "SSTF:"; cout << "从" << FirstOrder << "号磁道开始" << endl; cout << "移动方向" << " " << "被访问的下一个磁道号" << " " << "移动距离(磁道数)" << endl; int Temp1, Temp2, Id = 0; for (int i = 0; i < n; i++) { SSTFUsedTrack[i] = false; SSTFTrackOrder[i] = 0; } if (FirstOrder > TrackOrder[0]) { Temp1 = FirstOrder - TrackOrder[0]; } else { Temp1 = TrackOrder[0] - FirstOrder; } for (int i = 1; i < n; i++) { if (FirstOrder > TrackOrder[i]) { Temp2 = FirstOrder - TrackOrder[i]; } else { Temp2 = TrackOrder[i] - FirstOrder; } if (Temp1 > Temp2) { Temp1 = Temp2; Id = i; } } SSTFTrackOrder[0] = TrackOrder[Id]; SSTFUsedTrack[Id] = true; if (SSTFTrackOrder[0] > FirstOrder) { MoveDistance[0] = SSTFTrackOrder[0] - FirstOrder; DistanceSum = MoveDistance[0]; cout << "往后移" << " " << SSTFTrackOrder[0] << " " << MoveDistance[0] << endl; } else { MoveDistance[0] = FirstOrder - SSTFTrackOrder[0]; DistanceSum = MoveDistance[0]; cout << "往前移" << " " << SSTFTrackOrder[0] << " " << MoveDistance[0] << endl; } for (int i = 1; i < n; i++) { int temp1 = 1000, temp2, id = 0; for (int j = 0; j < n; j++) { if (!SSTFUsedTrack[j]) { if (TrackOrder[j] > SSTFTrackOrder[i - 1]) { temp2 = TrackOrder[j] - SSTFTrackOrder[i - 1]; } else { temp2 = SSTFTrackOrder[i - 1] - TrackOrder[j]; } if (temp1 > temp2) { temp1 = temp2; id = j; } } } SSTFTrackOrder[i] = TrackOrder[id]; SSTFUsedTrack[id] = true; if (SSTFTrackOrder[i] > SSTFTrackOrder[i - 1]) { MoveDistance[i] = SSTFTrackOrder[i] - SSTFTrackOrder[i - 1]; DistanceSum += MoveDistance[i]; cout << "往后移" << " " << SSTFTrackOrder[i] << " " << MoveDistance[i] << endl; } else { MoveDistance[i] = SSTFTrackOrder[i - 1] - SSTFTrackOrder[i]; DistanceSum += MoveDistance[i]; cout << "往前移" << " " << SSTFTrackOrder[i] << " " << MoveDistance[i] << endl; } } AverageDistance = (double)DistanceSum / n; cout << "平均寻道长度:" << fixed << setprecision(1) << AverageDistance << endl; } void SCAN() { cout << "SCAN:"; cout << "从" << FirstOrder << "号磁道开始,向磁道号增加方向访问。" << endl; cout << "移动方向" << " " << "被访问的下一个磁道号" << " " << "移动距离(磁道数)" << endl; bool haveAdd = false; for (int i = 0; i < n; i++) { //初始化 SCANUsedTrack[i] = false; SCANTrackOrder[i] = 0; } //判断在要求方向下是否有满足的 for (int i = 0; i < n; i++) { if (FirstOrder < TrackOrder[i]) { haveAdd = true; } } //如果有 if (haveAdd) { int Temp1 = 1000, Temp2, Id = 0; for (int i = 0; i < n; i++) { //找出距离磁头最近的 if (FirstOrder < TrackOrder[i]) { Temp2 = TrackOrder[i] - FirstOrder; if (Temp1 > Temp2) { Temp1 = Temp2; Id = i; } } } SCANTrackOrder[0] = TrackOrder[Id]; SCANUsedTrack[Id] = true; MoveDistance[0] = SCANTrackOrder[0] - FirstOrder; DistanceSum = MoveDistance[0]; cout << "往后移" << " " << SCANTrackOrder[0] << " " << MoveDistance[0] << endl; for (int i = 1; i < n; i++) { haveAdd = false; int temp1 = 1000, temp2, id = 0; //找是否还有向增加方向进行的 for (int j = 0; j < n; j++) { if (!SCANUsedTrack[j]) { if (TrackOrder[j] > SCANTrackOrder[i - 1]) { haveAdd = true; } } } if (haveAdd) { for (int j = 0; j < n; j++) { if (!SCANUsedTrack[j]) { if (TrackOrder[j] > SCANTrackOrder[i - 1]) { temp2 = TrackOrder[j] - SCANTrackOrder[i - 1]; if (temp1 > temp2) { temp1 = temp2; id = j; } } } } SCANTrackOrder[i] = TrackOrder[id]; SCANUsedTrack[id] = true; MoveDistance[i] = SCANTrackOrder[i] - SCANTrackOrder[i - 1]; DistanceSum += MoveDistance[i]; cout << "往后移" << " " << SCANTrackOrder[i] << " " << MoveDistance[i] << endl; } else { int temp1 = 1000, temp2, id = 0; for (int j = 0; j < n; j++) { if (!SCANUsedTrack[j]) { if (TrackOrder[j] < SCANTrackOrder[i - 1]) { temp2 = SCANTrackOrder[i - 1] - TrackOrder[j]; if (temp1 > temp2) { temp1 = temp2; id = j; } } } } SCANTrackOrder[i] = TrackOrder[id]; SCANUsedTrack[id] = true; MoveDistance[i] = SCANTrackOrder[i - 1] - SCANTrackOrder[i]; DistanceSum += MoveDistance[i]; cout << "往前移" << " " << SCANTrackOrder[i] << " " << MoveDistance[i] << endl; } } } //没有,即全是一个方向,向磁盘减少的方向去 else { int Temp1 = 1000, Temp2, Id = 0; for (int i = 0; i < n; i++) { Temp2 = FirstOrder - TrackOrder[i]; if (Temp1 > Temp2) { Temp1 = Temp2; Id = i; } } SCANTrackOrder[0] = TrackOrder[Id]; SCANUsedTrack[Id] = true; MoveDistance[0] = FirstOrder - SCANTrackOrder[0]; DistanceSum = MoveDistance[0]; cout << "往前移" << " " << SCANTrackOrder[0] << " " << MoveDistance[0] << endl; for (int i = 1; i < n; i++) { int temp1 = 1000, temp2, id = 0; for (int j = 0; j < n; j++) { if (!SCANUsedTrack[j]) { if (TrackOrder[j] <= SCANTrackOrder[i - 1]) { temp2 = SCANTrackOrder[i - 1] - TrackOrder[j]; if (temp1 > temp2) { temp1 = temp2; id = j; } } } } SCANTrackOrder[i] = TrackOrder[id]; SCANUsedTrack[id] = true; MoveDistance[i] = SCANTrackOrder[i - 1] - SCANTrackOrder[i]; DistanceSum += MoveDistance[i]; cout << "往前移" << " " << SCANTrackOrder[i] << " " << MoveDistance[i] << endl; } } AverageDistance = (double)DistanceSum / n; cout << "平均寻道长度:" << fixed << setprecision(1) << AverageDistance << endl; } void CSCAN() { cout << "CSCAN:"; cout << "从" << FirstOrder << "号磁道开始,从里往外循环。" << endl; cout << "移动方向" << " " << "被访问的下一个磁道号" << " " << "移动距离(磁道数)" << endl; bool haveAdd = false; for (int i = 0; i < n; i++) { //初始化 CSCANUsedTrack[i] = false; CSCANTrackOrder[i] = 0; } //判断在要求方向下是否有满足的 for (int i = 0; i < n; i++) { if (FirstOrder < TrackOrder[i]) { haveAdd = true; } } if (haveAdd) { int Temp1 = 1000, Temp2, Id = 0; //找距离近方法实现的中间值 for (int i = 0; i < n; i++) { if (FirstOrder < TrackOrder[i]) { Temp2 = TrackOrder[i] - FirstOrder; if (Temp1 > Temp2) { Temp1 = Temp2; Id = i; } } } CSCANTrackOrder[0] = TrackOrder[Id]; CSCANUsedTrack[Id] = true; MoveDistance[0] = CSCANTrackOrder[0] - FirstOrder; DistanceSum = MoveDistance[0]; cout << "往后移" << " " << CSCANTrackOrder[0] << " " << MoveDistance[0] << endl; for (int i = 1; i < n; i++) { haveAdd = false; for (int j = 0; j < n; j++) { if (!CSCANUsedTrack[j]) { if (TrackOrder[j] > CSCANTrackOrder[i - 1]) { haveAdd = true; } } } if (haveAdd) { int temp1 = 1000, temp2, id = 0; //找距离近方法实现的中间值 for (int j = 0; j < n; j++) { if (!CSCANUsedTrack[j]) { if (TrackOrder[j] > CSCANTrackOrder[i - 1]) { temp2 = TrackOrder[j] - CSCANTrackOrder[i - 1]; if (temp1 > temp2) { temp1 = temp2; id = j; } } } } CSCANTrackOrder[i] = TrackOrder[id]; CSCANUsedTrack[id] = true; MoveDistance[i] = CSCANTrackOrder[i] - CSCANTrackOrder[i - 1]; DistanceSum += MoveDistance[i]; cout << "往后移" << " " << CSCANTrackOrder[i] << " " << MoveDistance[i] << endl; } else { int temp1 = 0, temp2, id = 0; //找距离远方法实现的中间值 for (int j = 0; j < n; j++) { if (!CSCANUsedTrack[j]) { if (TrackOrder[j] < CSCANTrackOrder[i - 1]) { temp2 = CSCANTrackOrder[i - 1] - TrackOrder[j]; if (temp1 < temp2) { temp1 = temp2; id = j; } } } } CSCANTrackOrder[i] = TrackOrder[id]; CSCANUsedTrack[id] = true; MoveDistance[i] = CSCANTrackOrder[i - 1] - CSCANTrackOrder[i]; DistanceSum += MoveDistance[i]; cout << "往后移" << " " << CSCANTrackOrder[i] << " " << MoveDistance[i] << endl; } } } //没有,即全是一个方向,向磁盘增加的方向去 else { //找到最里面的磁盘 cout << "直接从磁盘最里面开始:" << endl; for (int i = 0; i < n; i++) { int temp = TrackOrder[i]; for (int j = i + 1; j < n; j++) { if (temp > TrackOrder[j]) { temp = TrackOrder[j]; } } CSCANTrackOrder[i] = temp; if (i == 0) { MoveDistance[0] = FirstOrder - temp; DistanceSum = MoveDistance[0]; } else { MoveDistance[i] = temp - CSCANTrackOrder[i - 1]; DistanceSum += MoveDistance[i]; } cout << "往后移" << " " << temp << " " << MoveDistance[i] << endl; } } AverageDistance = (double)DistanceSum / n; cout << "平均寻道长度:" << fixed << setprecision(1) << AverageDistance << endl; } int main() { //55 58 39 18 90 160 150 38 184 Input(); FCFS(); SSTF(); SCAN(); CSCAN(); }



