logo资料库

磁盘调度算法.docx

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
//随机生成磁道数 //打印输出数组 Pri #include "stdafx.h" #include "stdio.h" #include "stdlib.h" void CopyL(int Sour[],int Dist[] ,int x); //数组 Sour 复制到数组 Dist,复制到 x 个数 void SetDI(int DiscL[]); void Print(int Pri[],int x); void DelInq(int Sour[],int x,int y); y 后的数保持不变(即会出现 2 个 y) void FCFS(int Han,int DiscL[]); void SSTF(int Han,int DiscL[]); int SCAN(int Han,int DiscL[],int x,int y); void CSCAN(int Han,int DiscL[]); void N_Step_SCAN(int Han1,int DiscL[]); void PaiXu(); //寻道长度由低到高排序 void Pri(); int NAll=0; int Best[5][2]; //用作寻道长度由低到高排序时存放的数组 int Limit=0; //输入寻找的范围磁道数 i int Jage; float Aver=0; //先来先服务算法(FCFS) //最短寻道时间优先算法(SSTF) //扫描算法(SCAN) //循环扫描算法(CSCAN) //数组 Sour 把 x 位置的数删除,并把 y 前面的数向前移动, //N 步扫描算法(NStepScan) int main() { //声明准备要生成的随机磁道号的数组 //磁道数 int i; int DiscLine[10]; int Hand; int Con=1; int n; while(Con==1) { Jage=0; printf(" 请输入初始的磁道数(065536){ printf("超出范围!"); } else{ printf(" printf(" \n"); \n"); ╭ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ╮ ║ 操 作 系 统 课 程 实 验 ║ printf(" ╭═════┤ 磁盘调度算法 ├═════╮
\n"); \n"); \n"); \n"); \n"); \n"); \n"); \n"); \n"); \n"); \n"); \n"); \n"); \n"); \n"); printf(" ║ ║ ║ ╰═══════════════╯ 1.先来先服务算法(FCFS) 2.最短寻道时间优先算法(SSTF) 3.扫描算法(SCAN) 4.循环扫描算法(CSCAN) printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ printf(" ║ ╭───────────────────────╮ ║ printf(" ╰═┤ 请输入你的选择的算法(输入 0 离开) ├═╯ printf(" ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯ scanf("%d",&n); if(n==0) exit(0); printf(" "); 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); break; //扫描算法(SCAN) case 4: //随机生成磁道数 SetDI(DiscLine); CSCAN(Hand,DiscLine); //循环扫描算法(CSCAN) break; } printf(" + 是否继续(按 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 ",All);printf("\n"); printf(" + 平均寻道长度:*%0.2f* \n",Aver);printf("\n"); } //冒泡排序 int* Bubble(int pArr[],int nFirst,int nEnd) {
int nTemp=0; for(int i=nFirst;ipArr[j]) { nTemp=pArr[i]; pArr[i]=pArr[j]; pArr[j]=nTemp; } } } return pArr; } //最短寻道时间优先算法(SSTF) void SSTF(int Han,int DiscL[]) { int temp; int k=1,n=10; int l,r; int i,j,all=0; //将磁道号按递增排序 DiscL=Bubble(DiscL,0,10); printf("\n+ 按照 SSTF 算法磁道的访问顺序为::"); //判断标志位 Han 左、右两边的偏移量大小 if(DiscL[n-1]<=Han)//当前磁头位置大于最外围欲访问磁道 { for(i=n-1;i>=0;i--) { printf("%d ",DiscL[i]); } all=Han-DiscL[0]; } else if(DiscL[0]>=Han)//当前磁头位置小于最里欲访问磁道 { for(i=0;i
} all=DiscL[n-1]-Han; } else { while(DiscL[k]=0)&&(r-1;j--) //访问磁头位置里侧的磁道 { } printf("%d ",DiscL[j]); all+=DiscL[n-1]-DiscL[0];
} } } printf("\n + 移动磁道数:<%5d> \n",all); printf(" + 平均寻道长度:*%0.2f* \n",all/10.0); //扫描算法(SCAN) int SCAN(int Han,int DiscL[],int x,int y) { int temp; int k=1,n=10; int l,r; int i,j,all=0; DiscL=Bubble(DiscL,x,y); //printf("按递增顺序排好的磁道为:"); //for( i=0;i=0;i--) printf("%d ",DiscL[i]); all=Han-DiscL[0]; { } else if(DiscL[0]>=Han) //磁头位置小于最里欲访问磁道 { for(i=0;i
scanf("%d",&d); //确定磁头访问的方向 printf("按照 SCAN 算法访问顺序为:"); if(d==0||d==1) { if(d==0) { //磁头向内 for(j=l;j>=0;j--) { printf("%d ",DiscL[j]); } for(j=r;j=0;j--) { printf("%d ",DiscL[j]); } } all=2*DiscL[n-1]-Han-DiscL[0]; } else } printf("请输入 0 或 1!"); printf("\n + 移动磁道数:<%5d> \n",all); printf(" + 平均寻道长度:*%0.2f* \n",all/10.0); return 0; } //循环扫描算法(CSCAN) void CSCAN(int Han,int DiscL[]) { int temp; int l,r; int i,j,all=0;
分享到:
收藏