磁盘调度算法(C语言实现)——大三操作系统实验

目录


1.先来先服务算法(FCFS)

1.算法原理

根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次地得到处理,不会出现某一进程的请求长期得不到满足的情况。但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。

2.实验要求

根据上述算法的特点,设计数据结构并编程实现。

3.算法流程图

4.代码分析

#include<iostream>
#include<iomanip>
#include<string.h>
using namespace std;
struct disk {
	int move;
	int number;
};
int  main() {
	int n,sum=0;
	float res;
	struct disk a[100];
	cout << "请输入开始轨道号"<<endl;
	cin >> a[0].number;
	cout << "请输入访问的进程数目" << endl;
	cin >> n;
	for (int i = 1; i < n + 1; i++) {
		cin >> a[i].number;
	}
	for (int i = 1; i < n + 1; i++) {
		a[i].move = abs(a[i - 1].number - a[i].number);
		sum += a[i].move;
	}
	res = float(sum) / n;
	cout << "(从" << a[0].number << "号轨道开始)" << endl;
	cout << "被访问的下一个轨道号  移动距离(轨道数)" << endl;
	for (int i = 1; i < n + 1; i++) {
		cout << setiosflags(ios::left);
		cout << setw(22)<<a[i].number;
		cout<<a[i].move << endl;
	}
	cout << "平均寻道长度: " << setprecision(1) << fixed <<res << endl;
	return 0;
}

变量

disk是进程的数据结构,move为它的磁道数,number为对应的磁道号,n为还需进入的进程数,sum 为寻道长度总和,res是平均寻道长度。

主函数

主要思想是a[i].move = abs(a[i – 1].number – a[i].number),其中abs是求绝对值,若使用abs,必须加上头文件iomanip

其次是输出格式的问题,setiosflags(ios::left)表示向左对齐,setw()中的参数表明向左对齐几格;

setprecision()中表示结果保存几位有效数字,加上fixed就是小数点保留几位

5.测试结果及其分析

 |55-100|=45,|58-55|=3……….以此类推

2.最短寻道时间优先算法(SSTF)

1.算法原理

该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种算法不能保证平均寻道时间最短。SSTF算法平均每次磁头移动的距离明显低于FCFS算法的距离,因而SSTF较之FCFS有更好的寻道性能。

2.实验要求

根据上述算法的特点,设计数据结构并编程实现。

3.算法流程图

4.代码分析

#include<iostream>
#include<iomanip>
using namespace std;
struct disk {
	int finish=0;
	int move;
	int number;
};
int main() {
	int n, index=0,index1=0,temp,min=999,sum=0;
	float res;
	struct disk a[200];
	cout << "请输入轨道开始号" << endl;
	cin >> a[0].number;
	cout << "请输入进入的进程数目" << endl;
	cin >> n;
	for (int i = 1; i < n + 1; i++) {
		cin>> a[i].number;
	}
	cout << "(从" << a[0].number << "号轨道开始)" << endl;
	cout << "被访问的下一个轨道号  移动距离(轨道数)" << endl;
	for (int j = 1; j < n + 1; j++) {
		for (int i = 1; i < n + 1; i++) {
			if (a[i].finish == 0) {
				temp = abs(a[i].number - a[index1].number);
				if (temp < min) {
					index = i;
					min = temp;
				}
			}
		}
		a[index].finish = 1;
		a[index].move=min;
		sum += a[index].move;
		index1 = index;
		min = 999;
		cout << setiosflags(ios::left);
		cout << setw(22) << a[index].number;
		cout << a[index].move << endl;
	}
	res = float(sum) / n;
	cout << "平均寻道长度: " << setprecision(1) << fixed << res << endl;
	return 0;
}

变量

disk是进程的数据结构,move为它的磁道数,number为对应的磁道号,finish=0表示未完成,=1表示完成,n为还需进入的进程数,sum 为寻道长度总和,res是平均寻道长度,min表示距离上一个轨道号最近的距离,index表示距离最近对应的进程索引值。

主函数

对于未完成的进程,求出距离上一个轨道号最近的进程,通过遍历比较得出index和min,每进行一次遍历(找到一个能输出的进程),min要进行更新,index就是输出的进程索引值。

5.测试结果及其分析

有点误差,应该是四舍五入问题,不要紧

距离100轨道号最近的是90,此时90对应的进程完成,剩下未完成的进程中距离90最近的是58,以此类推。 

版权声明:本文为博主作者:YSRM原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/weixin_58628068/article/details/128346665

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2024年1月3日
下一篇 2024年1月3日

相关推荐