磁盘调度算法:FCFS、SSTF、SCAN、CSCAN 实现与比较
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
#include <Windows.h>
#include <vector>
//#include<bits/stdc++.h
using namespace std;
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”文件,画出流程图。
内容:很抱歉,我们无法为您提供画流程图的服务。建议您使用在线流程图工具或手动绘制流程图。
原文地址: https://www.cveoy.top/t/topic/osg7 著作权归作者所有。请勿转载和采集!