课程设计报告
姓名:
班级:软件
学号:
指导老师:
目 录
1 操作系统课程设计务描述 1
11先先服务算法(FCFS) 1
12短寻道时间优先算法(SSTF) 1
13扫描算法(SCAN) 1
14循环扫描算法(CSCAN) 1
2 问题定义需求分析 2
21 输入形式 2
22 输入值范围 2
23输出形式 2
24程序达功 2
25测试数 2
3 概设计流程图 3
31子模块调关系 3
32函数参数 3
33流程图 3
4 问题实现代码 5
41先先服务算法实现 5
42短寻道时间优先算法实现 6
43扫描算法实现 7
44循环扫描算法实现 7
5 调试分析 9
6 测试 9
61测试数 9
62测试界面 10
7 课设总结 12
8 参考文献 13
9 源代码 14
1 操作系统课程设计务描述
课程设计目通设计磁盘调度模拟系统磁盘调度算法更加形象化容易理解磁盘调度特点更简单明里实现磁盘调度四种算法分先先服务算法短寻道时间优先算法扫描算法循环扫描算法等磁盘调度算法
11先先服务算法(FCFS)
种较简单磁盘调度算法根进程请求访问磁盘先次序进行调度算法优点公简单进程请求次处理会出现某进程请求长期满足情况
12短寻道时间优先算法(SSTF)
该算法求访问磁道前磁头磁道距离次寻道时间短该算法较吞吐量保证均寻道时间短户服务请求响应机会均等
13扫描算法(SCAN)
扫描算法仅考虑欲访问磁道前磁道距离更优先考虑磁头前移动方例磁头正里外移动时等请求磁道外部边缘时磁道调换方开始号磁道次号磁道服务样避免饥饿现象出现吞吐量较均响应时间较缺点户服务请求响应机会均等导致响应时间变化幅度
14循环扫描算法(CSCAN)
循环扫描算法扫描算法改进循环扫描循环扫描算法规定磁头单移动磁头达磁盘边缘时磁头直接返回磁盘边缘继续做原请求方进行服务算法解决扫描算法缺点时具短寻道时间优先算法优点吞吐量较均响应时间较磁道两端访问频率低磁道中间访问频率
2 问题定义需求分析
21 输入形式
磁道号数组输入:定义数组int cidao[]先提示户输入磁道号串数n然次输入n磁道号(磁道号中间空格回车键隔开)输入完毕回车键结束输入运行步
22 输入值范围
数:全局变量maxsize1000磁道数组cidao[maxsize]1000输入时提示值时保存前1000数
关int now表示前磁道号程序运行时会户种算法中输入前磁道号now果输入数字外字符提示错误户重新输入
23输出形式
户输入磁道数组程序会显示户输入数组户输入序输出输出形式横行果排序输出排序磁道号
24程序达功
程序main函数实现程序运行模式运行首先会显示磁盘调度算法系统系统名称紧接着面系统菜单系统菜单里供户选择6选项:1 输入磁道号 2 先先服务 3 短寻道时间优先 4 扫描调度 5 循环扫描 6 退出系统
户输入磁道号串连续选择调度算法种调度算法会提示户重新输入前磁道号输入磁道号串操作起较方便扫描循环扫描算法中会户选择磁道请求方外选择系统退出时系统会提示否真退出(yesno)果手动输入写YES写yes系统会退出果输入字符系统调main()继续磁盘调度算法操作
25测试数
定义磁道数组前磁道号数类型整形数cinfail()函数检验错误果数类型错误错误cinclear()进行错误清接着cinignore()函数忽略掉输入错误数goto返回继续进行数组数输入样效避免户手误输错情况
3 概设计流程图
31子模块调关系
程序分八模块系统菜单里六选择项外排序函数paixu()函数mian()函数里户选择输入算法退出switch函数控制调外部函数FCFS()SSTF()SCAN()CSCAN()shuru()Exit()分进行算法实现
中排序算法SSTF()SCAN()CSCAN()函数里调paixu()进行排序
32函数参数
四算法函数shuru()函数参数FCFS(int cidao[]int m)cidao[]磁道数组函数实现时候函数里参数int cidao[]结果根函数里int cidao[maxsize]进行操作int m指磁道号数输入函数shuru()完成m磁道号串赋值输入函数规定磁道磁道号
33流程图
函数实现功选择流程图图1示
先先服务函数流程简单户输入磁道号串选择菜单功2调先先服务磁盘调度算法户输入前磁道号系统会显示磁盘寻求序列磁道输入序然次予服务求输出均值设计报告省略算法流程图
短寻道时间优先算法实现先先服务算法需调排序函数磁道号排序然服务流程图图2示
扫描算法实现流程图图3示循环扫描算法基扫描算法实现循环扫描算法原磁头访问磁边缘磁头直接跳磁盘边缘然原寻求方继续磁道服务处省略流程图
图1 函数流程图
图331
图2 短寻道时间优先算法流程图
图3 扫描算法流程图
4 问题实现代码
41先先服务算法实现
void FCFS(int cidao[]int m)输入磁道号先先服务策略输出磁盘请求序列求均寻道长度输出移动均磁道数代码:
for(i0j1j
sum+abs(array[j]array[i])
ave(float)(sum)(float)(m)
}
42短寻道时间优先算法实现
void SSTF(int cidao[]int m)磁道号泡法排序输出排序磁道序列输入前磁道号根前磁道已排序列中位置分三种情况进行访问总长度计算第三种较找离now磁道号坐标找磁道号方访问然反访问未访问算出寻道总长度输出移动均磁道长度代码:
(1)前磁道号请求序列中者时直接次予请求服务
if(cidao[m1]
cout<<磁盘扫描序列:
for(im1i>0i)
cout<
}
(2)前磁道号请求序列中者时直接次予请求服务
if(cidao[0]>now)
{
cout<<磁盘扫描序列:
for(i0i
}
(3)前磁道号请求序列中者者时
while(cidao[k]
k++ k离now磁道坐标
}
lk1 lnow左边磁道坐标
rk rnow右边磁道坐标
if((nowcidao[l])<(cidao[r]now)) 选择前磁道请求予服务
{
cout<
nowcidao[l]
ll1
}
43扫描算法实现
扫描算法实现短寻道时间算法相处扫描算法中先确定前磁道访问方外?户选择代码:
int d
cout<<请输入前移动臂移动方 (1 表示 0表示外)
cin>>d
if(d0) 选择移动臂磁道号减方扫描
{
cout<<磁盘扫描序列:
for(jlj>0j)
{
cout<
for(jrj
cout<
sumnowcidao[0]+cidao[m1]cidao[0]
}
else 种磁道磁道号增加方访问
44循环扫描算法实现
循环扫描算法难点磁道总长度计算里说前磁道号请求序列中者者时情况d分两种计算d选择外扫描时分两种计算寻找离now磁道号时rkk应磁道号等now避免计算错误分两种计算方法保证代码准确性
if(d0) 选择移动臂磁道号减方扫描
{
if(nowcidao[r])
{
for(jrj>0j)
{
cout<
扫描完号磁道磁头直接移动号磁道次予未服务磁道服务
for(jm1j>rj)
{
cout<
sum+nowcidao[0]+cidao[m1]cidao[0]+cidao[m1]cidao[r+1]
}
else
{
for(jlj>0j)
{
cout<
扫描完号磁道磁头直接移动号磁道次予未服务磁道服务
for(jm1j>lj)
{
cout<
sum+nowcidao[0]+cidao[m1]cidao[0]+cidao[m1]cidao[r]
}
}
5 调试分析
运行程中发现第种先先服务算法输入磁道号时候计算均值出错机数缜密考虑发现种情况应该作特殊情况考虑总长度计算代码中增加种特殊情况代码:
if(m1) m磁道号数
{
ave(float)(sum)(float)m
cout<<均寻道长度:<
输入函数里想获取输入函数里规定磁道号数n想n传函数里供算法例FCFS(cidaom)中m老师帮调试完成功解决办法:输入函数里定义参数shuru(int cidao[])输入函数定义成int类型return n(里n指磁道号数)函数里定义int mswitch函数里输入函数赋值mmshuru(cidao)样效解决问题
6 测试
61测试数
测试数:30 50 10 20 60 40
(1)先先服务算法
前磁道号:30
均寻道长度:2166
(2) 短寻道时间优先算法
① 前磁道号磁道序列中磁道号时
前磁道号:70
均寻道长度10
② 前磁道号磁道序列中磁道号时
前磁道号:5
均寻道长度:916
③ 前磁道号磁道序列中磁道号磁道号时
前磁道号:35
均寻道长度:125
(3)扫描算法
① 前磁道号磁道序列中磁道号时
前磁道号:70
均寻道长度10
② 前磁道号磁道序列中磁道号时
前磁道号:5
均寻道长度916
③ 前磁道号磁道序列中磁道号磁道号(磁头外)
前磁道号:35
均寻道长度125
④ 前磁道号磁道序列中磁道号磁道号(磁头)
前磁道号:35
均寻道长度125
(4)循环扫描算法
① 前磁道号磁道序列中磁道号时
前磁道号:70
均寻道长度1833
② 前磁道号磁道序列中磁道号时
前磁道号:5
均寻道长度916
③ 前磁道号磁道序列中磁道号磁道号(磁头外)
前磁道号:30
均寻道长度15
④ 前磁道号磁道序列中磁道号磁道号(磁头)
前磁道号:30
均寻道长度15
62测试界面
(1)系统界面运行程序直接显示系统界面请户选择功图4示:
图4 界面
(2)选择功1表示输入磁道号串输入前先控制磁道号数n
图5示:
图5 数输入
(3)果户输入信息错误输入前磁道号时输入字母h系统会提示户输入信息类型错误求户重新输入图6示:
图6 错误提示
(4)根输入磁道号串选择功3调短寻道时间优先调度算法算法动调排序函数输入磁道号排序然输入前磁道号5根算法输出寻求序列算出均寻道时间图7示:
图7 短寻道时间优先调度算法
(5)选择功5系统调循环扫描调度算法先排序输入前磁道号果前磁道号磁道号者磁道号算法直接输出寻求序列里前磁道号输入30磁道号磁道号中间继续选择前磁道移动方选择外移动结果图8示:
图8 循环扫描调度算法
(6)功选择6选择否退出系统果确定退出输入写写y输入数确认退出确认退出图9示:
图9 退出系统
7 课设总结
次操作系统课程设计老师六题目觉擦盘调度块学较扎实理知识理解错选择磁盘调度算法实现程序没实现服务磁道进行记录根磁盘调度算法思想需实现功样利新进程进行服务程序写死算法简化磁盘调度算法简单模拟现磁道号串请求服务
磁盘调度算法总分四算法算法思想介绍优缺点理知识理解代表算法实现算法实现程中感觉较吃力算法整体简单数组进行数定义调算法函数里含两参数int cidao[]int m难点非常清楚明白两参数样赋值?间关系样?起初搞懂根知道代码表达老师细心讲解知道磁道数直接输入函数里返回值进行赋值样修改程序结构没什问题外难点磁道长度计算难较复杂考虑情况非常断调试错误发现改正终写成现较完整程序
通次课程次认识现掌握关程序实现知识非常少程序中避免输入错误函数前没见次熟练知道法程序没视化界面实现方面容解想会抽空学毕竟较感兴趣
8 参考文献
[1]汤丹梁红兵哲凤屏汤子瀛计算机操作系统[M]西安电子科技学出版社2007194196
[2]郑秋生C++程序设计教程[M]电子工业出版社2007
[3]严蔚敏数结构[M]清华学出版社2007
9 源代码
#include
#include
#include
#include
#include
#define maxsize 1000
main()
int *paixu(int cidao[]int m) 泡算法
{
int ijtemp
for(i0i
if(cidao[i]>cidao[j])
{
tempcidao[i]
cidao[i]cidao[j]
cidao[j]temp
}
}
cout<<排序磁盘序列:
for( i0i
cout<
cout<
}
先先服务调度算法
void FCFS(int cidao[]int m) 磁道号数组数m
{
int now前磁道号
int ji
int sum0 总寻道长度
float ave 均寻道长度
cout<<选择先先服务调度算法<
for(i0i
cout<
cout<
A cin>>now
if(cinfail())
{
cout<<输入数类型错误请重新输入:<
cinignore() 忽略刚流中字符
goto A
}
sum+abs(cidao[0]now) sumsum + |(第磁道号)(前磁道)|
cout<<磁盘扫描序列:
for(i0i
cout<
if(m1)
{
ave(float)(sum)(float)m
cout<<均寻道长度:<
else
{
for(i0j1j
sum+abs(cidao[j]cidao[i])
ave(float)(sum)(float)(m)
}
cout<
}
短寻道时间优先调度算法
void SSTF(int cidao[]int m)
{
int ij
int nowlr
int k1sum0
float ave
cout<<选择短寻道时间优先调度算法:<
cout<<请输入前磁道号:
B cin>>now
if(cinfail())
{
cout<<输入数类型错误请重新输入:<
cinignore() 忽略刚流中字符
goto B
}
前磁道号请求序列中者直接次予请求服务
if(cidao[m1]
cout<<磁盘扫描序列:
for(im1i>0i)
cout<
}
前磁道号请求序列中者直接次予请求服务
if(cidao[0]>now)
{
cout<<磁盘扫描序列:
for(i0i
}
前磁道号请求序列中者者
if(now
{
cout<<磁盘扫描序列:
while(cidao[k]
k++ k离now磁道坐标
}
lk1 lnow左边磁道坐标
rk rnow右边磁道坐标
while((l>0)&&(r
选择前磁道请求予服务
if((nowcidao[l])<(cidao[r]now))
{
cout<
nowcidao[l]
ll1
}
else
{
cout<
nowcidao[r]
rr+1
}
}
if(l1) 磁头移动序列号返回外侧扫描未扫描磁道
{
for(jrj
cout<
sum+cidao[m1]cidao[0]
}
else 磁头移动序列号返回侧扫描未扫描磁道
{
for(jlj>0j)
{
cout<
sum+cidao[m1]cidao[0]
}
}
ave(float)(sum)(float)(m)
cout<
扫描调度算法
void SCAN(int cidao[]int m) 先出前磁道号移动臂移动方
{
int ij
int nowlr
int k1sum0
float ave
cout<<选择扫描调度算法:<
cout<<请输入前磁道号:
C cin>>now
if(cinfail())
{
cout<<输入数类型错误请重新输入:<
cinignore() 忽略刚流中字符
goto C
}
前磁道号请求序列中者直接次予请求服务
if(cidao[m1]
cout<<磁盘扫描序列:
for(im1i>0i)
cout<
}
前磁道号请求序列中者直接次予请求服务
if(cidao[0]>now)
{
cout<<磁盘扫描序列:
for(i0i
}
前磁道号请求序列中者者时
if(now
{
while(cidao[k]
k++
}
lk1
rk
int d
cout<<请输入前移动臂移动方 (1 表示 0表示外) <
if(d1 && d0)
{
cout<<数输入错误请重新输入:<
}
if(d0) 选择移动臂磁道号减方扫描
{
cout<<磁盘扫描序列:
for(jlj>0j)
{
cout<
磁头移动号改变方扫描未扫描磁道
for(jrj
cout<
sumnowcidao[0]+cidao[m1]cidao[0]
}
else 选择移动臂磁道号增加方扫描
{
cout<<磁盘扫描序列:
for(jrj
cout<
磁头移动号改变方扫描未扫描磁道
for(jlj>0j)
{
cout<
sumcidao[m1]now+cidao[m1]cidao[0]
}
}
ave(float)(sum)(float)(m)
cout<
循环扫描调度算法
void CSCAN(int cidao[]int m)
{
int ij
int nowlr
int k1sum0
float ave
cout<<选择循环扫描调度算法:<
cout<<请输入前磁道号:
D cin>>now
if(cinfail())
{
cout<<输入数类型错误请重新输入:<
cinignore() 忽略刚流中字符
goto D
}
前磁道号请求序列中者移动臂直接次予请求服务
if(cidao[m1]
cout<<磁盘扫描序列:
for(i0i
}
前磁道号请求序列中者移动臂直接次予请求服务
if(cidao[0]>now)
{
cout<<磁盘扫描序列:
for(i0i
}
前磁道号请求序列中者者
if(now
{
cout<<磁盘扫描序列:
while(cidao[k]
k++
}
lk1
rk
int d
cout<<请输入前移动臂移动方 (1 表示 0表示外)
F cin>>d
if(d1 && d0)
{
cout<<数输入错误请重新输入:<
}
if(d0) 选择移动臂磁道号减方扫描
{
if(nowcidao[r])
{
for(jrj>0j)
{
cout<
扫描完号磁道磁头直接移动号磁道次予未服务磁道服务
for(jm1j>rj)
{
cout<
sum+nowcidao[0]+cidao[m1]cidao[0]+cidao[m1]cidao[r+1]
}
else
{
for(jlj>0j)
{
cout<
扫描完号磁道磁头直接移动号磁道次予未服务磁道服务
for(jm1j>lj)
{
cout<
sum+nowcidao[0]+cidao[m1]cidao[0]+cidao[m1]cidao[r]
}
}
else 选择移动臂磁道号增加方扫描
{
for(jrj
cout<
扫描完号磁道磁头直接移动号磁道次服务磁道予服务
for(j0j
cout<
sumcidao[m1]now+cidao[m1]cidao[0]+cidao[l]cidao[0]
}
}
ave(float)(sum)(float)(m)
cout<
void Exit()
{
char ch
cout<<选择退出<
if(ch'Y' || ch'y')
{
cout<<谢谢见^_^<
else
{
cout<<选择返回界面<
system(cls)
main()
}
}
int shuru(int cidao[])
{
int n
cout<<选择输入:<
cout<<请次输入<
cin>>cidao[i]
if(cinfail())
{
cout<<输入数类型错误请重新输入:<
cinignore() 忽略刚流中字符
goto H
}
}
cout<<输入磁道序列:
for(i0i
cout<
return n
}
int main()
{
int cidao[maxsize]
int code 选择算法
int m cout<<\t\t\t\t<
{
cout<<\t\tXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\t\t<
if(code1 && code2 && code3 && code4 && code5 && code6)
{
cout<<数输入错误请重新输入:<
}
switch(code)
{
case 1 调输入函数
mshuru(cidao)
break
case 2 FCFS算法
FCFS(cidaom)
break
case 3 SSTF算法
SSTF(cidaom)
break
case 4 SCAN算法
SCAN(cidaom)
break
case 5 CSCAN算法
CSCAN(cidaom)
break
case 6
break
default
break
}
if( code6)
{
Exit()
break
}
cout<
system(cls)
} while(codeNULL)
return 0
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档