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