- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
磁盘调度算法仿真
磁盘调度算法的模拟
实验要求:
请分别用SCAN和SSTF模拟磁盘调度,并打印出磁盘磁道的调度顺序。
磁头的方向可以动态的规定
磁道请求个数及序列可以动态地写入
总结收获体会及对该题解的改进意见和见解
(一)分析题意得模型
(一)分析题意得模型
利用数组相关知识
SCAN算法:
先将请求的磁道序列排序,以当前磁道号将该序列分界,根据当前磁道移动方向决定 先读左边的还是先读右边的
SSTF算法:
先将请求的磁道序列排序,以当前磁道号将该序列分界,然后当前磁道号分别与左边、右边磁道作差比较,选作差最小的,也即最短的。并修改当前磁道号及其访问位(1为已访问完,0为未访问)。(注:还要考虑左边或右边没有磁道的情况,如何确定所要与之比较的磁道)
利用数组相关知识
(二)写主要算法思路
(二)写主要算法思路
详见源程序及注释分类
详见源程序及注释分类
(三)调试运行(多种情况都要运行)
(三)调试运行(多种情况都要运行)
(图SSTF1. 当前磁道号在已排序的磁道请求序列 中间 的运行结果)
(图SSTF2 当前磁道号在已排序的磁道请求序列 最右边 的运行结果)
(图SSTF2 当前磁道号在已排序的磁道请求序列 最左边 的运行结果)
(四)
(四)体会
1.先找到问题思路,然后运用所学知识,
1.先找到问题思路,然后运用所学知识,SCAN算法用数组实现较为简单,问题不大。
2. SSTF算法的情况分类需花点脑子,只需让当前磁道号分别与左边、右边磁道作差比较,用数组实现还需再加一个数组设置该磁道是否被访问,若用双向链表实现,可把已访问的磁道号释放掉,只需让当前磁道号分别与前驱、后驱磁道作差比较,用链表实现可减少用数组实现时不断去判断该磁道是否访问的时间。在这一方面,双向链表实现应该会比数组实现更有效率。
SCAN源代码:
#includestdio.h
void main()
{
int m=0,n,Seek[100],SCurrent,t,i=0,j,k,option;
printf(请输入当前的磁道号:);
scanf(%d,SCurrent);
printf(\n----1.向磁道号增加的方向访问\t2.向磁道号减少的方向访问----\n);
printf(---请选择的当前磁头移动方向(1/2):);
scanf(%d,option);
printf(\n请输入磁道请求序列(以-999结束):\n);
scanf(%d,n);
while(n!=-999)
{
Seek[i]=n;
m++;i++;
scanf(%d,n);
}
/* 冒泡排序 使磁道请求序列从小到大排序 */
for(j=0;jm-1;j++)
{
for(i=0;im-1-j;i++)
if(Seek[i]Seek[i+1])
{
t=Seek[i];
Seek[i]=Seek[i+1];
Seek[i+1]=t;
}
}
/* 找到当前磁道号在磁道请求序列中的排序位置 */
k=0;
for(i=0;im;i++)
{
if(Seek[i]SCurrent)
k++;
else
break;
}
printf(\n--------------扫描(SCAN)算法后的磁盘调度序列----------\n);
/* 第一种: 当前磁道号先向外再向里读 */
if(option==1)
{
for(i=k;im;i++)
printf(%5d,Seek[i]);
for(i=k-1;i=0;i--)
printf(%5d,Seek[i]);
}
/* 第二种: 当前磁道号先向里再向外读 */
if(option==2)
{
for(i=k-1;i=0;i--)
printf(%d ,Seek[i]);
for(i=k;im;i++)
printf(%5d,Seek[i]);
}
printf(\n);
}
SSTF源代码:
#includestdio.h
void main()
{
int m=0,n,Seek[100],Flag[100],SCurrent,t,i=0,j,k,i0,j0;
printf(请输入当前的磁道号:);
scanf(%d,SCurrent);
printf(\n请输入磁道请求序列(以-999结束):\n);
scanf(%d,n);
while(n!=-999)
{
Seek[i]=n;
m++;i++;
scanf(%d,n);
}
/* 初始化 置对应的磁道访问位为零 */
fo
文档评论(0)