例: 假定某磁盘共有200个柱面,编号为 0-199,如果在为访问 143 号柱面的请求者服务后,当前正在为访问 125 号柱面的请求服务,同时有若干请求者在等待服务,它们每次要访问的柱面号为 86 ,147 ,91 ,177 ,94 ,150 ,102, 175 ,130
1 、先来先服务算法(FCFS )First Come First Service6、参考代码
#include
#include
#include
using namespace std;
typedef vector vInt; //向量,动态数组
struct OrderItem
{
int Data;
bool IsVisited;
};
typedef vector Order;
Order InitOrder;
vInt TrackOrder;
vInt MoveDistance;
double AverageDistance;
void InitDate(int &num);
inline void Init(int disk); //内联函数(内联函数的代码会在任何调用它的地方展开)
void FCFS(int disk);
void SSTF(int disk);
void SCAN(int disk);
void CSCAN(int disk);
void Show(int disk);
int main()
{
int num;
InitDate(num);
char cmd;
do
{
cout<<"选择算法:\n"<<"1-FCFS,2-SSTF,3-SCAN,4-CSCAN:\t";
int type;cin>>type;
switch(type)
{
case 1:FCFS(num);break;
case 2:SSTF(num);break;
case 3:SCAN(num);break;
case 4:CSCAN(num);break;
}
Show(num);
cout<<"Continue? y or n?\t";
cin>>cmd;
}while(cmd!='n');
return 0;
}
inline void Init(int disk)
{
TrackOrder.clear();
MoveDistance.clear();
for(int i = 0; i < disk; i++)
{
InitOrder[i].IsVisited = false;
}
}
void InitDate(int &num)
{
//ifstream cin("data.txt");
cout<<"输入磁道个数";
cin>>num;
cout<<"磁盘访问序列";
for(int i=0; i>oi.Data;
oi.IsVisited = false;
InitOrder.push_back(oi);
}
}
void FCFS(int disk)
{
cout<<"输入开始磁盘号";
int start;cin>>start;
cout<<"FCFS:"<0?t:-t);
InitOrder[i].IsVisited = true;
p = InitOrder[i].Data;
}
}
void SSTF(int disk)
{
cout<<"输入开始磁盘号";
int start;cin>>start;
cout<<"SSTF:"<0?
p-InitOrder[j].Data:-(p-InitOrder[j].Data);
if(dif==0||temp>start;
cout<<"选择访问方向:0-磁道号递增1-磁道号递减\t";
int dir; cin>>dir;
cout<<"SSTF:"<InitOrder[i].Data)
min = InitOrder[i].Data;
}
int p = start;
for(int k = 0; k< disk; k++)
{
int temp = 0;
for(int j = 0 ; j < disk; j++)
{
if(cdir==0&&p>InitOrder[j].Data||cdir==1&&p0?
p-InitOrder[j].Data:-(p-InitOrder[j].Data);
if(dif==0||temp>start;
cout<<"选择访问方向:0-磁道号递增1-磁道号递减\t";
int dir; cin>>dir;
cout<<"CSSTF:"<InitOrder[i].Data)
{
min = InitOrder[i].Data;
mmin=i;
}
}
int p = start;//p表示上一个访问的磁道号
for(int k = 0; k < disk; k++)
{
int temp = 0;
for(int j = 0 ; j < disk; j++)//查找下一个要访问的磁道
{
if(dir==0&&p>InitOrder[j].Data||dir==1&&p0?
(p-InitOrder[j].Data):(InitOrder[j].Data-p);
if(dif==-1||temp=0?
p-TrackOrder[mmin]:TrackOrder[mmin]-p);
curp = mmin;
}
if(dir==1&&InitOrder[curp].Data==min&&InitOrder[mmax].IsVisited==false)
{
TrackOrder.push_back(max);
InitOrder[mmax].IsVisited = true;
MoveDistance.push_back(p-TrackOrder[mmin]>=0?
p-TrackOrder[mmin]:TrackOrder[mmin]-p);
curp = mmax;
}
p = InitOrder[curp].Data;
dif = -1;
}
}
void Show(int disk)
{
cout<<"被访问的下一个磁道号\t"<<"移动距离"<