操作系统:电梯调度算法代码演示
实验内容
一、实验目的
任何一个对磁盘的访问请求,应给出访问磁盘的存储空间地址:柱面号、磁头号和扇区号。在启动磁盘执行I/O操作时,应先把移动臂移动到指定的柱面,再等待指定的扇区旋转到磁头位置下,最后让指定的磁头进行读/写,完成信息传送。移臂调度是根据访问者指定的柱面位置来决定执行次序的调度。本实验要求学生设计一个电梯调度算法来模拟实现磁盘移臂调度过程。
二、实验要求
假设要求从系统中输入N个需访问的柱面号,当前磁头的移动方向由键盘输入(1代表磁头从外往内移动,-1代表磁头由内往外移动),当前磁头刚完成访问序号为M的柱面,请编程输出采用电梯调度算法得到的柱面访问序列号,同时输出读/写磁头总共移动的距离(用柱面数表示)
代码图一乐;
#include <iostream>
#include <string>
#define MAX 100
using namespace std;
class Elevator
{
public:
void setElevator()
{
cout << "输入你要访问的柱面个数: " << endl;
cin >> size;
cout << "请配置需要访问的柱面号" << endl;
for (int i = 0; i < size; i++)
{
cin >> a[i];
}
frist = a[0];
}
void bubble()
{
for (int i = 0; i < size; i++)
{
for (int j = i + 1; j < size; j++)
{
if (a[i] < a[j])
{
swap(a[i], a[j]);
}
}
}
}
void getElevator()
{
bubble();
cout << "要访问的柱面号从大到小的顺序依次是: " << endl;
for (int i = 0; i < size; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
void setdirect()
{
cout << "输入当前磁头的移动方向,(1代表磁头从外往内移动,-1代表磁头由内往外移动)" << endl;
cin >> d;
}
void getdirect()
{
if (d < 0)
{
cout << "磁头由内往外移动" << endl;
}
else if (d >= 0)
{
cout << "磁头从外往内移动" << endl;
}
}
void runElevator()
{
sum = 0;
int local;
// 寻找起始柱面的位置
for (int i = 0; i < size; i++)
{
if (a[i] == frist)
{
local = i;
}
}
// 由外向内
if (d >= 0)
{
for (int j = local; j >= 0; j--)
{
cout << a[j] << " ";
}
sum += a[0] - a[local];
for (int k = local + 1; k < size; k++)
{
cout << a[k] << " ";
}
sum += a[0] - a[size - 1];
}
else
{
for (int k = local; k < size; k++)
{
cout << a[k] << " ";
}
sum += a[local] - a[size - 1];
for (int j = local - 1; j >= 0; j--)
{
cout << a[j] << " ";
}
sum += a[0] - a[size - 1];
}
cout << endl;
}
int getsum()
{
return sum;
}
private:
int d;
int size;
int a[MAX];
int frist;
int sum;
};
void run()
{
Elevator e;
e.setElevator();
e.getElevator();
e.setdirect();
e.getdirect();
cout << "-----------------所有参数配置完毕,即将开始电梯调度算法-------------------" << endl;
cout << "调度的顺序是: ";
e.runElevator();
cout << "读写磁头共移动了" << e.getsum() << "个距离" << endl;
cout << "---------------------------------调度完毕-------------------------------" << endl;
}
int main()
{
run();
system("pause");
return 0;
}
本文来自博客园,作者:{Zeker62},转载请注明原文链接:https://www.cnblogs.com/Zeker62/p/15046177.html