【作業系統】磁碟排程演算法 C++具體實現 (FCFS&SSFT&SCAN&C-SCAN&LOOK&C-LOOK)
阿新 • • 發佈:2018-12-23
先宣告一下全域性變數
int initPosition,maxSize,numTrack;//磁頭所在位置,磁碟所能盛放的最大磁軌數目,要訪問的磁軌數
int cost;//磁頭總移動距離
vector<int> Track;//要訪問的磁軌們
vector<int> Result;//整理好的訪問磁軌的順序
vector<int>sorted_Track;//把要訪問 磁軌順序從小到大整理好
1.FCFS First Come First Sever 先來先服務
示例:
程式碼思路:先來先服務
void FCFS(){ Result.clear(); cost=abs(Track[0]-initPosition); for (int i=0;i<Track.size()-1;i++){ cost=cost+abs(Track[i+1]-Track[i]); } Result=Track; cout<<"FCFS"<<endl; Print_Results();//列印結果的 }
2. SSTF shortest seek time first 最短訪問時間優先
就是在我所有的要訪問的磁道里,我先訪問理我目前位置最近的。
示例:
程式碼思路:
先從大到小排序,在排好序了的要訪問的佇列裡,先找離自己最近的,訪問之後,再找左右兩個位置裡離自己最近的位置。
程式碼實現:
1.排序
2.找到裡自己最近的一個,push入Result
3.從該節點開始,與左、右 位置進行做差對比。
if左邊不存在或者右邊不存在了,就把剩下整個排序佇列push進result裡
void SSTF(){ Result.clear(); vector<int> sorted_Track; sorted_Track.push_back(Track[0]); int tag=0; for(int i=1;i<Track.size();i++){ tag=0; for(int j=0;j<sorted_Track.size();j++){ if(Track[i]<sorted_Track[j]){ sorted_Track.insert(sorted_Track.begin()+j,Track[i]); tag=1; break; } } if(tag==0){ sorted_Track.push_back(Track[i]); } } int min=maxSize; int position=0; for(int i=0;i<sorted_Track.size();i++){ if(abs(sorted_Track[i]-initPosition)<min){ min=abs(sorted_Track[i]-initPosition); position=i; } } int temp1; int temp2; while(sorted_Track.size()!=0){ if(position!=0&&position!=sorted_Track.size()-1){ temp1=abs(sorted_Track[position-1]-sorted_Track[position]); temp2=abs(sorted_Track[position+1]-sorted_Track[position]); if(temp1<=temp2){ Result.push_back(sorted_Track[position]); sorted_Track.erase(sorted_Track.begin()+position); position=position-1; }else{ Result.push_back(sorted_Track[position]); sorted_Track.erase(sorted_Track.begin()+position); } }else if(position==0){ for(int k=0;k<sorted_Track.size();k++){ Result.push_back(sorted_Track[k]); } sorted_Track.clear(); }else if(position==sorted_Track.size()-1){ for(int k=sorted_Track.size()-1;k>=0;k--){ Result.push_back(sorted_Track[k]); } sorted_Track.clear(); } } calculate();//用來算cost的 cout<<"SSTF"<<endl; Print_Results(); }
3. SCAN aka Elevator Algorithm aka電梯演算法
磁頭選定一個方向,會一直朝那個方向移動,直到那個方向再沒有磁軌。之後再反方向順序移動。一般是從外往裡掃,(從大往小),這裡是規定掃到0.
例子:
程式碼示例:
void SCAN(){ Result.clear(); cost=0; sort_algo();//用來求sorted_Track的,排序從小到大 int position=0; for(int i=0;i<sorted_Track.size();i++){ if(sorted_Track[i]>initPosition){ if(i>=1){ position=i-1; }else{ position=0; } break; } } for(int i=position;i>=0;i--){ Result.push_back(sorted_Track[i]); } Result.push_back(0); for(int i=position+1;i<sorted_Track.size();i++){ Result.push_back(sorted_Track[i]); } calculate(); cout<<"SCAN"<<endl; Print_Results(); }
4. C-SCAN Restricts scanning to one direction only 僅限制掃描到一個方向
一直朝著一個方向走,比如從某個位置走到0,再一下子訪問最後一個,再從外往裡掃掃到完成全部的磁軌(不需要回到原來的位置)。
示例:
程式碼:
void CSCAN(){
Result.clear();
cost=0;
int position=0;
for(int i=0;i<sorted_Track.size();i++){
if(sorted_Track[i]>initPosition){
if(i>=1){
position=i-1;
}else{
position=0;
}
break;
}
}
for(int i=position;i>=0;i--){
Result.push_back(sorted_Track[i]);
}
Result.push_back(0);
Result.push_back(maxSize-1);
for(int i=sorted_Track.size()-1;i>position;i--){
Result.push_back(sorted_Track[i]);
}
cost=initPosition-0;
cost=cost+maxSize-1-sorted_Track[position+1];
cout<<"C-SCAN"<<endl;
Print_Results();
}
5. LOOK SCAN的增強版
朝裡(0)掃,掃到頭再返回方向,與SCAN不同的是它這次不用非得到0,到最小的那個需求就可以了。
程式碼其實就比SCAN少一行,Result沒有Push進0:
void LOOK(){
Result.clear();
cost=0;
int position=0;
for(int i=0;i<sorted_Track.size();i++){
if(sorted_Track[i]>initPosition){
if(i>=1){
position=i-1;
}else{
position=0;
}
break;
}
}
for(int i=position;i>=0;i--){
Result.push_back(sorted_Track[i]);
}
for(int i=position+1;i<sorted_Track.size();i++){
Result.push_back(sorted_Track[i]);
}
cost=initPosition+sorted_Track[sorted_Track.size()-1]-sorted_Track[0]-sorted_Track[0];
cout<<"LOOK"<<endl;
Print_Results();
}
6. C-LOOK C-SCAN的增強版
堅持同一個方向往裡掃。
與LOOK對於SCAN的改動相同,也是沒有到0,也不用從最後來,第二次掃描從最後一個需求開始就好;
示例:
程式碼:
void CLOOK(){
Result.clear();
cost=0;
int position=0;
for(int i=0;i<sorted_Track.size();i++){
if(sorted_Track[i]>initPosition){
if(i>=1){
position=i-1;
}else{
position=0;
}
break;
}
}
for(int i=position;i>=0;i--){
Result.push_back(sorted_Track[i]);
}
for(int i=sorted_Track.size()-1;i>position;i--){
Result.push_back(sorted_Track[i]);
}
cost=initPosition-sorted_Track[0];
cost=cost+sorted_Track[sorted_Track.size()-1]-sorted_Track[position+1];
cout<<"C-LOOK"<<endl;
Print_Results();
}