1、姓名 学号 专业班级 实验项目 实验三:磁盘调度算法的实现课程名称 操作系统 课程代码 0668036实验时间2011 年 11 月 06 日 2011 年 11 月 09 日 2011 年 12 月 13 日 2011 年 12 月 16 日实验地点 软件实验室 7-215批改意见 成绩教师签字: 【实验环境】Windows 操作系统环境下的个人微机【实验目的】了解操作系统磁盘调度的基本概念,磁盘调度程序的功能,常用的磁盘调度算法。【实验要求】学生应正确地设计有关的数据结构与各个功能模块,画出程序的流程图,编写程序,程序执行结果应正确。【实验内容】1) 本实验是模拟操作系统的磁盘寻道方式,运
2、用磁盘访问顺序的不同来设计磁盘的调度算法。2) 实现的磁盘调度算法有 FCFS,SSTF,SCAN,CSCAN 和 NStepSCAN 算法。3) 设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。4) 选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。按算法的寻道效率进行排序,并对各算法的性能进行分析比较。【实验原理】1) FCFS这是一种最简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。2) SSTF该算法选择这样的进程:其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。3) SCAN该
3、算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN 算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。4) CSCANCSCAN 算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问的磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。5) NStepSCANN 步 SCAN 算法是将磁盘请求队列分成若干个长度为 N 的子队列,磁盘调度将按FCFS 算法依次处
4、理这些子队列。而每处理一个队列时又是按 SCAN 算法,对一个队列处理完后,再处理其他队列。【实验步骤、过程】1、程序主要流程(1)手动输入当前的磁道号,该磁道号在0 “,All);printf(“n 平均寻道长度:*%0.2f* “,Aver);4) SSTF/最短寻道时间优先算法(SSTF)void SSTF(int Han,int DiscL) int i,j,k,h,All;int Temp; /Temp 是计算移动的磁道距离的临时变量 int RLine10; /将随机生成的磁道数数组 Discl复制给数组 RLine int Min; All=0; /统计全部的磁道数变量 k=9;
5、 /限定 10 个的磁道数 CopyL(DiscL,RLine,9); /复制磁道号到临时数组 RLine printf(“n 按照 SSTF 算法磁道的访问顺序为:“);for(i=0;iHan) /如果第一个随机生成的磁道号大于当前的磁道号,执行下一句 Temp=RLinej-Han; /求出临时的移动距离 else Temp=Han-RLinej; /求出临时的移动距离 if(Temp “,All);printf(“n 平均寻道长度:*%0.2f* “,Aver);5) SCAN/扫描算法(SCAN)int SCAN(int Han,int DiscL,int x,int y) int
6、j,n,k,h,m,All; int t=0; int Temp; int Min; int RLine10; /将随机生成的磁道数数组 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;jHan) /如果第一个随机生成的磁道号大于当前的磁道号,执行下一句 Te
7、mp=RLinej-Han; /求出临时的移动距离 else Temp=Han-RLinej; /求出临时的移动距离 if(Temp=Han) /判断磁道的移动方向,即是由里向外还是由外向里 Order=0; t=1; Han=RLineh;DelInq(RLine,h,k); /每个磁道数向前移动一位k-;while(m0) if(Order=1) /order 是判断磁盘扫描的方向标签,order 是 1 的话,磁道向内移动 for(j=x;j=Han) Temp=RLinen-Han; if(Temp5) BestJage1=All;/Best1存放移动磁道数 BestJage0=3;/
8、Best0存放算法的序号为:3 Jage+;/排序序号加 1 Aver=(float)All)/10;/求平均寻道次数 printf(“n 移动磁道数: “,All); printf(“n 平均寻道长度:*%0.2f* “,Aver); if(t=1) printf(“n 磁道由内向外移动“);else printf(“n 磁道由外向内移动“); return(Han);6) CSCAN/循环扫描算法(CSCAN)void CSCAN(int Han,int DiscL)int j,h,n,Temp,m,k,All,Last,i;int RLine10; /将随机生成的磁道数数组 Discl复
9、制给数组 RLine int Min; int tmp=0; m=2; k=9; All=0; /统计全部的磁道数变量 Last=Han; CopyL(DiscL,RLine,9); /复制磁道号到临时数组 RLine printf(“n 按照 CSCAN 算法磁道的访问顺序为:“); while(k=0) for(j=0;j=Han) Temp=RLinen-Han; if(Temp=0) tmp=RLine0; for(i=0;iRLinei) tmp=RLinei; Han=tmp;/把最小的磁道号赋给 Han Temp=Last-tmp;/求出最大磁道号和最小磁道号的距离差 All=A
10、ll+Temp; BestJage1=All;/Best1存放移动磁道数 BestJage0=4;/Best0存放算法的序号为:4 Jage+;/排序序号加 1 Aver=(float)All)/10;/求平均寻道次数printf(“n 移动磁道数: “,All); printf(“n 平均寻道长度:*%0.2f* “,Aver);7) NStepSCAN/N 步扫描算法(NStepScan)void N_Step_SCAN(int Han1,int DiscL) int i,m,k;int RLine110; NAll=0; m=2; k=9; /限定 10 个磁道数 i=-1; CopyL
11、(DiscL,RLine1,9); /复制磁道号到临时数组 RLine printf(“n 按照 N_Step_SCAN 算法磁道的访问顺序为:“); for(m=0;m “,NAll); printf(“n 平均寻道长度:*%0.2f* “,Aver);8) 按算法的寻道效率进行排序/寻道长度由低到高排序void PaiXu() int i,j,Temp;for(i=0;iBestj+11) /如果前一个算法的移动磁道距离大于后一个移动磁道数,执行下面语句 Temp=Bestj+11; /从这起下三行执行冒泡法将移动距离大小排序,排完后则执行每个算法的排序 Bestj+11=Bestj1;
12、Bestj1=Temp; Temp=Bestj+10; /将每个算法的序号用冒泡法排序 Bestj+10=Bestj0; Bestj0=Temp; 9) 主函数int main() int i; int DiscLine10; /声明准备要生成的随机磁道号的数组 int Hand; /磁道数 int Con=1;int n; while(Con=1) Jage=0; printf(“n 请输入初始的磁道数(065536) printf(“超出范围!“); else printf(“ n“); printf(“ 操作系统课程设计 n“); printf(“ 磁盘调度算法 n“);printf(“
13、 n“); printf(“ n“); printf(“ 1.先来先服务算法(FCFS) n“); printf(“ n“); printf(“ 2.最短寻道时间优先算法(SSTF) n“); printf(“ n“); printf(“ 3.扫描算法(SCAN) n“); printf(“ n“); printf(“ 4.循环扫描算法(CSCAN) n“); printf(“ n“); printf(“ 5.N 步扫描算法(NStepScan) n“); printf(“ n“); printf(“ 6.各类算法的比较 n“); printf(“ n“); printf(“ n“);prin
14、tf(“ n“); printf(“ 请输入你的选择的算法(输入 0 离开) n“); printf(“ n“); scanf(“%d“, 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); /随机生成磁道数 SC
15、AN(Hand,DiscLine,0,9); /扫描算法(SCAN) break; case 4: cout“注:规定磁头由内向外单方向移动。“endl;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); /先来先服务算法(FC
16、FS) SSTF(Hand,DiscLine); /最短寻道时间优先算法(SSTF) SCAN(Hand,DiscLine,0,9); /扫描算法(SCAN) CSCAN(Hand,DiscLine); /循环扫描算法(CSCAN) N_Step_SCAN(Hand,DiscLine); /N 步扫描算法(NStepScan) PaiXu(); /寻道长度由低到高排序 printf(“n 寻道长度由低到高排序:“); for(i=0;i5;i+) printf(“%4d “,Besti0); break; printf(“n 是否继续( 按 0 结束,按 1 继续)?“); scanf(“%5d“, return 0;3、运行结果1) 输入初始磁道数及寻找范围2) 选择 FCFS 算法3) 重新随机生成磁道数,选择 SSTF4) 重新随机生成磁道数,选择 SCAN5) 重新随机生成磁道数,选择 CSCAN6) 重新随机生成磁道数,选择 NStepSCAN7) 对同一磁道序列,按算法的寻道效率进行排序8)退出