磁碟排程演算法的C++實現(FCFS、SSTF、SCAN、CSCAN、NStepSCAN)
阿新 • • 發佈:2018-12-23
Description
本實驗是模擬作業系統的磁碟尋道方式,運用磁碟訪問順序的不同來設計磁碟的排程演算法。
- 實現的磁碟排程演算法有FCFS,SSTF,SCAN,CSCAN和 NStepSCAN演算法。
- 設定開始磁軌號尋道範圍,依據起始掃描磁軌號和最大磁軌號數,隨機產生要進行尋道的磁軌號序列。
- 選擇磁碟排程演算法,顯示該演算法的磁軌訪問順序,計算出移動的磁軌總數和平均尋道總數。按演算法的尋道效率進行排序,並對各演算法的效能進行分析比較
參考程式碼
#include <iostream> #include <random> #include <algorithm> #define element_num 25 using namespace std; int order[element_num]; void Array_reverse(int l,int r,int* array) { double mid=(l+r)/2.0; for(int i=l;i<mid;++i) { array[i]=array[r+l-i]+array[i]; array[r+l-i]=array[i]-array[r+l-i]; array[i]=array[i]-array[r+l-i]; } } void FCFS(int st,int* d,int group_num=element_num) { cout<<endl<<"---------------FCFS--------------"<<endl; double a=0; for(auto x:order) cout<<x<<" "; for(int i=0;i<group_num;++i) {a+=abs(st-*(d+i));st=*(d+i);} cout<<endl<<a<<" "<<a/group_num<<endl; } void SSTF(int st,int* d,int group_num=element_num) { cout<<endl<<"---------------SSTF--------------"<<endl; double a=0; int b=group_num; while(b) { sort(d, d + b, [st](const int &first, const int &second) { return (abs(first - st) > abs(second - st)) ? false : true;}); order[group_num-b--]=*d; a += abs(st - *d); st=*d++; } for(auto x:order) cout<<x<<" "; cout<<endl<<a<<" "<<a/group_num<<endl; } void SCAN_CSCAN(int st,int*d,int group_num=element_num,int cho=1) { double a=0; if(cho==1) cout<<endl<<"---------------SCAN--------------"<<endl; else if(cho==2) cout<<endl<<"--------------CSCAN--------------"<<endl; int min=group_num-1; for(int i=0;i<group_num;++i) if(*(d+i)-st>0) {min=i;break;} Array_reverse(min,group_num-1,d); if(cho!=1) Array_reverse(0,min-1,d); Array_reverse(0,group_num-1,d); std::for_each(d,d+group_num,[](int n){cout<<n<<" ";}); for(int i=0;i<group_num;++i) a+=abs(st-*(d+i)),st=*(d+i); if(cho!=3) cout<<endl<<a<<" "<<a/group_num<<endl; else *order=a; } void NstepSCAN(int st,int* d,int group_num=element_num) { cout<<endl<<"--------------N-StepSCAN--------------"<<endl; cout<<"請輸入佇列的長度N:"<<endl; double A=0; int N,a,b; cin>>N; (group_num%N==0)?a=N,b=N:a=N,b=group_num%N; // cout<<a<<" "<<b<<""<<endl; cout<<a<<" "<<b<<endl; for(int i=0;i!=ceil(group_num/(double)N);++i) if(i==ceil(group_num/N)) SCAN_CSCAN(st,d+a*i,b,3),A+=*order,cout<<"此時移動長度為:"<<A<<endl; else SCAN_CSCAN(st,d+a*i,a,3),A+=*order,cout<<"此時移動長度為:"<<A<<endl; cout<<endl<<A<<" "<<A/group_num<<endl; } int main() { int max,start,disk[element_num],temp[element_num]; cout<<"請輸入最大磁軌號數&&起始磁軌號:"<<endl; cin>>max>>start; uniform_int_distribution<unsigned> u(0,max); default_random_engine e(10);//預設隨機數種子 for(int i=0;i<element_num;++i) disk[i]=u(e),order[i]=disk[i],temp[i]=disk[i],cout<<disk[i]<<" "; FCFS(start,disk); SSTF(start,disk); SCAN_CSCAN(start,disk,element_num,1);//預設往外層,0最裡層 SCAN_CSCAN(start,disk,element_num,2); NstepSCAN(start,temp); return 0; }
優化和改進
程式碼確實非常亂,不該過載的瞎過載,主要是用來強制走出自己的comfort zone,嘗試多用幾種套路來coding。當然是有炫技的成分在裡面,看看就好,大神就別噴程式碼了。