栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

操作系统——磁盘调度算法C++

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

操作系统——磁盘调度算法C++

问题描述:

设计程序模拟先来先服务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();
}

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1012940.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号