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