题目:
1、对于如下给定的一组磁盘访问进行调度:
请求服务到达 | A | B | C | D | E | F | G | H | I | J | K | L | M | N |
访问的磁道号 | 30 | 50 | 100 | 180 | 20 | 90 | 150 | 70 | 80 | 10 | 160 | 120 | 40 | 110 |
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;
}
插眼👀