内容
模拟电梯调度算法,实现对磁盘的调度。
原理
模拟电梯调度算法,对磁盘调度。
磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。
当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。
当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。
假设磁盘有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;
}