磁盘调度算法
先来先服务算法(FCFS):
先来先服务算法根据访问磁盘的先后顺序进行,由当前磁头位置移动到首先到达缓存区的磁盘。优点:公平/简单,该算法的平均寻道时间相对较长。
void FCFS()
{
int sum=0;
int start;
int Find[11];
cout<<"请输入当前磁头位置:";
cin>>start;
cout<<"请输入10个需要遍历的磁盘号:"<<endl;;
for(int i=1; i<=10; i++)
{
cout<<"i="<<i<<":";
cin>>Find[i];
}
cout<<"当前算法的遍历路径为:\n"<<endl;
cout<<start<<"-->";
for(int i=1; i<=10; i++)
{
if(i==1)
sum+=abs(start-Find[i]);
else
sum+=abs(Find[i-1]-Find[i]);
if(i==10)
cout<<Find[i]<<endl;
else
cout<<Find[i]<<"-->";
}
cout<<"\n当前算法的磁头移动总量为:"<<sum<<"\n"<<endl;
system("pause");
}
最短寻道时间优先算法(SSTF):
首先确定磁头当前位置,根据所有到达缓存区的磁盘位置,找到距离最短的磁盘位置,首先进行访问,利用贪心思想,每次都选取当前最优解实现访问
void SSTF()
{
struct P
{
int location;
int flag;
} Find[11];
int sum=0;
int start;
int now;
int Short=0;
cout<<"请输入当前磁头位置:";
cin>>start;
cout<<"请输入10个需要遍历的磁盘号:"<<endl;;
for(int i=1; i<=10; i++)
{
cout<<"i="<<i<<":";
cin>>Find[i].location;
Find[i].flag=0;
}
now = start;
cout<<"当前算法的遍历路径为:\n"<<endl;
cout<<start<<"-->";
for(int k=1; k<=10; k++)
{
int min_size = 1000000;
int min_num = -999;
for(int i=1; i<=10; i++)
{
Short=abs(now-Find[i].location);
if(Find[i].flag!=1)
{
if(min_size>Short)
{
min_size = Short;
min_num = i;
}
}
}
now = Find[min_num].location;
Find[min_num].flag=1;
sum+=min_size;
if(k==10)
cout<<Find[min_num].location<<endl;
else
cout<<Find[min_num].location<<"-->";
}
cout<<"\n当前算法的磁头移动总量为:"<<sum<<"\n"<<endl;
system("pause");
}
扫描算法(SCAN):
其运行方式类似于电梯,从当前位置只能一次性向同一方向(磁盘号增大或磁盘号减小)遍历所有磁盘。考虑因素:方向一致,距离最短。接下来的实现过程只简单模拟一下。判断距离最短并没有实现(其实实现也很方便)大家手动尝试一下就好。
bool cmp_high(int a,int b)
{
return a<b;
}
bool cmp_low(int a,int b)
{
return a>b;
}
void SCAN()
{
int sum=0,now;
int start;
int high[11];
int high_i=1;
int low[11];
int low_i=1;
cout<<"请输入当前磁头位置:";
cin>>start;
cout<<"请输入10个需要遍历的磁盘号:"<<endl;;
for(int i=1; i<=10; i++)
{
cin>>now;
if(now>=start)
{
high[high_i++]=now;
}
else
{
low[low_i++]=now;
}
}
sort(high+1,high+high_i,cmp_high);
sort(low+1,low+low_i,cmp_low);
cout<<"当前算法的遍历路径为:\n"<<endl;
cout<<start<<"-->";
for(int i=1; i<high_i; i++)
{
cout<<high[i]<<"-->";
sum+=abs(start-high[i]);
start=high[i];
}
for(int i=1; i<low_i; i++)
{
if(i==low_i-1)
cout<<low[i];
else
cout<<low[i]<<"-->";
sum+=abs(start-low[i]);
start=low[i];
}
cout<<""<<endl;
cout<<"\n当前算法的磁头移动总量为:"<<sum<<"\n"<<endl;
system("pause");
}
完整代码:
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
bool cmp_high(int a,int b)
{
return a<b;
}
bool cmp_low(int a,int b)
{
return a>b;
}
void Choice()
{
cout<<"欢迎使用磁盘调度算法演示过程"<<endl;
cout<<"****************************"<<endl;
cout<<"*1.先来先服务算法 *"<<endl;
cout<<"*2.最短寻道算法 *"<<endl;
cout<<"*3.扫描算法 *"<<endl;
cout<<"*4.退出 *"<<endl;
cout<<"****************************"<<endl;
}
void FCFS()
{
int sum=0;
int start;
int Find[11];
cout<<"请输入当前磁头位置:";
cin>>start;
cout<<"请输入10个需要遍历的磁盘号:"<<endl;;
for(int i=1; i<=10; i++)
{
cout<<"i="<<i<<":";
cin>>Find[i];
}
cout<<"当前算法的遍历路径为:\n"<<endl;
cout<<start<<"-->";
for(int i=1; i<=10; i++)
{
if(i==1)
sum+=abs(start-Find[i]);
else
sum+=abs(Find[i-1]-Find[i]);
if(i==10)
cout<<Find[i]<<endl;
else
cout<<Find[i]<<"-->";
}
cout<<"\n当前算法的磁头移动总量为:"<<sum<<"\n"<<endl;
system("pause");
}
void SSTF()
{
struct P
{
int location;
int flag;
} Find[11];
int sum=0;
int start;
int now;
int Short=0;
cout<<"请输入当前磁头位置:";
cin>>start;
cout<<"请输入10个需要遍历的磁盘号:"<<endl;;
for(int i=1; i<=10; i++)
{
cout<<"i="<<i<<":";
cin>>Find[i].location;
Find[i].flag=0;
}
now = start;
cout<<"当前算法的遍历路径为:\n"<<endl;
cout<<start<<"-->";
for(int k=1; k<=10; k++)
{
int min_size = 1000000;
int min_num = -999;
for(int i=1; i<=10; i++)
{
Short=abs(now-Find[i].location);
if(Find[i].flag!=1)
{
if(min_size>Short)
{
min_size = Short;
min_num = i;
}
}
}
now = Find[min_num].location;
Find[min_num].flag=1;
sum+=min_size;
if(k==10)
cout<<Find[min_num].location<<endl;
else
cout<<Find[min_num].location<<"-->";
}
cout<<"\n当前算法的磁头移动总量为:"<<sum<<"\n"<<endl;
system("pause");
}
void SCAN()
{
int sum=0,now;
int start;
int high[11];
int high_i=1;
int low[11];
int low_i=1;
cout<<"请输入当前磁头位置:";
cin>>start;
cout<<"请输入10个需要遍历的磁盘号:"<<endl;;
for(int i=1; i<=10; i++)
{
cin>>now;
if(now>=start)
{
high[high_i++]=now;
}
else
{
low[low_i++]=now;
}
}
sort(high+1,high+high_i,cmp_high);
sort(low+1,low+low_i,cmp_low);
cout<<"当前算法的遍历路径为:\n"<<endl;
cout<<start<<"-->";
for(int i=1; i<high_i; i++)
{
cout<<high[i]<<"-->";
sum+=abs(start-high[i]);
start=high[i];
}
for(int i=1; i<low_i; i++)
{
if(i==low_i-1)
cout<<low[i];
else
cout<<low[i]<<"-->";
sum+=abs(start-low[i]);
start=low[i];
}
cout<<""<<endl;
cout<<"\n当前算法的磁头移动总量为:"<<sum<<"\n"<<endl;
system("pause");
}
/*
23
376
205
132
19
61
190
398
29
4
*/
int main()
{
int choice;
while(1)
{
bool flag = 0;
Choice();
cout<<"请输入选项:";
cin>>choice;
switch(choice)
{
case 1:
FCFS();
system("CLS");
break;
case 2:
SSTF();
system("CLS");
break;
case 3:
SCAN();
system("CLS");
break;
case 4:
flag = 1;
system("CLS");
break;
default:
system("CLS");
break;
}
if(flag==1)
{
cout<<"拜拜了您嘞!"<<endl;
break;
}
}
return 0;
}