操作系统 先来先服务算法(FCFS)、最短寻到时间优先算法(SSTF)、扫描算法(电梯算法,SCAN)、循环扫描算法(CSCAN)
生活随笔
收集整理的這篇文章主要介紹了
操作系统 先来先服务算法(FCFS)、最短寻到时间优先算法(SSTF)、扫描算法(电梯算法,SCAN)、循环扫描算法(CSCAN)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
操作系統 先來先服務算法(FCFS)、最短尋到時間優先算法(SSTF)、掃描算法(電梯算法,SCAN)、循環掃描算法(CSCAN)和N步掃描算法(NStepScan)的程序實現
復制到本地即可運行
#include "stdio.h" #include "stdlib.h" #include "conio.h"void CopyL(int Sour[],int Dist[] ,int x); //數組Sour復制到數組Dist,復制到x個數 void SetDI(int DiscL[]); //隨機生成磁道數 void Print(int Pri[],int x); //打印輸出數組Pri void DelInq(int Sour[],int x,int y); //數組Sour把x位置的數刪除,并把y前面的數向前移動,y后的數保持不變(即會出現2個y) void FCFS(int Han,int DiscL[]); //先來先服務算法(FCFS) void SSTF(int Han,int DiscL[]); //最短尋道時間優先算法(SSTF) int SCAN(int Han,int DiscL[],int x,int y); //掃描算法(SCAN) void CSCAN(int Han,int DiscL[]); //循環掃描算法(CSCAN) void N_Step_SCAN(int Han1,int DiscL[]); //N步掃描算法(NStepScan) void PaiXu(); //尋道長度由低到高排序 void Pri(); int NAll=0; int Best[5][2]; //用作尋道長度由低到高排序時存放的數組 int Limit=0; //輸入尋找的范圍磁道數i int Jage; float Aver=0;int main() {int i;int DiscLine[10]; //聲明準備要生成的隨機磁道號的數組int Hand; //磁道數int Con=1;int n;while(Con==1){Jage=0;printf("\n 請輸入初始的磁道數(0<n<65536):");scanf("%d",&Hand);printf("\n+ 輸入尋找的范圍:");scanf("%d",&Limit);if(Limit>65536){printf("超出范圍!");} else{printf(" ╭═══════════════╮ \n");printf(" ║ 操作系統課程設計 ║ \n");printf(" ╭═════┤ 磁盤調度算法 ├═════╮\n");printf(" ║ ║ ║ ║\n");printf(" ║ ╰═══════════════╯ ║\n");printf(" ║ 1.先來先服務算法(FCFS) ║\n");printf(" ║ ║\n");printf(" ║ 2.最短尋道時間優先算法(SSTF) ║\n");printf(" ║ ║\n");printf(" ║ 3.掃描算法(SCAN) ║\n");printf(" ║ ║\n");printf(" ║ 4.循環掃描算法(CSCAN) ║\n");printf(" ║ ║\n");printf(" ║ 5.N步掃描算法(NStepScan) ║\n");printf(" ║ ║\n");printf(" ║ 6.各類算法的比較 ║\n");printf(" ║ ║\n");printf(" ║ ║\n");printf(" ║ ╭───────────────────────╮ ║\n");printf(" ╰═┤ 請輸入你的選擇的算法(輸入0離開) ├═╯\n");printf(" ╰───────────────────────╯\n");scanf("%d",&n);if(n==0) exit(0);printf("\n");switch(n){case 1:SetDI(DiscLine); //隨機生成磁道數FCFS(Hand,DiscLine); //先來先服務算法(FCFS)break;case 2:SetDI(DiscLine); //隨機生成磁道數SSTF(Hand,DiscLine); //最短尋道時間優先算法(SSTF)break;case 3:SetDI(DiscLine); //隨機生成磁道數SCAN(Hand,DiscLine,0,9); //掃描算法(SCAN)break;case 4:SetDI(DiscLine); //隨機生成磁道數CSCAN(Hand,DiscLine); //循環掃描算法(CSCAN) break;case 5:SetDI(DiscLine); //隨機生成磁道數N_Step_SCAN(Hand,DiscLine); //N步掃描算法(NStepScan)break;case 6:SetDI(DiscLine); //隨機生成磁道數FCFS(Hand,DiscLine); //先來先服務算法(FCFS)SSTF(Hand,DiscLine); //最短尋道時間優先算法(SSTF)SCAN(Hand,DiscLine,0,9); //掃描算法(SCAN)CSCAN(Hand,DiscLine); //循環掃描算法(CSCAN)N_Step_SCAN(Hand,DiscLine); //N步掃描算法(NStepScan)PaiXu(); //尋道長度由低到高排序printf("\n\n+ 尋道長度由低到高排序:"); for(i=0;i<5;i++){printf("%4d ",Best[i][0]);}break;}printf("\n\n+ 是否繼續(按0結束,按1繼續)?");scanf("%5d",&Con);}} }//數組Sour復制到數組Dist,復制到x個數 void CopyL(int Sour[],int Dist[] ,int x) {int i;for(i=0;i<=x;i++){Dist[i]=Sour[i];} } //打印輸出數組Pri void Print(int Pri[],int x) {int i;for(i=0;i<=x;i++){printf("%5d",Pri[i]);} } //隨機生成磁道數 void SetDI(int DiscL[]) {int i;for(i=0;i<=9;i++){DiscL[i]=rand()%Limit;//隨機生成10個磁道號}printf("+ 需要尋找的磁道號:");Print(DiscL,9); //輸出隨機生成的磁道號printf("\n"); } //數組Sour把x位置的數刪除,并把y前面的數向前移動,y后的數保持不變(即會出現2個y) void DelInq(int Sour[],int x,int y) {int i;for(i=x;i<y;i++){ Sour[i]=Sour[i+1];x++;} } //先來先服務算法(FCFS) void FCFS(int Han,int DiscL[]) {int RLine[10]; //將隨機生成的磁道數數組Discl[]復制給數組RLine[]int i,k,All,Temp; //Temp是計算移動的磁道距離的臨時變量All=0; //統計全部的磁道數變量k=9; //限定10個的磁道數CopyL(DiscL,RLine,9); //復制磁道號到臨時數組RLineprintf("\n+ 按照FCFS算法磁道的訪問順序為:");All=Han-RLine[0];for(i=0;i<=9;i++){Temp=RLine[0]-RLine[1];//求出移動磁道數,前一個磁道數減去后一個磁道數得出臨時的移動距離if(Temp<0) Temp=(-Temp);//移動磁道數為負數時,算出相反數作為移動磁道數printf("%5d",RLine[0]);All=Temp+All;//求全部磁道數的總和 DelInq(RLine,0,k);//每個磁道數向前移動一位k--;}Best[Jage][1]=All;//Best[][1]存放移動磁道數 Best[Jage][0]=1; //Best[][0]存放算法的序號為:1 Jage++;//排序的序號加1Aver=((float) All)/10;//求平均尋道次數 printf("\n+ 移動磁道數:<%5d> ",All);printf("\n+ 平均尋道長度:*%0.2f* ",Aver); } //最短尋道時間優先算法(SSTF) void SSTF(int Han,int DiscL[]) {int i,j,k,h,All;int Temp; //Temp是計算移動的磁道距離的臨時變量int RLine[10]; //將隨機生成的磁道數數組Discl[]復制給數組RLine[]int Min;All=0; //統計全部的磁道數變量k=9; //限定10個的磁道數CopyL(DiscL,RLine,9); //復制磁道號到臨時數組RLineprintf("\n+ 按照SSTF算法磁道的訪問順序為:");for(i=0;i<=9;i++){Min=64000;for(j=0;j<=k;j++) //內循環尋找與當前磁道號最短尋道的時間的磁道號 {if(RLine[j]>Han) //如果第一個隨機生成的磁道號大于當前的磁道號,執行下一句Temp=RLine[j]-Han; //求出臨時的移動距離elseTemp=Han-RLine[j]; //求出臨時的移動距離if(Temp<Min) //如果每求出一次的移動距離小于Min,執行下一句{Min=Temp; //Temp臨時值賦予Minh=j; //把最近當前磁道號的數組下標賦予h}}All=All+Min; //統計一共移動的距離printf("%5d",RLine[h]);Han=RLine[h]; DelInq(RLine,h,k); //每個磁道數向前移動一位k--;}Best[Jage][1]=All;//Best[][1]存放移動磁道數 Best[Jage][0]=2;//Best[][0]存放算法的序號為:2Jage++;//排序序號加1Aver=((float)All)/10;//求平均尋道次數 printf("\n+ 移動磁道數:<%5d> ",All);printf("\n+ 平均尋道長度:*%0.2f* ",Aver); } //掃描算法(SCAN) int SCAN(int Han,int DiscL[],int x,int y) {int j,n,k,h,m,All;int t=0;int Temp;int Min;int RLine[10]; //將隨機生成的磁道數數組Discl[]復制給數組RLine[] int Order;Order=1;k=y;m=2; //控制while語句的執行,即是一定要使當前磁道向內向外都要掃描到All=0; //統計全部的磁道數變量CopyL(DiscL,RLine,9); //復制磁道號到臨時數組RLineprintf("\n+ 按照SCAN算法磁道的訪問順序為:");Min=64000;for(j=x;j<=y;j++) //尋找與當前磁道號最短尋道的時間的磁道號{if(RLine[j]>Han) //如果第一個隨機生成的磁道號大于當前的磁道號,執行下一句Temp=RLine[j]-Han; //求出臨時的移動距離elseTemp=Han-RLine[j]; //求出臨時的移動距離if(Temp<Min){Min=Temp; //Temp臨時值賦予Minh=j; //把最近當前磁道號的數組下標賦予h}}All=All+Min; printf("%5d",RLine[h]);if(RLine[h]>=Han){ //判斷磁道的移動方向,即是由里向外還是由外向里Order=0;t=1;}Han=RLine[h];DelInq(RLine,h,k); //每個磁道數向前移動一位k--;while(m>0) {if(Order==1) //order是判斷磁盤掃描的方向標簽,order是1的話,磁道向內移動{for(j=x;j<=y;j++) {h=-1;Min=64000;for(n=x;n<=k;n++) //判斷離當前磁道最近的磁道號{if(RLine[n]<=Han){Temp=Han-RLine[n];if(Temp<Min){Min=Temp; //Temp臨時值賦予Minh=n; //把最近當前磁道號的數組下標賦予h}}}if(h!=-1){All=All+Min; //疊加移動距離printf("%5d",RLine[h]);Han=RLine[h]; //最近的磁道號作為當前磁道DelInq(RLine,h,k);k--;}}Order=0; //當完成向內的移動,order賦予0,執行else語句,使磁道向外移動m--; //向內完成一次,m減一次,保證while循環執行兩次}else //order是0的話,磁道向外移動{for(j=x;j<=y;j++){h=-1;Min=64000;for(n=x;n<=k;n++) //判斷離當前磁道最近的磁道號{if(RLine[n]>=Han){Temp=RLine[n]-Han;if(Temp<Min){Min=Temp; //Temp臨時值賦予Minh=n; //把最近當前磁道號的數組下標賦予h}}}if(h!=-1){All=All+Min; //疊加移動距離printf("%5d",RLine[h]);Han=RLine[h]; //最近的磁道號作為當前磁道DelInq(RLine,h,k);k--;}}Order=1; //當完成向內的移動,order賦予0,執行else語句,使磁道向外移動m--; //向內完成一次,m減一次,保證while循環執行兩次}}NAll=NAll+All;if((y-x)>5){Best[Jage][1]=All;//Best[][1]存放移動磁道數 Best[Jage][0]=3;//Best[][0]存放算法的序號為:3Jage++;//排序序號加1Aver=((float)All)/10;//求平均尋道次數 printf("\n+ 移動磁道數:<%5d> ",All);printf("\n+ 平均尋道長度:*%0.2f* ",Aver);}if(t==1) printf("\n+ 磁道由內向外移動");else printf("\n+ 磁道由外向內移動");return(Han); } //循環掃描算法(CSCAN) void CSCAN(int Han,int DiscL[]) {int j,h,n,Temp,m,k,All,Last,i;int RLine[10]; //將隨機生成的磁道數數組Discl[]復制給數組RLine[] int Min;int tmp=0;m=2;k=9;All=0; //統計全部的磁道數變量Last=Han;CopyL(DiscL,RLine,9); //復制磁道號到臨時數組RLineprintf("\n+ 按照CSCAN算法磁道的訪問順序為:");while(k>=0){for(j=0;j<=9;j++) //從當前磁道號開始,由內向外搜索離當前磁道最近的磁道號{h=-1;Min=64000;for(n=0;n<=k;n++){if(RLine[n]>=Han){Temp=RLine[n]-Han;if(Temp<Min){Min=Temp;h=n;}}}if(h!=-1){All=All+Min; //統計一共移動的距離printf("%5d",RLine[h]);Han=RLine[h];Last=RLine[h];DelInq(RLine,h,k);k--;}}if(k>=0){ tmp=RLine[0];for(i=0;i<k;i++)//算出剩下磁道號的最小值{ if(tmp>RLine[i]) tmp=RLine[i];}Han=tmp;//把最小的磁道號賦給HanTemp=Last-tmp;//求出最大磁道號和最小磁道號的距離差All=All+Temp;}}Best[Jage][1]=All;//Best[][1]存放移動磁道數 Best[Jage][0]=4;//Best[][0]存放算法的序號為:4Jage++;//排序序號加1Aver=((float)All)/10;//求平均尋道次數 printf("\n+ 移動磁道數:<%5d> ",All);printf("\n+ 平均尋道長度:*%0.2f* ",Aver); } //N步掃描算法(NStepScan) void N_Step_SCAN(int Han1,int DiscL[]) {int i,m,k;int RLine1[10];NAll=0;m=2;k=9; //限定10個的磁道數 i=-1;CopyL(DiscL,RLine1,9); //復制磁道號到臨時數組RLineprintf("\n+ 按照N_Step_SCAN算法磁道的訪問順序為:");for(m=0;m<2;m++) //由于限定10磁道數,將10個磁道數分為兩組,每組5個磁道數,每個組按照SCAN算法執行,該循環循環2次{Han1=SCAN(Han1,RLine1,i+1,i+5);i=i+5;}Best[Jage][1]=NAll;//Best[][1]存放移動磁道數 Best[Jage][0]=5;//Best[][0]存放算法的序號為:5Aver=((float)NAll)/10;//求平均尋道次數 printf("\n+ 移動磁道數:<%5d> ",NAll);printf("\n+ 平均尋道長度:*%0.2f* ",Aver); } //尋道長度由低到高排序 void PaiXu() {int i,j,Temp;for(i=0;i<5;i++){for(j=0;j<4;j++){if(Best[j][1]>Best[j+1][1]) //如果前一個算法的移動磁道距離大于后一個移動磁道數,執行下面語句{Temp=Best[j+1][1]; //從這起下三行執行冒泡法將移動距離大小排序,排完后則執行每個算法的排序Best[j+1][1]=Best[j][1];Best[j][1]=Temp;Temp=Best[j+1][0]; //將每個算法的序號用冒泡法排序Best[j+1][0]=Best[j][0];Best[j][0]=Temp;}}} }總結
以上是生活随笔為你收集整理的操作系统 先来先服务算法(FCFS)、最短寻到时间优先算法(SSTF)、扫描算法(电梯算法,SCAN)、循环扫描算法(CSCAN)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试官问我圆角边框,我交出了满分的答卷!
- 下一篇: CSS过渡属性transitions详细