磁盘调度算法 C++ 实现 - FCFS、SSTF、SCAN、CSCAN
#include
const int MaxNumber = 100; int TrackOrder[MaxNumber]; //初始序列 int MoveDistance[MaxNumber]; //----移动距离; int FindOrder[MaxNumber]; //-----寻道序列。 double AverageDistance; //-----平均寻道长度 bool direction; //-----方向 true时为向外,false为向里 int BeginNum; //----开始磁道号。 int M; //----磁道数。 int N; //-----提出磁盘I/O申请的进程数 int SortOrder[MaxNumber]; //----排序后的序列 bool Finished[MaxNumber];
void input() { cout << "请输入磁道数:"; cin >> M; cout << "请输入提出磁盘I/O申请的进程数:"; cin >> N; cout << "请依次输入要访问的磁道号:"; for (int i = 0; i < N; i++) cin >> TrackOrder[i]; for (int j = 0; j < N; j++) MoveDistance[j] = 0; cout << "请输入开始磁道号:"; cin >> BeginNum; for (int k = 0; k < N; k++) Finished[k] = false; for (int l = 0; l < N; l++) SortOrder[l] = TrackOrder[l]; }
//=====================排序函数,将各进程申请的磁道按从小到大排列=================// void Sort() { //------冒泡排序 int temp; for (int i = N - 1; i >= 0; i--) for (int j = 0; j < i; j++) { if (SortOrder[j] > SortOrder[j + 1]) { swap(SortOrder[j], SortOrder[j + 1]); } } }
//============FCFS,先来先服务================================= void FCFS() { int temp; temp = BeginNum; //--------将BeginNum赋给temp作为寻道时的当前所在磁道号 for (int i = 0; i < N; i++) { MoveDistance[i] = abs(TrackOrder[i] - temp); //-------计算移动磁道数 temp = TrackOrder[i]; //-------寻到后,将此道作为当前所在磁道号,赋给temp FindOrder[i] = TrackOrder[i]; //-------FindOrder为寻道序列 } }
//========SSTF,最短寻道法============================= void SSTF() { int temp, n; int A = M; temp = BeginNum; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (abs(TrackOrder[j] - temp) < A && Finished[j] == false) { A = abs(TrackOrder[j] - temp); n = j; } } Finished[n] = true; MoveDistance[i] = A; temp = TrackOrder[n]; FindOrder[i] = TrackOrder[n]; A = M; } }
//=====================SCAN,扫描算法========================== void SCAN() { int direction, pos, temp; temp = BeginNum; sort(SortOrder, SortOrder + N); //升序排序 cout << "请选择开始方向:0向里,1向外"; //向里为延柱面号增加的方向 cin >> direction;
for (int i = 0; i < N; i++) {
if (SortOrder[i] > BeginNum) {
pos = i;
break;
}
}
int k = 0;
if (!direction) {
for (int i = pos; i < N; i++) {
MoveDistance[k] = abs(SortOrder[i] - temp);
temp = SortOrder[i];
FindOrder[k] = SortOrder[i];
k++;
}
for (int j = pos - 1; j >= 0; j--) { //调转方向
MoveDistance[k] = abs(SortOrder[j] - temp);
temp = SortOrder[j];
FindOrder[k] = SortOrder[j];
k++;
}
} else {
for (int i = pos - 1; i >= 0; i--) {
MoveDistance[k] = abs(SortOrder[i] - temp);
temp = SortOrder[i];
FindOrder[k] = SortOrder[i];
k++;
}
for (int j = pos; j <= N; j++) { //调转方向
MoveDistance[k] = abs(SortOrder[j] - temp);
temp = SortOrder[j];
FindOrder[k] = SortOrder[j];
k++;
}
}
}
//=================CSCAN,循环扫描算法======================= void CSCAN() { int direction, pos, temp; temp = BeginNum; sort(SortOrder, SortOrder + N); //升序排序 cout << "请选择开始方向:0向里,1向外"; //向里为延柱面号增加的方向 cin >> direction;
for (int i = 0; i < N; i++) {
if (SortOrder[i] > BeginNum) {
pos = i;
break;
}
}
int k = 0;
if (!direction) {
for (int i = pos; i < N; i++) {
MoveDistance[k] = abs(SortOrder[i] - temp);
temp = SortOrder[i];
FindOrder[k] = SortOrder[i];
k++;
}
for (int j = 0; j < pos; j++) {
MoveDistance[k] = abs(SortOrder[j] - temp);
temp = SortOrder[j];
FindOrder[k] = SortOrder[j];
k++;
}
} else {
for (int i = pos - 1; i >= 0; i--) {
MoveDistance[k] = abs(SortOrder[i] - temp);
temp = SortOrder[i];
FindOrder[k] = SortOrder[i];
k++;
}
for (int j = N - 1; j >= pos; j--) {
MoveDistance[k] = abs(SortOrder[j] - temp);
temp = SortOrder[j];
FindOrder[k] = SortOrder[j];
k++;
}
}
} //========计算平均寻道时间============== void Count() { int Total = 0; for (int i = 0; i < N; i++) { Total += MoveDistance[i]; } AverageDistance = ((double)Total) / ((double)N); }
void Show() { cout << "================从" << BeginNum << "号磁道开始=====================" << endl; cout << setw(20) << "被访问的下一个磁道号" << setw(20) << "移动距离(磁道数)" << endl; for (int i = 0; i < N; i++) { cout << setw(15) << FindOrder[i] << setw(15) << MoveDistance[i] << endl; } cout << setw(20) << "平均寻道长度:" << AverageDistance << endl; cout << endl; }
int main() { int flag = 1; int s; input(); while (flag == 1) { cout << "请选择寻道方式:1--FCFS; 2--SSTF; 3--SCAN;4--CSCAN;"; cin >> s; switch (s) { case 1: FCFS(); Count(); Show(); break; case 2: SSTF(); Count(); Show(); break; case 3: SCAN(); Count(); Show(); break; case 4: CSCAN(); Count(); Show(); break; } cout << "是否继续选择寻道算法?1--是;2--否"; cin >> flag; } system("pause"); return 0; } 打开程序“磁盘调度算法.cpp”文件,画出流程图。内容:抱歉,我作为语言模型无法画出流程图,但是我可以为您解释程序的执行流程。程序首先需要输入磁道数和提出磁盘I/O申请的进程数,以及每个进程需要访问的磁道号。然后根据用户选择的寻道算法,程序会计算出每个进程的移动距离和寻道序列,并计算出平均寻道长度。最后程序会输出每个进程的移动距离和寻道序列,以及平均寻道长度。用户可以选择继续选择寻道算法或者退出程序。
原文地址: https://www.cveoy.top/t/topic/osha 著作权归作者所有。请勿转载和采集!