操作系统课程设计磁盘调度算法.docx
- 文档编号:2843826
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:11
- 大小:19KB
操作系统课程设计磁盘调度算法.docx
《操作系统课程设计磁盘调度算法.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计磁盘调度算法.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统课程设计磁盘调度算法
1. 实验题目:
磁盘调度算法。
建立相应的数据结构;
在屏幕上显示磁盘请求的服务状况;
将一批磁盘请求的情况存磁盘文件,以后可以读出并重放;
计算磁头移动的总距离及平均移动距离;
支持算法:
FIFO、SSTF、SCAN、CSCAN;
2.设计目的:
调度磁盘I/O请求服务,采用好的方式能提高访问时间和带宽。
本实验通过编程对磁盘调度算法的实现,加深对算法的理解,同时通过用C++语言编写程序实现这些算法,并在windos平台上实现,更好的掌握操作系统的原理以及实现方法,提高综合运用专业课知识的能力。
3.任务及要求
3.1设计任务
编程实现下述磁盘调度算法,并求出每种算法的平均寻道长度:
1、 先来先服务算法(FCFS)
2、 最短寻道时间算法(SSTF)
3、 扫描算法(SCAN)
4、 循环扫描算法(CSCAN)
3.2设计要求
对用户指定的磁盘调度请求序列,基于以上四种算法,实现各自的调度顺序并输出,同时计算出各种算法下的平均寻道长度。
4.算法及数据结构
4.1算法的总体思想
queue[n]为请求调度序列,diskrode为磁盘磁道数,headstarts为正在调度的磁道
①先来先服务算法(FCFS)
按queue[n]数组的顺序进行磁盘调度,将前一个调度磁道与下一个调度磁道的差值累加起来,得到总的寻道长度,再除以n得到平均寻道长度。
②最短寻道时间优先算法(SSTF)
将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,通过循环语句找出离起始磁头最短的位置。
③扫描算法(SCAN)
将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,然后在此位置按给定的方向遍历queue[n],当道端点(queue[0]或queue[n-1])时,再在定位处反向遍历到另一端。
当调度磁道不在queue端点时,总的寻道长度为为前一个磁道与后一个磁
道差值的累加,当到达端点且queue[n]未全调度时,总寻道长度加上端点值再加上下一个调度磁道的值,再按前面的算法进行,直到磁道全部都调度完毕,得到总的寻道长度,除以n得到平均寻道长度。
④循环扫描算法(CSCAN)
将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,然后在此位置按给定的方向遍历queue[n],当道端点(queue[0]或queue[n-1])时,反向到另一端点再以此方向进行遍历,直到queue[n]中所有都调度完。
当调度磁道不在queue端点时,总的寻道长度为为前一个磁道与后一个磁道差值的累加,当到达端点且queue[n]未全调度时,总寻道长度加上端点值再加上磁盘磁道总长度,再加上下一个调度磁道的值,再按前面的算法进行,直到磁道全部都调度完毕,得到总的寻道长度,除以n得到平均寻道长度。
5、源代码:
#include
#include
#include
voidmenu()
{
cout<<"*********************菜单*********************"< cout<<"******1、先来先服务算法(FCFS) **********"< cout<<"******2、最短寻道时间优先算法(SSTF)**********"< cout<<"******3、扫描算法(SCAN) **********"< cout<<"******4、循环扫描算法(CSCAN) **********"< cout<<"******5、退出 **********"< cout<<"**********************************************"< } /*======================初始化序列=======================*/ voidinit(intqueue[],intqueue_copy[],intn) { inti; for(i=0;i queue[i]=queue_copy[i]; } //对当前正在执行的磁道号进行定位,返回磁道号小于当前磁道中最大的一个 intfix(intqueue[],intn,intheadstarts) { inti=0; while(i { i++; } if(i>n-1) returnn-1; //当前磁道号大于磁盘请求序列中的所有磁道 if(i==0) return-1; //当前磁道号小于磁盘请求序列中的所有磁道 else returni-1; //返回小于当前磁道号中最大的一个 } /*=================使用冒泡算法从小到大排序==============*/ int*bubble(intqueue[],intm) { inti,j; inttemp; for(i=0;i for(j=i+1;j { if(queue[i]>queue[j]) { temp=queue[i]; queue[i]=queue[j]; queue[j]=temp; } } cout<<"排序后的磁盘序列为: "; for(i=0;i { cout< } cout< returnqueue; } /*====================以下是FCFS算法==================*/ voidFCFS(intqueue[],intn,intdiskrode,intheadstarts) //queue是请求调度序列,n为其个数,diskroad为磁盘磁道数,headstarts为正在调度的磁道 { cout<<"************以下为FCFS调度算法***********"< inti; intcount=0; if(headstarts>queue[0]) count+=headstarts-queue[0]; else count+=queue[0]-headstarts; cout<<"调度序列为: "; cout< for(i=0;i { cout< if(queue[i]>queue[i+1]) count+=queue[i]-queue[i+1]; else count+=queue[i+1]-queue[i]; } cout< cout< cout<<"总的寻道长度为: "< cout<<"平均寻道长度为: "< } /*=====================SSTF算法====================*/ voidSSTF(intqueue[],intn,intdiskrode,intheadstarts) { intk=1; intl,r; inti,j,count=0; queue=bubble(queue,n); cout<<"************以下为SSTF调度算法***********"< if(queue[n-1]<=headstarts) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务 { cout<<"磁盘扫描序列为: "; cout< for(i=n-1;i>=0;i--) cout< count=headstarts-queue[0]; } if(queue[0]>=headstarts) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务 { cout<<"磁盘扫描序列为: "; cout< for(i=0;i cout< count=queue[n-1]-headstarts; } if(headstarts>queue[0]&&headstarts { cout<<"磁盘扫描序列为: "; cout< while(queue[k] { k++; } l=k-1; r=k; while((l>=0)&&(r { if( (headstarts-queue[l])<(queue -headstarts)) { cout< count+=headstarts-queue[l]; headstarts=queue[l]; l=l-1; } else if((headstarts-queue[l])==(queue-headstarts)) { cout< count+=headstarts-queue[l]; headstarts=queue[l]; l=l-1; } else { cout< count+=queue-headstarts; headstarts=queue; r=r+1; } } if(l==-1) //磁头移动到序列的最小号,返
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 磁盘 调度 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)