磁盤調(diào)度算法(先來先服務(wù)最短尋道優(yōu)先)
磁盤調(diào)度算法(先來先服務(wù)/最短尋道優(yōu)先)#include<stdio.h>#include<stdlib.h>#include<math.h>void FCFS(int a,int m,int now);/先 來先服務(wù)void SSTF(int a,int n,int now);/最 短尋道時(shí)間優(yōu)先void choose(int a,int n);/選擇排序void FCFS(int a,int m,int now) /先來先服務(wù)算法實(shí)現(xiàn)int i,b,sum=0;printf("n磁盤調(diào)度序列:nn");printf("(從d磁道開始)n",now);printf("n");printf("下一個(gè)訪問|移動(dòng)距離n");for(i=0;i<m;i+)b=abs(ai-now); 每次移動(dòng)距離 now=ai; sum=sum+b;printf("->%dt %dn",ai,b);double d=sum*1.0/m;printf("n 平均尋道長度:.2fnn",d);void SSTF(int a,int n,int now)最短尋道時(shí)間優(yōu)先算法實(shí)現(xiàn)int i,k,sum=0,b;choose(a,n);對(duì)磁道序列進(jìn)行排序printf("nn");printf("磁盤調(diào)度序列:nn");printf("(從d 磁道開始)n",now);printf("n");printf("下一個(gè)訪問|移動(dòng)距離n");if(a0>=now)當(dāng)前磁道號(hào)小于請求磁道號(hào)的最小值for(i=0;i<n;i+) b=ai-now; sum+=b; now=ai; printf("->%dt %dn",now,b);else if(an-1<=now) 當(dāng)前磁道號(hào)大于請求磁道號(hào)的最大值 for(i=0;i<n;i+) b=now-an-i-1;sum+=b; now=an-i-1; printf("->%dt %dn",now,b);else if(a0<now&&an-1>now) 當(dāng)前磁道號(hào)介于請求磁道序列的最大與最小之間 for(i=0;i<n;i+)if(ai>=now)k=i;break;/選擇第一個(gè)比當(dāng)前磁道號(hào)大的磁道號(hào)int right=k;int left=k-1;while(left>=0&&right<n)if(now-aleft<=aright-now) /當(dāng)前磁道號(hào)與大于它的近b=now-aleft;sum+=b; now=aleft;printf("->%dt %dn",now,b);left-;else/當(dāng)前磁道號(hào)與小于它的近b=aright-now;sum+=b; now=aright;printf("->%dt %dn",now,b);right+;if(left<0) 磁道序列左邊最小的磁道號(hào)已經(jīng)訪問,轉(zhuǎn)向右邊沒有訪問的for(int j=right;j<n;j+)b=aj-now;sum+=b; now=aj;printf("->%dt %dn",now,b);else if(right=n)/磁道序列右邊最大的磁道號(hào)已經(jīng)訪問,轉(zhuǎn)向左邊沒有訪問的for(int j=left;j>=0;j-)b=now-aj;sum+=b; now=aj;printf("->%dt %dn",now,b);double d=sum*1.0/n;printf("平均尋道長度:.2fnn",d);void choose(int a,int n)選擇排序?qū)崿F(xiàn)int i,k,index,temp;for(k=0;k<n;k+)index=k;for(i=k+1;i<n;i+)if(ai<aindex)index=i;temp=aindex;aindex=ak;ak=temp;printf(-排序之后的磁道序列:n");for(i=0;i<n;i+)printf("%d ",ai);void main()主函數(shù)int i,m,h,now,b,sum=0,a20;printf("輸入磁盤調(diào)度的基本信息n");printf(- 1.磁道請求總數(shù)2.磁道請求序列3.當(dāng)前磁道號(hào)n");printf(" n");printf("1 .需要訪問的磁道總數(shù):");scanf(" %d",&m);printf(-n2.需要訪問的磁道序列:n");for(i=0;i<m;i+)scanf("%d",&ai);printf("n3.輸入當(dāng)前磁道號(hào):");scanf("%d",&now);doprintf("n 磁盤調(diào)度算法nn");printf("*1.先來先服務(wù)(FCFS)*nn");printf("*2.最短尋道時(shí)間優(yōu)先(SSTF)*nn");printf("*0.退出系統(tǒng)*nn");printf(" n");printf(-請選擇算法序號(hào)(0-2): n");scanf("%d",&h);switch(h)case 1: FCFS(a,m,now);break;case 2: SSTF(a,m,now);break;case 0: exit(0);break;default:break;while(h>=0);