磁碟排程演算法C語言實現
阿新 • • 發佈:2018-12-26
最短尋道時間優先(SSTF)演算法。要求訪問的磁軌,與當前磁頭所在的磁軌距離最近,以使每次的尋道時間最短。
掃描排程(SCAN)演算法。該演算法不僅考慮到欲訪問的磁軌與當前磁軌間的距離,更優先考慮的是磁頭當前的移動方向。例如,當磁頭正在自裡向外移動時,SCAN演算法所考慮的下一個訪問物件,應是其欲訪問的磁軌,既在當前磁軌之外,又是距離最近的。這樣自裡向外的訪問,直至再無更外的磁軌需要訪問時,才將磁軌換向自外向裡移動。
#include<iostream> #include<ctime> using namespace std; void SSTF(int a[],int n); void CSCAN(int a[],int n); int main() { int n; //磁軌的個數 int s; //功能號 cout<<"請輸入當前磁軌的個數,按Enter鍵顯示生成的隨機磁軌號:"<<endl; cin>>n; int *a=new int[n];//申請一個整型變數空間,賦初值為n,並定義一個整型指標a指向該地址空間 cout<<"生成的隨機磁軌號為:"; srand((unsigned)time(NULL)); for(int i=0;i<n;i++) { a[i]=(rand()%100)+1; cout<<a[i]<<" "; } cout<<endl; while(1) { cout<<endl; cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl; cout<<" ┃ 磁碟排程演算法功能列表 ┃"<<endl; cout<<" ┠───────────────────────┨"<<endl; cout<<" ┃ 1、最短尋道時間演算法(SSTF) ┃"<<endl; cout<<" ┠───────────────────────┨"<<endl; cout<<" ┃ 2、迴圈掃描演算法(CSCAN) ┃"<<endl; cout<<" ┠───────────────────────┨"<<endl; cout<<" ┃ 0、退出 ┃"<<endl; cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl; cout<<endl; cout<<"請選擇所需功能的前置編號:"; cin>>s; if(s>3) { cout<<"資料輸入有誤!請重新輸入:"<<endl; } else { switch(s){ case 0: exit(0);break ; case 1:SSTF(a, n);break; case 2:CSCAN(a,n);break;} } } return 0; } //最短尋道時間演算法(SSTF) void SSTF(int a[],int n) { int temp; int k=1; int now,l,r; int i,j; double sum=0; //將磁軌號按遞增排序 for(i=0;i<n;i++) for(j=i+1;j<n;j++){ if(a[i]>a[j]){ temp=a[i]; a[i]=a[j]; a[j]=temp; } } cout<<"按遞增順序排好的磁軌顯示為:"<<endl; for(i=0;i<n;i++) { cout<<a[i]<<" ";//輸出排好的磁軌順序 } cout<<endl; cout<<"請輸入當前的磁軌號:"; cin>>now;//確定當前磁頭所在位置 cout<<"磁碟排程順序為:"<<endl; if(a[n-1]<=now){//當前磁頭位置大於最外圍欲訪問磁軌(比如21,90,當前的磁軌為91,順序為91,1) for(i=n-1;i>=0;i--) cout<<a[i]<<" "; sum=now-a[0]; } else if(a[0]>=now)//當前磁頭位置小於最裡欲訪問磁軌(比如21,90,當前的磁軌為91,順序為21,91) { for(i=0;i<n;i++) cout<<a[i]<<" "; sum=a[n-1]-now; } else//不大也不小,在範圍之內 { while(a[k]<now)//確定當前磁軌在已排的序列中的位置 { k++; } l=k-1;//在磁頭位置的前一個欲訪問磁軌 r=k;//磁頭欲訪問磁軌 while((l>=0)&&(r<n)) { if((now-a[l])<=(a[r]-now))//選擇離磁頭近的磁軌 { cout<<a[l]<<" ";//(比如37,44,49,64,84,93,當前的磁軌為65,則排程後的循序為:64(為a[l]),49,44,37,84 93) sum+=now-a[l]; now=a[l]; l=l-1; } else { cout<<a[r]<<" ";//(比如22 26 62 67 88 而當前的磁軌為87,則磁碟排程的順序為88 67 62 23 22 ) sum+=a[r]-now; now=a[r]; r=r+1; } } if(l=-1)//磁頭位置裡側的磁軌已訪問完,這是針對(now-a[l]<a[r]-now的情況) { for(j=r;j<n;j++)//訪問磁頭位置外側的磁軌 { cout<<a[j]<<" "; } sum+=a[n-1]-a[0]; } if(r==n)//磁頭位置外側的磁軌已訪問完,這是針對(else的情況) { for(j=k-1;j>-1;j--) //訪問磁頭位置裡側的磁軌 { cout<<a[j]<<" "; } sum+=a[n-1]-a[0]; } } cout<<endl; cout<<"移動的總道數為:"<<sum<<endl; cout<<"移動的平均道數為:"<<(sum/n)<<endl; } //迴圈掃描演算法(CSCAN) void CSCAN(int a[],int n) { int temp; int now,l,r; int i,j; double sum=0; int k=1; for(i=0;i<n;i++)//對訪問磁軌按由小到大順序排列輸出 for(j=i+1;j<n;j++){ if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } cout<<"按遞增順序排好的磁軌為:"<<endl; for( i=0;i<n;i++) { cout<<a[i]<<" "; } cout<<endl; cout<<"請輸入當前的磁軌號:"; cin>>now;//確定當前磁軌號 if(a[n-1]<=now)//磁頭位置大於最外圍欲訪問磁軌 { for(i=0;i<n;i++) cout<<a[i]<<" "; sum=now-2*a[0]+a[n-1]; } else if(a[0]>=now)//磁頭位置小於最裡欲訪問磁軌 { for(i=0;i<n;i++) cout<<a[i]<<" "; sum=a[n-1]-now; } else //磁頭位置在最裡側磁軌與最外側磁軌之間 { int d; while(a[k]<now) { k++; } l=k-1;//在磁頭位置的前一個欲訪問磁軌 r=k; //磁頭欲訪問磁軌 cout<<"請輸入當前磁頭移動的方向 (0 表示向內 ,1表示向外) : "; cin>>d; //確定磁頭訪問的方向 cout<<"磁碟排程順序為:"; if(d==0||d==1) { if(d==1) //磁頭向外側訪問 { for(j=r;j<n;j++)//先訪問外側磁軌再轉向最裡欲訪問磁軌 { cout<<a[j]<<" "; } for(j=0;j<r;j++) { cout<<a[j]<<" "; } sum=2*a[n-1]-now-2*a[0]+a[l]; } if(d==0) //磁頭向內側訪問 { for(j=r-1;j>=0;j--) { cout<<a[j]<<" "; } for(j=n-1;j>=r;j--) { cout<<a[j]<<" "; } sum=2*a[n-1]-2*a[0]+now-a[r]; } } else cout<<"請輸入0或1!"; } cout<<endl; cout<<"移動的總道數為:"<<sum<<endl; cout<<"移動的平均道數為:"<<(sum/n)<<endl; }