操作系统实验页面置换算法先来先服务最短寻道优先.docx
《操作系统实验页面置换算法先来先服务最短寻道优先.docx》由会员分享,可在线阅读,更多相关《操作系统实验页面置换算法先来先服务最短寻道优先.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统实验页面置换算法先来先服务最短寻道优先
学号P7*******专业计算机科学与技术姓名
实验日期2017/12/7教师签字成绩
实验报告
【实验名称】磁盘调度——先来先服务策略最短寻道策略
【实验目的】
磁盘调度中寻道时间直接影响到数据访问的快慢,通过本次实验学习如何处理好磁盘寻道时间。
【实验原理】
1.先来先服务算法
先来先服务算法根据进程请求访问磁盘的先后次序进行调度。
2.最短寻道时间优先算法
最短寻道时间优先算法要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。
【数据结构和符号说明】
ypedefstructTrack
{
intid;//磁道序列
intstate=0;//是否访问过,未被访问置状态为0
}Track;
Tracktrack[N];//最大磁道数为100
Tracktrack1[N];
intstep[N];//移动距离
intnum,i,current_track,num1;//需要访问的次数
函数说明:
voidinit()//初始化程序
voidinput()//输入函数
voidFCFS()//先来先服务
intabs(inta,intb)//相减的绝对值
intSerch_min_pos()//寻找到当前磁道最短的需求磁道
voidSSTF()//最短寻道优先
voidoutput(Tracka[])//输出函数
voidoutput_average_track()//输出平均寻道时间
intshow()//显示用户界面
先来先服务(FCFS)
最短寻道时间优先(SSTF)
代码:
#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;iscanf("%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;iif(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;iprintf("\t%4d\t\t||\t%4d\n",a[i].id,step[i]);
printf("==================================================\n");
}
voidoutput_average_track()//输出平均寻道时间
{
doublesum=0;//和
for(i=0;isum+=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;
}
}
while
(1);
return0;
}
截图:
主界面开始,输入选择先来先服务还是最短寻道优先,输入当前磁道,输入要访问的磁道,输入要访问的磁道序列。
先来先服务(FCFS)
最短寻道优先(SSTF)
【小结与讨论】
1、先来先服务算法是一种简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是较为公平与简单,并且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
但此算法由于未对寻道进行优化,致使平均寻道时间可能较长;而最短寻道时间优先算法要求每次访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短,因为只能做到局部最优。
2、本实验用数组就可以很方便简洁地解决问题,唯一需要注意的就是在算法中,每一次寻道需要对之前的磁道号进行暂存设置一个current_track(当前磁道),如果已查询到,需将状态置为1,这样才方便寻找和计算寻道距离。
3、FCFS算法根据磁道号需要被访问的顺序依次访问磁道,所以磁道被访问顺序在磁道需要顺序确定时,即被确定,然后用依次减法即可算出移动距离,相对来说实验的复杂度较低,易于实现。
4、SSTF算法则相较于FCFS算法复杂得多。
在确定被访问的下一个磁道号时,需要计算后面每一个磁道号与当前磁道号的距离,然后取最小距离的磁道号作为被访问的下一个磁道号。
即实现SSTF算法需找到最小距离的磁道号再写入。
5、本次实验通过编写程序让我对磁盘的相关调度有了更深入的理解,对计算机内部原理也有了更深的认识,代码能力也有所提高。