logo资料库

具有先来先服务算法和最短寻道时间优先算法的磁盘调度算法实现.doc

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
磁盘调度 #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); //打印输出数组 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 请输入初始的磁道数(065536){ printf("超出范围!"); } else{ 操作系统课程设计 printf(" printf(" 磁盘调度算法 ║ ║ ╰═══════════════╯ 1.先来先服务算法(FCFS) ╭═══════════════╮ ║ printf(" ╭═════┤ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ printf(" ║ 4.循环扫描算法(CSCAN) 3.扫描算法(SCAN) 6.各类算法的比较 5.N 步扫描算法(NStepScan) 2.最短寻道时间优先算法(SSTF) ║\n"); \n"); ║ \n"); ├═════╮\n"); ║\n"); ║\n"); ║\n"); ║\n"); ║\n"); ║\n"); ║\n"); ║\n"); ║\n"); ║\n"); ║\n"); ║\n"); printf(" ║ printf(" ║ printf(" ║ ╭───────────────────────╮ ║\n"); printf(" ╰═┤ 请输入你的选择的算法(输入 0 离开) ║\n"); ║\n"); ├═╯\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
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++;//排序的序号加 1 Aver=((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]; int Min; All=0; //统计全部的磁道数变量 k=9; //限定 10 个的磁道数 CopyL(DiscL,RLine,9); //复制磁道号到临时数组 RLine //将随机生成的磁道数数组 Discl[]复制给数组 RLine[] printf("\n+ 按照 SSTF 算法磁道的访问顺序为:"); for(i=0;i<=9;i++) { Min=64000;
for(j=0;j<=k;j++) //内循环寻找与当前磁道号最短寻道的时间的磁道号 { if(RLine[j]>Han) //如果第一个随机生成的磁道号大于当前的磁道号,执行下 一句 Temp=RLine[j]-Han; //求出临时的移动距离 else Temp=Han-RLine[j]; //求出临时的移动距离 if(Temp ",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); //复制磁道号到临时数组 RLine printf("\n+ 按照 SCAN 算法磁道的访问顺序为:"); Min=64000; for(j=x;j<=y;j++) //寻找与当前磁道号最短寻道的时间的磁道号 { if(RLine[j]>Han) //如果第一个随机生成的磁道号大于当前的磁道号,执行下 一句 Temp=RLine[j]-Han; //求出临时的移动距离 else Temp=Han-RLine[j]; //求出临时的移动距离 if(Temp=Han){ //判断磁道的移动方向,即是由里向外还是由外向里 Order=0; t=1; } Han=RLine[h]; DelInq(RLine,h,k); //每个磁道数向前移动一位 k--;
分享到:
收藏