1、磁盘调度算法的模拟实现课程设计报告淮北师范大学操作系统课程设计磁盘调度算法的模拟实现学 院 计算机科学与技术 专 业计算机科学与技术(师范)学 号学生姓名 指导教师姓名 2015年7月1日引言 2总体设计 错误!未定义书签。3.具体内容 3三、 实验验证 51.结果截图 72.代码分析 6四、 源代码 9五、 总结 3六、 参考资料 3、引言1、 课程设计的目的:操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动 手又动脑,将课本上的理论知识和实际有机的结合起来, 独立分析和解决实际问 题的机会。进一步巩固和复习操作系统的基础知识。培养学生结构化程序、模块化程序设计的方法和能力
2、。提高学生调试程序的技巧和软件设计的能力。提高学生分析问题、解决问题以及综合利用 C语言进行程序设计的 能力。2、 设计内容:设计并实现一个本别利用下列磁盘调度算法进行磁盘调度的模拟 程序。1 、先来先服务耳法 FCFS2、摂短口道时闾优先慕法 SSTF3、 设计要求:1.磁头初始磁道号,序列长度,磁道号序列等数据可从键盘输入,也可从 文件读入。2.最好能实现磁道号序列中磁道号的动态增加。3.磁道访问序列以链表的形式存储4.给出各磁盘调度算法的调度顺序和平均寻道长度二、总体设计1、算法实现1.先来先服务算法(FCFS先来先服务(FCFS调度:按先来后到次序服务,未作优化。最简单的移臂调度算法是
3、“先来先服务”调度算法,这个算法实际上不考虑访问 者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。例如,如 果现在读写磁头正在50号柱面上执行输出操作,而等待访问者依次要访问的柱 面为130、199、32、159、15、148、61、99,那么,当50号柱面上的操作结束 后,移动臂将按请求的先后次序先移到 130号柱面,最后到达99号柱面。采用先来先服务算法决定等待访问者执行输入输出操作的次序时, 移动臂来 回地移动。先来先服务算法花费的寻找时间较长, 所以执行输入输出操作的总时 间也很长。2.短寻道时间优先算法(SSTF最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短
4、的那个 请求先执行的,而不管访问者到来的先后次序。现在仍利用同一个例子来讨论, 现在当50号柱面的操作结束后,应该先处理 61号柱面的请求,然后到达32号 柱面执行操作,随后处理15号柱面请求,后继操作的次序应该是99、130、148、 159、199。采用最短寻找时间优先算法决定等待访问者执行操作的次序时, 读写磁头总共移动了 200多个柱面的距离,与先来先服务、算法比较,大幅度地减少了寻找 时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。 但最短查找时间优先(SSTF调度,FCFS会引起读写头在盘面上的大范围移动, SSTF查找距离磁头最短(也就是查找时间最短)的请求作为
5、下一次服务的对象。 SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖 延(又称饥饿)。先来先服务算法(FCFS流程图:输入磁道号按输入顺序将磁道序列输出求平均寻道长度输出移动的平均磁道数最短寻道时间优先算法(SSTF流程图:尸 1输出排好序的磁道序列L J求平均寻道长度三、总体验证1、数据结构及信号量定义的说明;本系统划分为四个模块:先来先服务算法模块 void FCFS(i nt array,i ntm)、最短寻道时间优先算法模块 void SSTF(int array,int m) 、扫描算法模块 void SCAN(int array,int m) 和循环扫描算法
6、模块: void CSCAN(intarray,i nt m) 。2.先来先服务算法模块:void FCFS(int array,int m)输入磁道号,按先来先服务的策略输出磁盘请求序列, 求平均寻道长度,输出移动平均磁道数。3、 最短寻道时间优先算法模块:void SSTF(i nt array,i nt m)将磁道号用冒泡法从小到大排序,输出排好序的磁道序列,输入当前磁道号, 根据前磁道在已排的序列中的位置, 选择扫描的顺序,求出平均寻道长度,输出 移动的平均磁道数。4、代码分析1、先来先服务算法模块:void FCFS(i nt array,i nt m)主要代码:for(i=0,j=
7、1;jm;i+,j+)sum+=abs(arrayj-arrayi);ave=(float)(sum)/(float)(m);2最短寻道时间优先算法模块:void SSTF(i nt array,i nt m)主要代码:for(i=0;im;i+) /*使用冒泡法按从小到大顺序排列*/for(j=i+1;jarrayj)temp=arrayi; arrayi=arrayj; arrayj=temp;if(arraym-1=0;i-)coutarrayi=now) /*若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务*/while(l=0)&(rm) /*当前磁道在请求序列范围
8、内*/if( no w-arrayl)=(arrayr-now) /*选择与当前磁道最近的请求给予服务*/coutarrayl00(请选择:1/hxxxm你迤择了:負来先服鱼算.法FCF2 薄驀瞬脅梵M M 新建一个单琏表,以作为錯束标志:和杯“朴55 53 39 1 3Q ICO 150 38 184 QHNXKXK几号磯道开始:J4MMMMMMM10O单链表显示:阳 53 39 18 90 1G0r-D:软Microsoft Visual StudioMyProjects5Debug5 exe四、源代码:#in clude#in clude#i ncludeusing n amespace
9、 std;typedef struct nodeint data;struct node *n ext;Node,*Li nklist;void mai n()void Create_Linklist(Node *);void fcfs();声明先来先服务函数FCFS void sstf();声明最短寻道时间优先函数sstf void prin t(Node *);int s;printf(t*1,先来先服务算法 FCFSn);printf(t*2,最短寻道时间优先算法SSTFn);printf(t*0,退出 n);printf(t* 请选择:);while(s!=O) switch(s)ca
10、se 1:pri ntf(tt* 你选择了 :先来先服务算法FCFSn);fcfs();break;case 2:printf(tt* 你选择了 :最短寻道时间优先算法SSTFn);sstf();break;printf(tt* 退出请选 0,继续请选 1,2,n);scanf(%d,&s); void fcfs()/先来先服务算法void Create_Li nklist(Node *);void prin t(Node*);int Len gth_Li nklist(Node *);Node *l,*head;/*m,* n;*/float num=0;/num为平均寻道长度int c,f
11、;head=(Node *)malloc(sizeof(Node);head- next=NULL;printf(* 新建一个单链表,以0作为结束标志:*、n);Create_Li nklist(head);c=Le ngth_L in klist(head);printf(tt* 从几号磁道开始:*);scanf(%d,&f);/f 为磁道号prin t(head);printf(t* 链表长度为:%dn,c);l=head-n ext;for(i nt i=0;idata-f);f=l-data;l=l-n ext;num=num/c;printf(tt* 先来先服务的寻道顺序是:n);p
12、rin t(head);printf(tt* 平均寻道长度:%fn,num);/*/void sstf()最短寻道时间优先算法void Create_Li nklist(Node *);void prin t(Node *);int Len gth_Li nklist(Node *);Node *p,*q,*r,*s,*l,*m,*head;int c,f;head=(Node *)malloc(sizeof(Node);head- next=NULL;printf(* 新建一个单链表,以0作为结束标志:*、n);Create_L in klist(head); c=Le ngth_L in
13、klist(head);printf(tt* 从几号磁道开始:*);scanf(%d,&f); /f 为磁道号prin t(head);printf(t* 链表长度为:%dn,c);l=(Node *)malloc(sizeof(Node);l- next=NULL; m=l;q=head; p=head-next;s=head; r=head-next;float num=0;for(i nt i=0;idata);for(i nt j=0;jn ext;q=q-n ext;if(abs(f-p-data)data);r=p;s=q;nu m+=abs(f-r-data);f=r-data;
14、s-n ext=r- n ext;r-n ext=NULL;m-n ext=r;m=r;q=head;p=head-n ext; s=head; r=head-n ext; num=num/c;printf(tt* 最短寻道时间优先顺序是:n);prin t(l);printf(tt* 平均寻道长度:%fn,num);/*/void prin t(Node *head) / 输出链表Node *p;p=head-n ext; coutvv单链表显示:; if(p=NULL)printf(单链表为空:n);else if(p- next=NULL)prin tf(%dt,p-data);prin
15、 tf(n);elsewhile(p- next!=NULL)prin tf(%dt,p-data); p=p-n ext;prin tf(%dt,p-data);prin tf(n);void/*/Create_Li nklist(Node *head)创建链表 _Node *p,*q;int i;sca nf(%d,&i);q=head;while(i!=0)p=(Node *)malloc(sizeof(Node); p-n ext=NULL;p-data=i;q-n ext=p;q=p;cin i; /* c+;*/*int Len gth_Li nklist(Node *head)/
16、 计算链表长 _int l;Node *p;p= head-n ext;l=1;while(p-n ext)p=p-n ext;l+;return l;五、 总结通过此次课程设计,我对操作系统的基础知识了解得更透彻了, 同时对磁盘调度的四种算法一一先来先服务算法(FCFS)、最短寻道 时间优先算法(SSTF)、有了更深刻的理解和掌握,使我能够为磁盘 调度选择适当的算法,提高 CPU工作效率。设计过程中遇到的困难 在老师和同学的帮助下顺利解决并通过了验收, 我深刻认识到算法的 逻辑性对程序的重要影响,算法的准确度对程序运行结果的重要影 响,这对我以后在操作系统的学习中有极大帮助。六、 参考资料1黄维通等.Visual C+面向对象与可视化程序设计.北京:清华大学出版社,2011.2郑宗汉等.算法设计与分析.北京:清华大学出版社,2005.3赵剑云等译,美George Shepherd等著.深入解析MFC.北京:中国电力出版社,2003.4Microsoft Platform SDK, August 2001 Edition.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1