磁道调度算法
四种磁盘调度算法FCFS,SSTF,SCAN,CSCAN的基本思想在这就不多说了。
下面直接附上代码实现过程:
#include<iostream> #include<cmath> using namespace std;
typedef struct Disk_Schedule { int NextTrack; int MovedTrack; }Disk;
Disk *Track; float SumMovedTrack=0; int TrackNum; int NowTrack;
void Input() { cout<<"请输入当前的磁道号:"; cin>>NowTrack; cout<<"请输入进程要访问的磁盘数:"; cin>>TrackNum; Track=new Disk[TrackNum]; cout<<"请依次输入进程要访问的磁盘号:"; for(int i=0;i<TrackNum;i++) { cin>>Track[i].NextTrack; } cout<<"输入完毕!"<<endl<<endl; }
void Output() { cout<<"输出磁道访问信息:"<<endl; cout<<"下一个被访问磁道"<<"\t"<<"移动的磁道数"<<endl; for(int i=0;i<TrackNum;i++) { cout<<"\t"<<Track[i].NextTrack<<"\t\t"<<Track[i].MovedTrack<<endl; } float SumMovedTrack=0; for(i=0;i<TrackNum;i++) { SumMovedTrack+=Track[i].MovedTrack; } cout<<"磁头移动总距离:"<<SumMovedTrack<<endl; cout<<"平均磁盘移动长度:"<<SumMovedTrack/TrackNum<<endl; cout<<"输出完毕!"<<endl<<endl; }
void FCFS() { Input(); Track[0].MovedTrack=abs(NowTrack-Track[0].NextTrack); for(int i=1;i<TrackNum;i++) { Track[i].MovedTrack=abs(Track[i-1].NextTrack-Track[i].NextTrack); } cout<<"FCFS调度算法:"<<endl; Output(); }
void SSTF() { Input(); int NewTrack[50],Moved[50]; int i,j,k,t,n,m=0,temp;
for(i=0;i<TrackNum;i++) { for(j=m;j<TrackNum;j++) Moved[j]=abs(Track[j].NextTrack-NowTrack); n=1000; for(k=m;k<TrackNum;k++) { if(Moved[k]<n) { n=Moved[k]; t=k; } } NewTrack[m]=Track[t].NextTrack; Track[m].MovedTrack=Moved[t]; NowTrack=Track[t].NextTrack;
temp=Track[m].NextTrack; Track[m].NextTrack=Track[t].NextTrack; Track[t].NextTrack=temp; m++; } for(i=0;i<TrackNum;i++) Track[i].NextTrack=NewTrack[i]; cout<<"SSTF调度算法:"<<endl; Output(); }
void SCAN() { int i,j,key,index=0; int NewTrack[50]; Input(); for (i=1; i < TrackNum; i++) { key= Track[i].NextTrack; for(j=i-1;j >=0 && key > Track[j].NextTrack;j--) { Track[j + 1].NextTrack = Track[j].NextTrack; } Track[j+1].NextTrack = key; } for(i=0;i<TrackNum;i++) { if(Track[i].NextTrack>NowTrack) { index++; } else break; } for(i=0;i<index;i++) NewTrack[i]=Track[index-i-1].NextTrack; for(i=index;i<TrackNum;i++) NewTrack[i]=Track[i].NextTrack; for(i=0;i<TrackNum;i++) Track[i].NextTrack=NewTrack[i]; Track[0].MovedTrack=abs(NowTrack-Track[0].NextTrack); for(i=1;i<TrackNum;i++) { Track[i].MovedTrack=abs(Track[i-1].NextTrack-Track[i].NextTrack); } cout<<"SCAN调度算法:"<<endl; Output(); }
void CSCAN() { int i,j,key,index=0; int NewTrack[50]; Input(); for (i=1; i < TrackNum; i++) { key= Track[i].NextTrack; for(j=i-1;j >=0 && key > Track[j].NextTrack;j--) { Track[j + 1].NextTrack = Track[j].NextTrack; } Track[j+1].NextTrack = key; } for(i=0;i<TrackNum;i++) { if(Track[i].NextTrack>NowTrack) { index++; } else break; } for(i=0;i<index;i++) NewTrack[i]=Track[index-1-i].NextTrack;
for(i=index;i<TrackNum;i++) NewTrack[i]=Track[TrackNum+(index-1)-i].NextTrack; for(i=0;i<TrackNum;i++) Track[i].NextTrack=NewTrack[i]; Track[0].MovedTrack=abs(NowTrack-Track[0].NextTrack); for(i=1;i<TrackNum;i++) { Track[i].MovedTrack=abs(Track[i-1].NextTrack-Track[i].NextTrack); } cout<<"CSCAN调度算法:"<<endl; Output(); }
void Menu() { cout<<"*************************磁盘调度系统*******************************"<<endl; cout<<"\t"<<endl; cout<<"\t┣ 0:退出系统 ┫"<<endl; cout<<"\t┣ 1:FCFS调度算法 ┫"<<endl; cout<<"\t┣ 2:SSTF调度算法 ┫"<<endl; cout<<"\t┣ 3:SCAN调度算法 ┫"<<endl; cout<<"\t┣ 4:CSCAN调度算法 ┫"<<endl; cout<<"\t"<<endl; }
int main() { int choice; choice=-1; while(choice!=0) { Menu(); cout<<"请输入你的选择:"; cin>>choice; switch(choice) { case 1: FCFS();break; case 2: SSTF();break; case 3: SCAN();break; case 4: CSCAN();break; } } return 0; }
|
当然上述算法还有一些方面没有考虑到,不满足所有情况。