磁盘调度原理及代码实现

内容

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

原理

模拟电梯调度算法,对磁盘调度。
磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。
当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。
当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。
假设磁盘有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;
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模拟电梯调度算法,对磁盘进行移臂操作 三、 提示及要求: 1、 假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。 2、 磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求而处于等待状态时,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。为此设置“驱动调度”进程。 3、 由于磁盘与处理器是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的其它进程可以提出使用磁盘(这里我们只要求访问磁道),即动态申请访问磁道,为此设置“接受请求”进程。 4、 为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,程序结构图参考附图: 5、 “接受请求”进程建立一张“进程请求I/O”表,指出等待访问磁盘的进程要求访问的磁道,表的格式如下: 进程名 要求访问的磁道号 6、 “磁盘调度”的功能是查“请求I/O”表,当有等待访问的进程时,按电梯调度算法(SCAN算法)从中选择一个等待访问的进程,按其指定的要求访问磁道。SCAN算法参考课本第九章。算法模拟框图略。 7、 附图中的“初始化”工作包括:初始化“请求I/O”表,设置置当前移臂方向;当前磁道号。并且假设程序运行前“请求I/O”表中已有若干进程(4~8个)申请访问相应磁道。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值