- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
磁盘调度——最短路径优先调度算法-Read
磁盘调度——最短路径优先调度算法
摘要: 有多个访盘要求在等待时对这些要求的顺序的确定安排或调整,只在减少平均磁盘服务时间就成为磁盘调度,而磁盘调度有多种的调度算法,其中最短路径优先是其中基本一种,本课程设计是使用C++程序设计语言,在windows平台下对此调度算法进行模拟,通过此调度算法的模拟来进一步的加深对磁盘最短路径优先调度的了解,及对C++程序设计语言的使用。
关键词:磁盘调度 最短路径优先 操作系统 课程设计
设计背景介绍
1、相关概念,相关算法
磁臂调度:磁臂调度是指同时有多个访盘要求在等待时,对这些要求的顺序的确定安排或调整,旨在减少平均磁盘服务时间。
最短路径优先:最短路径总是在访盘队列中挑选离磁臂当前位置最近的访盘要求作为下一个服务对象。
磁盘最短路径优先调度:根据当前磁臂所在磁道对整个访问队列做最短路径的访问调度。
2、设计环境,设计工具
利用C或C++程序设计语言在windows操作系统下模拟实现操作系统的磁臂最短路径优先调度的功能
计思路和总体流程图
2.1 基本思路
因为磁臂调度总是在有多个访盘要求在等待时,对这些要求的顺序的确定安排或调整,而最短路径优先是根据离当前磁臂所在位置最近的访盘要求作为下一服务对象的,所以磁盘的最短路径优先调度可以这么实现,将所有的访问请求队列几磁臂当前所在位置的磁道号进行排序。
例如: 访问请求对列为:98,183,37,122,14,124,65,67
当前磁臂所在位置为:53
排序后的队列为:14,37,53,65,67,98,122,124,183
这时候最短路径的判断就是选取53将53与它的前一项37及后一项65进行距离判断,选其中距离最短的那个65作为磁臂移项的下一个位置,并将此距离值与变量sum中的值相加存在sum中(sum的初始值为0),然后从队列去除53,接着进行下一轮与65的距离判断,判断完65后将65存放到访问队列里,距离与sum相加存到sum,再接着取与65距离最近的那个请求作为磁臂当前所在位置再做判断,如是循环直到整个队列都全部调度完成,最后将sum及访问队列输出。
2.2数据文件格式说明
在数据文件中定义磁盘访问请求队列,如:
nums:8
trackserial:122 24 124 37 183 65 98 67
其中nums:8表示的是访问请求队列的长度为8
trackserial: 122 24 124 37 183 65 98 67表示的是对磁盘访问的请求队列
2.3数据结构定义
typedef struct
{
int nums; /*请求队列长度*/
int *mem; /*访问请求*/
int *f; /*每次访问磁臂移动磁道数*/
int *tmp; /*SSTF临时变量*/
int *sh; /*访问顺序*/
int *m; /*SSTF调度队列*/
}Cibi;
2.4总体流程图
2.5根据总体流程图进行模块分割、模块功能说明和模块间接口函数
最短路径调度模块:对读入的访问队列按照最短路径优先进行调度,并将调度后队列输出
算法的实现
3.1 模块流程图及算法实现
最短路径优先调度算法(SSTF)模块:
printf(\n请输入当前磁臂位置:);
scanf(%d,t); //当前磁臂位置
printf(\n最短路径优先调度算法\n);
for(l=0;lp-nums;l++)
{
p-m[l]=p-mem[l]; //复制请求队列到调度队列
};
for(j=0;jp-nums;j++)
{
for(k=0;kp-nums-j;k++)
p-tmp[k]=abs(t-p-m[k]); //求出当前磁臂所在位置与各个请求的距离
l=0;
for(k=0;kp-nums-j;k++)
l=(p-tmp[l]p-tmp[k])?k:l; //判断距离最短的那个请求在请求队列中的位置
x=l;
t=p-m[x]; //将访问的磁道号存入当前磁道
p-sh[j]=p-m[x]; //将访问的磁道号存入sh[j]
p-f[j]=p-tmp[x]; //将距离存入f[j]
sum+=p-f[j];
for(k=x;kp-nums-1;k++)
p-m[k]=p-m[k+1]; //删除已经访问过的请求
}
3.2 程序编译及使用说明
用VC++6.0打开cpp(
文档评论(0)