磁盘调度原理及代码实现

内容

模拟电梯调度算法,实现对磁盘的调度。

原理

模拟电梯调度算法,对磁盘调度。
磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。
当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。
当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。
假设磁盘有200个磁道,用C语言随机函数随机生成一个磁道请求序列(不少于15个)放入模拟的磁盘请求队列中,假定当前磁头在100号磁道上,并向磁道号增加的方向上移动。请给出按电梯调度算法进行磁盘调度时满足请求的次序,并计算出它们的平均寻道长度。

流程图

在这里插入图片描述

源程序及注释

#include <iostream>
using namespace std;
#define MAX 20 
//电梯调度算法
void SCAN(int array[], int m)
{
	int now;  //当前磁头位置
	int temp;  //冒泡排序标记,电梯调度存储最后一位不符合位置标记
	int i, j;  
	int sum = 0;  //总寻道长度 
	float avg;  //平均寻道长度
	//对磁道号序列进行从小到大排列
	for (i = 0; i < m; i++)
	{
		for (j = i + 1; j < m; j++) //对磁道号序列进行从小到大排列       
		{
			if (array[i] > array[j])//两磁道号之间比较      
			{
				temp = array[i];
				array[i] = array[j];
				array[j] = temp;
			}
		}
	}
	cout << "输出排序后的磁道号数组: ";
	for (i = 0; i < m; i++)     
	{
		cout << array[i] << " ";
	}
	cout << endl << "输入当前的磁道号: ";
	cin >> now;
	cout << "磁道方向:向磁道号增加的方向上移动" << endl;
	cout << "SCAN调度结果:  ";
	for (i = 0; i < m; i++)
	{      
		if (now <= array[i])//符合属于当前顺序
		{    
			cout << array[i] << " ";
			sum = array[i] - now + sum;//计算总寻道长度
			now = array[i];
		}     
		else//不符合属于当前顺序     
		{         
			temp = array[i];//暂存不在当前顺序的数据的最后一个
			j = i;//记录最后一个不符合的位置
		}   
	}   
	for(i = j; i >= 0; i--) //从最后一个不符合的位置往前查找
	{      
		cout << array[i] << " ";
		sum = now - array[i] + sum;//计算总寻道长度
		now = array[i];
	}  
	avg = (float)sum / m;;
	cout << endl << "移动的总道数: " << sum << endl;
	cout << "平均寻道长度: " << avg << endl;
}

void test()
{
	int cidao[MAX];//定义磁道号数组
	int num;//定义磁道数量
	cout << "请求数量: ";
	cin >> num;
	cout << "磁道请求序列: ";
	for (int i = 0; i < num; i++)
	{
		cin >> cidao[i];
	}
	SCAN(cidao, num);//调用电梯调度算法
}

int main()
{
	test();
	return 0;
}
发布了47 篇原创文章 · 获赞 108 · 访问量 4732

猜你喜欢

转载自blog.csdn.net/qq_44759710/article/details/103942062
今日推荐