OS

本文通过具体实例介绍了三种磁盘调度算法:先来先服务(FCFS)、最短寻道优先(SSTF)和电梯调度(SCAN_UP/DOWN)。通过C++实现,对比了不同算法下的磁盘访问顺序及平均移动道数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

1、对于如下给定的一组磁盘访问进行调度:

请求服务到达ABCDEFGHIJKLMN
访问的磁道号3050100180209015070801016012040110

2、要求分别采用先来先服务、最短寻道优先以及电梯调度算法进行调度。

3、要求给出每种算法中磁盘访问的顺序,计算出平均移动道数。

4、假定当前读写头在90号,电梯调度算法向磁道号增加的方向移动。

代码:

#include<iostream>
#include<math.h>
using namespace std;

struct track
{
	int Num = 0;
	char Name = ' ';
}AllTrack[14];
int Current = 90;

void init()
{
	AllTrack[0].Num = 30;
	AllTrack[1].Num = 50;
	AllTrack[2].Num = 100;
	AllTrack[3].Num = 180;
	AllTrack[4].Num = 20;
	AllTrack[5].Num = 90;
	AllTrack[6].Num = 150;
	AllTrack[7].Num = 70;
	AllTrack[8].Num = 80;
	AllTrack[9].Num = 10;
	AllTrack[10].Num = 160;
	AllTrack[11].Num = 120;
	AllTrack[12].Num = 40;
	AllTrack[13].Num = 110;
	for (int i = 0; i < 14; i++)
		AllTrack[i].Name = 'A' + i;
}

void FCFS()
{
	cout << "**************************FCFS**************************\n";
	int AllMove = 0;
	for (int i = 0; i < 14; i++)//对每个请求
	{
		int temp = Current;
		AllMove += Current > AllTrack[i].Num ? Current - AllTrack[i].Num : AllTrack[i].Num - Current;
		Current = AllTrack[i].Num;
		cout << "响应服务" << AllTrack[i].Name << "\t读写头从" << temp << "移动至" << Current << "\t当前移动道数为" << AllMove << endl;
	}
	float average = (float)AllMove / 14;
	cout << "平均移动道数为:" << average << endl;
	cout << "**************************FCFS**************************\n\n";
	Current = 90;//当前读头归位
}

void SSTF()
{
	cout << "**************************SSTF**************************\n";
	int cnt = 14;
	bool visit[14] = { false };
	int tracknum = 0;//记录最近的服务序列号
	int AllMove = 0;
	while (cnt > 0)//响应服务14次
	{
		int min = 1000;
		for (int i = 0; i < 14; i++)//寻找最近的请求
		{
			if (visit[i])	continue;
			if (min > abs(AllTrack[i].Num - Current))
			{
				min = abs(AllTrack[i].Num - Current);
				tracknum = i;
			}
		}
		visit[tracknum] = true;
		int temp = Current;
		AllMove += Current > AllTrack[tracknum].Num ? Current - AllTrack[tracknum].Num : AllTrack[tracknum].Num - Current;
		Current = AllTrack[tracknum].Num;
		cout << "响应服务" << AllTrack[tracknum].Name << "\t读写头从" << temp << "移动至" << Current << "\t当前移动道数为" << AllMove << endl;
		cnt--;
	}
	float average = (float)AllMove / 14;
	cout << "平均移动道数为:" << average << endl;
	cout << "**************************SSTF**************************\n\n";
	Current = 90;
}

void SCAN_UP()
{//先响应磁道号大的服务
	cout << "**********************SCAN_UP(LOOK)*********************\n";
	int cnt = 14;
	bool visit[14] = { false };
	int tracknum = 0;//记录本次的服务序列号
	int AllMove = 0;
	bool flag = false;//判断是否已经完成大磁道数服务的响应
	bool UpAsk = false;//判断是否有更大的请求
	while (cnt > 0)//响应服务14次
	{
		UpAsk = false;
		int min = 1000;
		int MaxTrack = Current;
		for (int i = 0; i < 14; i++)//判断磁道数大的方向是否已经走完
		{
			if (!flag && MaxTrack < AllTrack[i].Num)//找到了需要更大磁道的服务
			{
				MaxTrack = AllTrack[i].Num;
				UpAsk = true;
			}
			if (i == 13 && !UpAsk)//磁道数大的方向已经走完
				flag = true;
		}
		for (int i = 0; i < 14; i++)//找最近的大/小磁道
		{
			if (visit[i])	continue;
			if (!flag && AllTrack[i].Num < Current)//找大磁道时,遇到小磁道continue
				continue;
			if (min > abs(AllTrack[i].Num - Current))
			{
				min = abs(AllTrack[i].Num - Current);
				tracknum = i;
			}
		}
		visit[tracknum] = true;
		int temp = Current;
		AllMove += Current > AllTrack[tracknum].Num ? Current - AllTrack[tracknum].Num : AllTrack[tracknum].Num - Current;
		Current = AllTrack[tracknum].Num;
		cout << "响应服务" << AllTrack[tracknum].Name << "\t读写头从" << temp << "移动至" << Current << "\t当前移动道数为" << AllMove << endl;
		cnt--;
	}
	float average = (float)AllMove / 14;
	cout << "平均移动道数为:" << average << endl;
	Current = 90;
	cout << "**********************SCAN_UP(LOOK)*********************\n\n";
}

void SCAN_DOWN()
{// 先响应磁道号小的服务
	cout << "*********************SCAN_DOWN(LOOK)********************\n";
	int cnt = 14;
	bool visit[14] = { false };
	int tracknum = 0;//记录本次的服务序列号
	int AllMove = 0;
	bool flag = false;//判断是否已经完成小磁道数服务的响应
	bool DownAsk = false;//判断是否有更小的请求
	while (cnt > 0)//响应服务14次
	{
		DownAsk = false;
		int min = 1000;
		int MinTrack = Current;
		for (int i = 0; i < 14; i++)//判断磁道数小的方向是否已经走完
		{
			if (!flag && MinTrack > AllTrack[i].Num)//找到了需要更小磁道的服务
			{
				MinTrack = AllTrack[i].Num;
				DownAsk = true;
			}
			if (i == 13 && !DownAsk)//磁道数小的方向已经走完
				flag = true;
		}
		for (int i = 0; i < 14; i++)//找最近的大/小磁道
		{
			if (visit[i])	continue;
			if (!flag && AllTrack[i].Num > Current)//找小磁道时,遇到大磁道continue
				continue;
			if (min > abs(AllTrack[i].Num - Current))
			{
				min = abs(AllTrack[i].Num - Current);
				tracknum = i;
			}
		}
		visit[tracknum] = true;
		int temp = Current;
		AllMove += Current > AllTrack[tracknum].Num ? Current - AllTrack[tracknum].Num : AllTrack[tracknum].Num - Current;
		Current = AllTrack[tracknum].Num;
		cout << "响应服务" << AllTrack[tracknum].Name << "\t读写头从" << temp << "移动至" << Current << "\t当前移动道数为" << AllMove << endl;
		cnt--;
	}
	float average = (float)AllMove / 14;
	cout << "平均移动道数为:" << average << endl;
	Current = 90;
	cout << "*********************SCAN_DOWN(LOOK)********************\n\n";
}

int main()
{
	init();
	FCFS();
	SSTF();
	SCAN_UP();
	SCAN_DOWN();
	return 0;
}

 

插眼👀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值