操作系统实验磁盘调度扫描算法循环扫描算法.docx
- 文档编号:9607640
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:13
- 大小:229.39KB
操作系统实验磁盘调度扫描算法循环扫描算法.docx
《操作系统实验磁盘调度扫描算法循环扫描算法.docx》由会员分享,可在线阅读,更多相关《操作系统实验磁盘调度扫描算法循环扫描算法.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统实验磁盘调度扫描算法循环扫描算法
作者:
非成败
作品编号:
92032155GZ5702241547853215475102
时间:
2020.12.13
学号P1514032专业计算机科学与技术姓名
实验日期2017.12.7教师签字成绩
实验报告
【实验名称】磁盘调度
(二)
【实验目的】
磁盘调度中寻道时间直接影响到数据访问的快慢,处理好磁盘寻道时间是关键。
分别采用扫描策略、循环扫描策略处理。
【实验原理】
1.扫描算法(SCAN算法)
SCAN算法,也就是很形象的电梯调度算法。
先按照一个方向(比如从外向内扫描),扫描的过程中依次调度经过的磁道。
当扫描到最里层的一个磁道时反向扫描直至所有磁道都被调度。
2.循环扫描算法(CSCAN算法)
CSCAN算法,循环扫描算法,它的思想是,访问完最里面一个要求服务的序列之后,从最外层的序号开始往里走。
也就是始终保持一个方向,故称为循环扫描算法。
【数据结构和符号说明】
(1)数据结构和符号说明
编译语言:
C++
数据结构:
结构体数组
符号定义:
typedefstructTrack//磁道结构体
{
intid;//磁道序列
intstate=0;//是否访问过,未被访问置状态为0
}Track;
Tracktrack[N];//最大磁道数为100
Tracktrack1[N];//复制的磁道数组用于输出
intstep[N];//移动距离
intnum,i,current_track,num1;//当前磁道即部分中间变量
函数说明:
voidinit()//初始化程序
voidinput()//输入函数
voidsort1()//从小到大排序
intabs(inta,intb)//相减的绝对值
intfind_first_bignum()//寻找第一个最大值
intfind_first_smallnum()//寻找第一个最小值
voidSCAN(intup_or_down)//扫描算法
voidCSCAN(intup_or_down)//循环扫描算法
voidoutput(Tracka[])//输出函数
voidoutput_average_track()//输出平均寻道时间
intshow()//显示用户界面//返回值为输入的选择项
流程图:
SCAN算法:
CSCAN算法(与SCAN算法基本类似):
代码:
#include
#defineN100
typedefstructTrack
{
intid;//磁道序列
intstate=0;//是否访问过,未被访问置状态为0
}Track;
Tracktrack[N];//最大磁道数为100
Tracktrack1[N];
intstep[N];//移动距离
intnum,i,current_track,num1;
voidinit()//初始化程序
{
num=0;
for(i=0;i { track[i].state=-1;//id置为1 track1[i].state=-1; step[i]=-1;//移动距离为-1 } } voidinput()//输入函数 { printf("输入当前磁道\n"); scanf("%d",¤t_track); num1=current_track; printf("输入要访问的磁道数目\n"); scanf("%d",&num); printf("输入要访问磁道序列\n"); for(i=0;i 作者: 非成败 作品编号: 92032155GZ5702241547853215475102 时间: 2020.12.13 scanf("%d",&track[i].id); } voidFCFS()//先来先服务 { for(i=0;i { if((current_track-track[i].id)<0)//求移动距离 step[i]=track[i].id-current_track; else step[i]=current_track-track[i].id;//取绝对值 track[i].state=1;//状态置为1 current_track=track[i].id;//更新当前磁道 } } intabs(inta,intb)//相减的绝对值 { returna-b>0? a-b: b-a; } intSerch_min_pos()//寻找到当前磁道最短的需求磁道 { intmin=45536;//最小距离标志 intpos; for(inti=0;i if(track[i].state==1) continue; elseif(min>abs(track[i].id,current_track))//寻找最小距离 { min=abs(track[i].id,current_track); pos=i; } track[pos].state=1; returnpos;//返回在数组中的位置 } voidSSTF()//最短寻道优先 { for(i=0;i { track1[i]=track[Serch_min_pos()];//更新到要输出的数组中 step[i]=abs(track1[i].id,current_track);//移动距离 current_track=track1[i].id;//标志 } } voidoutput(Tracka[])//输出函数 { printf("\n\n<从%d号磁道开始>\n",num1); printf("==================================================\n");//排班 printf("被访问的下一个磁道\t\t移动距离(磁道数)\n"); for(i=0;i printf("\t%4d\t\t||\t%4d\n",a[i].id,step[i]); printf("==================================================\n"); } voidoutput_average_track()//输出平均寻道时间 { doublesum=0;//和 for(i=0;i sum+=step[i]; printf("平均寻道长度%3.2f\n\n\n",sum/num);//输出 } intshow()//显示用户界面 { intchoose;//选择 printf("\n******************早期的磁盘调度算法******************\n"); printf("\t\t1、先来先服务(FCFS)\n"); printf("\t\t2、最短寻道时间优先(SSTF)\n"); printf("\t\t3、退出(EXIT)\n"); scanf("%d",&choose); returnchoose; } intmain() { do { init(); switch(show())//返回值是选择 { case1: //FCFS input(); FCFS(); output(track); output_average_track(); break; case2: //最短寻道 input(); SSTF(); output(track1); output_average_track(); break; case3: //退出 return0; default: break; 作者: 非成败 作品编号: 92032155GZ5702241547853215475102 时间: 2020.12.13 } } while (1); return0; } 截图: 主界面开始,输入选择先来先服务还是最短寻道优先,输入当前磁道,输入要访问的磁道,输入要访问的磁道序列。 SCAN算法 输入当前磁道100,9个磁道,分别为555839189016015038184,此时选择方向向上 结果正确。 输入当前磁道100,9个磁道,分别为555839189016015038184,此时选择方向向下 结果正确。 CSCAN算法 输入当前磁道100,9个磁道,分别为555839189016015038184,此时选择方向向上 结果正确。 输入当前磁道100,9个磁道,分别为555839189016015038184,此时选择方向向上 结果正确。 【小结与讨论】 1、扫描算法又称为电梯算法,其原理与电梯运行情况相似,即运行方向上的请求优先,若是访问方向向上,则先依次访问较大的磁道号至顶,再向下访问娇小的磁道号;若是访问方向向下,则先依次访问较小的磁道号至底,再向上访问娇大的磁道号。 2、循环扫描算法又称为单向电梯算法,若是访问方向向上,则向上依次访问完较大的磁道号后,返回最低端,依次向上访问较小的磁道号;若是访问方向向下,则向下依次访问完较小的磁道号后,返回最顶端,依次向下访问较大的磁道号。 3、此次实验我用两个数组分别存放了一个磁道表和复制的磁道表,根据两个算法的原理,只要将其进行排序,然后分别对两个数组进行正向和逆向的访问即可。 4、具体实现时,我将两种算法的两种初始扫描方向写在了一个函数之中,调用时通过参数scan和参数up_or_down设置。 并设置了寻找大于当前数组的最近最小值和最近的大值进行选择结果,这是因为初始磁道号将磁道数组分成上下(高低地址)两块,这两块根据不同的扫描方向重新选择高低地址,又结合不同的算法决定正序排列还是反序排列。 实现起来还是比较简单的。 5、由于CSCAN算法的思想是,访问完最里面一个要求服务的序列之后,从最外层的序号开始往里走。 也就是始终保持一个方向。 所以如果用循环队列实现,时间复杂度会更低,效率更高。 6、此次实验虽然较为简单,但还是发现了自己知识点有些方面的不足,让我更好的了解了磁盘调度的原理,使我收获颇多。 作者: 非成败 作品编号: 92032155GZ5702241547853215475102 时间: 2020.12.13
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 磁盘 调度 扫描 算法 循环