磁盘调度 操作系统实验报告Word文件下载.docx
- 文档编号:17281857
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:18
- 大小:79.71KB
磁盘调度 操作系统实验报告Word文件下载.docx
《磁盘调度 操作系统实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《磁盘调度 操作系统实验报告Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
2)最短寻道时间优先算法(SSTF)得流程图
图3—3 最短寻道时间优先算法得流程图
3)扫描算法(SCAN)得流程图
图3-4扫描算法得流程图
4)循环扫描算法(CSCAN)得流程图
图3-5 循环扫描算法得流程图
4、源程序
#include〈stdio、h>
#include<stdlib、h>
#include<
iostream、h>
#include<
math、h>
#definemaxsize1000
/*********************判断输入数据就是否有效**************************/
intdecide(char str[])//判断输入数据就是否有效
{
inti=0;
while(str[i]!
='
\0'
){
if(str[i]<
'0’||str[i]>
’9’){
ﻩﻩreturn0;
ﻩﻩﻩbreak;
}
ﻩi++;
}
returni;
}
/******************将字符串转换成数字***********************/
inttrans(char str[],inta)//将字符串转换成数字
{
int i;
ﻩintsum=0;
ﻩfor(i=0;
i<a;
i++)sum=sum+(int)((str[i]-'
0'
)*pow(10,a—i—1));
returnsum;
}
/*********************冒泡排序算法**************************/
int*bubble(int cidao[],int m)
{
inti,j;
ﻩinttemp;
ﻩfor(i=0;
i<
m;
i++)//使用冒泡法按从小到大顺序排列
ﻩfor(j=i+1;
j<
m;
j++){
ﻩif(cidao[i]>
cidao[j]){
ﻩﻩtemp=cidao[i];
ﻩﻩcidao[i]=cidao[j];
ﻩﻩcidao[j]=temp;
ﻩ}
}
ﻩcout<〈”排序后得磁盘序列为:
”;
ﻩfor(i=0;
i++)//输出排序结果
cout<〈cidao[i]<
<
””;
cout<
<endl;
returncidao;
}
/*********************先来先服务调度算法**************************/
voidFCFS(intcidao[],intm)//磁道号数组,个数为m
intnow;
//当前磁道号
int sum=0;
//总寻道长度
intj,i;
inta;
ﻩcharstr[100];
ﻩfloatave;
//平均寻道长度
ﻩcout<<
” 磁盘请求序列为:
for(i=0;
i〈m;
i++) //按先来先服务得策略输出磁盘请求序列
cout<
cidao[i]〈〈”";
cout〈<
endl;
ﻩcout<〈"请输入当前得磁道号:
"
;
B:
cin〉〉str;
//对输入数据进行有效性判断
ﻩa=decide(str);
ﻩif(a==0){
ﻩcout<
"输入数据得类型错误,请重新输入!
”〈<
endl;
ﻩgotoB;
ﻩelseﻩnow=trans(str,a);
//输入当前磁道号
ﻩsum+=abs(cidao[0]-now);
ﻩcout<<" 磁盘扫描序列为:
";
for(i=0;
i〈m;
i++)//输出磁盘扫描序列
ﻩﻩcout〈<cidao[i]<
〈”";
ﻩfor(i=0,j=1;
m;
i++,j++)//求平均寻道长度
ﻩ{
sum+=abs(cidao[j]-cidao[i]);
ﻩave=(float)(sum)/(float)(m);
ﻩ}
ﻩcout〈〈endl;
cout<
<" 平均寻道长度:
ave<
endl;
/**********************最短寻道时间优先调度算法********************/
voidSSTF(int cidao[],int m)
ﻩintk=1;
ﻩint now,l,r;
ﻩinti,j,sum=0;
ﻩinta;
charstr[100];
floatave;
cidao=bubble(cidao,m);
//调用冒泡排序算法排序
ﻩcout〈〈"
请输入当前得磁道号:
”;
C:
cin>
〉str;
a=decide(str);
ﻩif(a==0){
cout<<
输入数据得类型错误,请重新输入!
"<
endl;
ﻩgotoC;
ﻩelseﻩnow=trans(str,a);
//输入当前磁道号
ﻩif(cidao[m-1]〈=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务
{
cout〈<
磁盘扫描序列为:
ﻩfor(i=m—1;
i>
=0;
i--)ﻩcout<〈cidao[i]<
<”";
ﻩsum=now-cidao[0];
ﻩ}
if(cidao[0]>
=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务
cout<<” 磁盘扫描序列为:
;
for(i=0;
i++)ﻩcout<
cidao[i]〈〈"
";
sum=cidao[m-1]-now;
if(now>cidao[0]&
&now〈cidao[m-1])//若当前磁道号大于请求序列中最小者且小于最大者
ﻩ{
ﻩﻩcout<
<” 磁盘扫描序列为:
ﻩﻩwhile(cidao[k]<
now)//确定当前磁道在已排得序列中得位置,后面得算法都用到了,可以直接复制后少量修改,节省时间。
ﻩﻩk++;
ﻩl=k-1;
ﻩr=k;
ﻩwhile((l〉=0)&&
(r<m))//当前磁道在请求序列范围内
ﻩ{
ﻩif((now—cidao[l])<
=(cidao[r]-now)) //选择与当前磁道最近得请求给予服务
ﻩ{
ﻩﻩﻩcout〈〈cidao[l]〈〈”"
ﻩsum+=now-cidao[l];
ﻩﻩnow=cidao[l];
ﻩﻩﻩl=l—1;
}
ﻩelse{
ﻩﻩcout<<
cidao[r]〈<
”"
ﻩsum+=cidao[r]-now;
ﻩﻩﻩnow=cidao[r];
ﻩﻩﻩﻩr=r+1;
ﻩ}
if(l==—1)//磁头移动到序列得最小号,返回外侧扫描仍未扫描得磁道
{
for(j=r;
j<m;
j++)ﻩcout<
<cidao[j]<〈”"
ﻩsum+=cidao[m—1]-cidao[0];
ﻩelse//磁头移动到序列得最大号,返回内侧扫描仍未扫描得磁道
ﻩﻩfor(j=l;
j>
=0;
j--) cout〈<
cidao[j]<<
”;
ﻩsum+=cidao[m—1]—cidao[0];
}
ave=(float)(sum)/(float)(m);
ﻩcout<〈endl;
ﻩcout〈<
" 平均寻道长度:
”<<
ave〈<endl;
/*****************************扫描调度算法*******************************/
voidSCAN(intcidao[],intm)//先要给出当前磁道号与移动臂得移动方向
int k=1;
ﻩint now,l,r,d;
inti,j,sum=0;
ﻩinta;
charstr[100];
ﻩfloatave;
ﻩcidao=bubble(cidao,m);
cout〈<"
请输入当前得磁道号:
D:
cin〉>str;
a=decide(str);
ﻩif(a==0){
ﻩcout<
"输入数据得类型错误,请重新输入!
<endl;
ﻩgotoD;
elsenow=trans(str,a);
//输入当前磁道号
if(cidao[m-1]<
=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务,此情况同最短寻道优先
{
ﻩcout〈<"磁盘扫描序列为:
ﻩﻩfor(i=m-1;
i>
i-—)
cout<
cidao[i]<
ﻩsum=now-cidao[0];
ﻩif(cidao[0]>=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先
ﻩ{
ﻩcout<
〈” 磁盘扫描序列为:
for(i=0;
i++)
ﻩcout〈〈cidao[i]<<"
sum=cidao[m-1]—now;
if(now>
cidao[0]&&
now<cidao[m-1])//若当前磁道号大于请求序列中最小者且小于最大者
{
ﻩﻩwhile(cidao[k]〈now)k++;
ﻩl=k-1;
ﻩr=k;
ﻩﻩcout<
〈”请输入当前移动臂得移动得方向:
\n”<
〈endl;
"0:
表示向内1:
表示向外:
"
endl;
ﻩﻩcin>>
d;
if(d==0)//选择移动臂方向向内,则先向内扫描
{
ﻩcout<
<"
磁盘扫描序列为:
ﻩfor(j=l;
j—-)ﻩcout〈〈cidao[j]<<
//输出向内扫描得序列
ﻩfor(j=r;
j<
m;
j++)//磁头移动到最小号,则改变方向向外扫描未扫描得磁道
ﻩﻩcout<
cidao[j]<
<” "
//输出向外扫描得序列
sum=now—2*cidao[0]+cidao[m-1];
ﻩ}
ﻩelse//选择移动臂方向向外,则先向外扫描
ﻩﻩcout〈<
”磁盘扫描序列为:
ﻩﻩﻩfor(j=r;
j<m;
j++)ﻩcout<<cidao[j]<<
" "
//输出向外扫描得序列
ﻩﻩfor(j=l;
j>
j--)//磁头移动到最大号,则改变方向向内扫描未扫描得磁道
ﻩﻩcout<〈cidao[j]〈〈"";
ﻩﻩsum=-now-cidao[0]+2*cidao[m-1];
}
}ﻩ
ﻩave=(float)(sum)/(float)(m);
ﻩcout<<
endl;
ﻩcout〈〈”平均寻道长度:
ave<
<endl;
/************************循环扫描调度算法*****************************/
void CSCAN(intcidao[],int m)
int k=1;
intnow,l,r;
ﻩinti,j,sum=0;
ﻩinta;
charstr[100];
floatave;
cidao=bubble(cidao,m);
ﻩcout<
" 请输入当前得磁道号:
E:
cin>
>
str;
//对输入数据进行有效性判断
ﻩa=decide(str);
if(a==0){
ﻩcout〈〈” 输入数据得类型错误,请重新输入!
”<〈endl;
gotoE;
elsenow=trans(str,a);
if(cidao[m—1]<=now)//若当前磁道号大于请求序列中最大者,则直接将移动臂移动到最小号磁道依次向外给予各请求服务
ﻩ{
cout〈<
磁盘扫描序列为:
for(i=0;
i++)ﻩcout〈<
cidao[i]〈<
ﻩsum=now—2*cidao[0]+cidao[m—1];
ﻩif(cidao[0]>
=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先
cout<<"
";
ﻩﻩfor(i=0;
i<m;
i++)cout<
〈cidao[i]<<
”;
sum=cidao[m-1]—now;
if(now〉cidao[0]&&now<cidao[m-1])//若当前磁道号大于请求序列中最小者且小于最大者
{
ﻩﻩcout<〈”磁盘扫描序列为:
ﻩwhile(cidao[k]<
now) //单向反复地从内向外扫描
ﻩk++;
ﻩﻩl=k—1;
r=k;
ﻩﻩfor(j=r;
j++)ﻩcout<
<cidao[j]〈<
//输出从当前磁道向外扫描得序列
ﻩfor(j=0;
j〈r;
j++)//当扫描完最大号磁道,磁头直接移动到最小号磁道,再向外扫描未扫描得磁道
ﻩﻩcout<〈cidao[j]<
”;
ﻩsum=2*cidao[m-1]+cidao[l]-now-2*cidao[0];
ave=(float)(sum)/(float)(m);
ﻩcout<<
endl;
"平均寻道长度:
”<<ave<
endl;
void main()
int a;
ﻩ
int c;
//菜单项
int cidao[maxsize];
inti=0,count;
ﻩcharstr[100];
ﻩcout<
〈"
请输入磁道序列(输入0结束):
〈endl;
A:
cin>>
str;
ﻩa=decide(str);
ﻩif(a==0){
cout<<”输入数据得类型错误,请重新输入!
”<
ﻩgoto A;
//输入错误,跳转到A,重新输入
ﻩ}
ﻩelseﻩcidao[i]=trans(str,a);
ﻩi++;
while(cidao[i—1]!
=0){
ﻩﻩcin>>
str;
ﻩa=decide(str);
ﻩif(a==0)cout<
〈"输入数据得类型错误,请重新输入!
<〈endl;
ﻩﻩelse{
ﻩﻩﻩcidao[i]=trans(str,a);
ﻩﻩi++;
ﻩ}
ﻩcount=i-1;
//要访问得磁道数
cout〈〈”输入得磁道序列为:
ﻩfor(i=0;
i〈count;
i++)ﻩcout〈<cidao[i]〈<
” ”;
//输出磁道序列
cout〈〈endl;
ﻩwhile(1){
cout<<
”—--——------————----——---—-—--——-———-—-------—--——--—-—---—-—---—------—-—”〈<
\n 1、先来先服务2、最短寻道时间优先 3、扫描调度4、循环扫描5、退出\n"〈<
endl;
ﻩﻩcout〈〈"
—-—----——-—-——---—-——-——————-—--—-—-—-—--——----—--—-—--————-—-—---—————--"
〈〈endl;
G:
cout<
〈”请选择算法:
F:
a=decide(str);
ﻩﻩif(a==0){
ﻩcout<〈”输入数据得类型错误,请重新输入!
〈<endl;
ﻩgotoF;
//输入错误,跳转到F,重新输入
ﻩelseﻩc=trans(str,a);
ﻩif(c==5)ﻩbreak;
ﻩif(c〉5){
ﻩcout〈<
输入得数据错误!
请重新输入"
〈endl;
gotoG;
switch(c){
ﻩcase1:
//使用FCFS算法
ﻩﻩﻩﻩFCFS(cidao,count);
ﻩﻩﻩbreak;
ﻩcase2:
//使用SSTF算法
ﻩﻩSSTF(cidao,count);
ﻩﻩbreak;
ﻩﻩcase3:
//使用SCAN算法
ﻩSCAN(cidao,count);
ﻩbreak;
ﻩﻩcase4:
//使用CSCAN算法
ﻩﻩCSCAN(cidao,count);
ﻩﻩﻩﻩbreak;
ﻩﻩ}
5、实验结果
5、1程序主界面
运行程序后,将会提示用户输入磁道序列,并且以0结束。
当用户输入磁道序列后,系统将会重新显示用户输入得磁道序列。
程序主界面运行图如图5-1所示。
图5-1 程序主界面
5、2先来先服务算法(FCFS)运行结果
选择算法1之后,进入算法1 得操作。
系统会显示磁盘得请求序列。
用户需要输入当前得磁道号,系统会显示出磁盘得扫描序列与平均寻道长度。
由运行结果可得出,先来先服务算法得平均寻道长度为24、75.先来先服务算法得运行图如图5—2所示。
图5-2先来先服务算法运行结果图
5、3最短寻道时间优先算法(SSTF)运行结果
选择算法2之后,进入算法2得操作.系统会显示磁盘得请求序列.用户需要输入当前得磁道号,系统会显示出磁盘得扫描序列与平均寻道长度。
由运行结果可得出,先来先服务算法得平均寻道长度为20、625。
最短寻道时间优先算法得运行图如图5-3所示.
图5-3最短寻道时间优先算法运行结果图
5、4扫描算法(SCAN)运行结果
选择算法3之后,进入算法3得操作。
用户需要输入当前得磁道号,系统会显示出磁盘得扫描序列与平均寻道长度。
由运行结果可得出,先来先服务算法得平均寻道长度为11。
扫描算法得运行图如图5-4所示。
图5-4扫描算法运行结果图
5、5循环扫描算法(CSCAN)运行结果
选择算法4之后,进入算法4得操作。
由运行结果可得出,先来先服务算法得平均寻道长度为11。
扫描算法得运行图如图5-5所示.
图5-5循环扫描算法运行结果图
6、总结
通过本次实验,学习了解磁盘调度四种调度算法(先来先服务算法;
最短寻道时间优先算法;
扫描算法;
循环扫描算法)得工作原理以及四种调度算法之间得差异与共性,并且在当中发现了自己得不足,对以前所学过得知识理解得不够深刻,掌握得不够牢固,瞧到了自己得实践经验还就是比较缺乏,实践能力还需要提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 磁盘调度 操作系统实验报告 磁盘 调度 操作系统 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)