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