推荐-FIFO磁盘调度算法操作系统课程设计报告1 精品
更新时间:2023-04-11 23:49:01 阅读量: 实用文档 文档下载
- fifo调度算法例题推荐度:
- 相关推荐
哈尔滨理工大学
课程设计
(计算机操作系统)题目:FIFO磁盘调度算法
班级:
姓名:
指导教师:
系主任:
20XX年03月01日
目录
5
5
5
6
6
1FIFO磁盘调度算法课程设计
1.1题目分析
本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务磁盘调度算法的理解。
这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
1.2数据结构
1 先来先服务算法模块:void FCFS(int array[],int m)
输入磁道号,按先来先服务的策略输出磁盘请求序列,求平均寻道长度,输出移动平均磁道数。
主要代码:for(i=0,j=1;j { sum+=abs(array[j]-array[i]); ave=(float)(sum)/(float)(m); } 1.3流程图 FIFO算法流程图: 1.4实现技术 为实现上述设计,采用C++语言,VS20XX开发环境。具体采用的技术如下:(1) (2) 实现步骤如下: (1)输入磁道序列、当前磁道号 (2)FIFO磁盘调度 (3)输出平均磁道数 运行结果如下: 1.5设计结论和心得 通过课程设计得到如下结论: (1)本系统具有很强的健壮性,当输入错误数据类型时,系统提示用户输入的数据类型错误,让用户重新输入,保证系统的稳定性,不会因为用户的误操作而致使系统瘫痪;虽然是在dos状态下,但是本系统界面还是设计的比较漂亮的,具有比较好的交互性;对于软件中的重用代码,设计成一个函数,实现代码重用。本系统是在dos状态下进行编译执行的,没有图形化界面,可以设计出一个图形化界面,使用户操作更加简单,明了。 有如下几点心得体会: (1)通过此次课程设计,我对操作系统的基础知识了解得更透彻了,同时对磁盘调度的四种算法——先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)有了更深刻的理解和掌握,使我能够为磁盘调度选择适当的算法,提高CPU工作效率。设计过程中遇到的困难在老师和同学的帮助下顺利解决并通过了验收,我深刻认识到算法的逻辑性对程序的重要影响,算法的准确度对程序运行结果的重要影响,这对我以后在操作系统的学习中有极大帮助。 2 Linux代码分析 为了进一步了解操作系统内核,学习了Linux操作系统的进程同步程序,主要程序源代码如下: #include #include #include #include #define maxsize 1000 /*********************判断输入数据是否有效**************************/ int decide(char str[]) //判断输入数据是否有效 { int i=0; while(str[i]!='\0') { if(str[i]<'0'||str[i]>'9') { return 0; break; } i++; } return i; } /******************将字符串转换成数字***********************/ int trans(char str[],int a) //将字符串转换成数字 { int i; int sum=0; for(i=0;i { sum=sum+(int)((str[i]-'0')*pow(10,a-i-1)); } return sum; } /*********************冒泡排序算法**************************/ int *bubble(int cidao[],int m) { int i,j; int temp; for(i=0;i for(j=i+1;j { if(cidao[i]>cidao[j]) { temp=cidao[i]; cidao[i]=cidao[j]; cidao[j]=temp; } } cout<<"排序后的磁盘序列为:"; for( i=0;i { cout< } cout< return cidao; } /*********************先来先服务调度算法**************************/ void FCFS(int cidao[],int m) //磁道号数组,个数为m { int now;//当前磁道号 int sum=0; //总寻道长度 int j,i; int a; char str[100]; float ave; //平均寻道长度 cout<<"磁盘请求序列为:"; for( i=0;i { cout< } cout< cout<<"请输入当前的磁道号:"; B: cin>>str; //对输入数据进行有效性判断 a=decide(str); if(a==0) { cout<<"输入数据的类型错误,请重新输入!"< goto B; } else now=trans(str,a); //输入当前磁道号 sum+=abs(cidao[0]-now); cout<<"磁盘扫描序列为:"; for( i=0;i { cout< } for(i=0,j=1;j { sum+=abs(cidao[j]-cidao[i]); ave=(float)(sum)/(float)(m); } cout< cout<<"平均寻道长度:"< } /**********************最短寻道时间优先调度算法********************/ void SSTF(int cidao[],int m) { int k=1; int now,l,r; int i,j,sum=0; int a; char str[100]; float ave; cidao=bubble(cidao,m); //调用冒泡排序算法排序 cout<<"请输入当前的磁道号:"; C: cin>>str; //对输入数据进行有效性判断 a=decide(str); if(a==0) { cout<<"输入数据的类型错误,请重新输入!"< goto C; } else now=trans(str,a); //输入当前磁道号 if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务 { cout<<"磁盘扫描序列为:"; for(i=m-1;i>=0;i--) cout< sum=now-cidao[0]; } if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务 { cout<<"磁盘扫描序列为:"; for(i=0;i cout< sum=cidao[m-1]-now; } if(now>cidao[0]&&now { cout<<"磁盘扫描序列为:"; while(cidao[k] { k++; } l=k-1; r=k; while((l>=0)&&(r { if((now-cidao[l])<=(cidao[r]-now)) //选择与当前磁道最近的请求给予服务 { cout< sum+=now-cidao[l]; now=cidao[l]; l=l-1; } else { cout< sum+=cidao[r]-now; now=cidao[r]; r=r+1; } } if(l==-1) //磁头移动到序列的最小号,返回外侧扫描仍未扫描的磁道 { for(j=r;j { cout< } sum+=cidao[m-1]-cidao[0]; } else //磁头移动到序列的最大号,返回内侧扫描仍未扫描的磁道 { for(j=l;j>=0;j--) { cout< } sum+=cidao[m-1]-cidao[0]; } } ave=(float)(sum)/(float)(m); cout< cout<<"平均寻道长度:"< } /*****************************扫描调度算法*******************************/ void SCAN(int cidao[],int m) //先要给出当前磁道号和移动臂的移动方向 { int k=1; int now,l,r,d; int i,j,sum=0; int a; char str[100]; float ave; cidao=bubble(cidao,m); //调用冒泡排序算法排序 cout<<"请输入当前的磁道号:"; D: cin>>str; //对输入数据进行有效性判断 a=decide(str); if(a==0) { cout<<"输入数据的类型错误,请重新输入!"< goto D; } else now=trans(str,a); //输入当前磁道号 if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接由外向内 依次给予各请求服务,此情况同最短寻道优先 { cout<<"磁盘扫描序列为:"; for(i=m-1;i>=0;i--) cout< sum=now-cidao[0]; } if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先 { cout<<"磁盘扫描序列为:"; for(i=0;i cout< sum=cidao[m-1]-now; } if(now>cidao[0]&&now { while(cidao[k] { k++; } l=k-1; r=k; cout<<"请输入当前移动臂的移动的方向(1 表示向外,0表示向内) : "; cin>>d; if(d==0) //选择移动臂方向向内,则先向内扫描 { cout<<"磁盘扫描序列为:"; for(j=l;j>=0;j--) { cout< } for(j=r;j { cout< } sum=now-2*cidao[0]+cidao[m-1]; } else //选择移动臂方向向外,则先向外扫描 { cout<<"磁盘扫描序列为:"; for(j=r;j { cout< } for(j=l;j>=0;j--) //磁头移动到最大号,则改变方向向内扫描未扫描的磁道 { cout< } sum=-now-cidao[0]+2*cidao[m-1]; } } ave=(float)(sum)/(float)(m); cout< cout<<"平均寻道长度:"< } /************************循环扫描调度算法*****************************/ void CSCAN(int cidao[],int m) { int k=1; int now,l,r; int i,j,sum=0; int a; char str[100]; float ave; cidao=bubble(cidao,m); //调用冒泡排序算法排序 cout<<"请输入当前的磁道号:"; E: cin>>str; //对输入数据进行有效性判断 a=decide(str); if(a==0) { cout<<"输入数据的类型错误,请重新输入!"< goto E; } else now=trans(str,a); //输入当前磁道号 if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接将移动臂移动到最小号磁道依次向外给予各请求服务 { cout<<"磁盘扫描序列为:"; for(i=0;i cout< sum=now-2*cidao[0]+cidao[m-1]; } if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先 { cout<<"磁盘扫描序列为:"; for(i=0;i cout< sum=cidao[m-1]-now; } if(now>cidao[0]&&now { cout<<"磁盘扫描序列为:"; while(cidao[k] { k++; } l=k-1; r=k; for(j=r;j { cout< } for(j=0;j { cout< } sum=2*cidao[m-1]+cidao[l]-now-2*cidao[0]; } ave=(float)(sum)/(float)(m); cout< cout<<"平均寻道长度:"< } void main() { int a; int c; //菜单项 int cidao[maxsize]; int i=0,count; char str[100]; cout<<"请输入磁道序列(0结束):"< 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<<"输入数据的类型错误,请重新输入!"< else { cidao[i]=trans(str,a); i++; } } count=i-1; //要访问的磁道数 cout<<"你输入的磁道序列为:"; for(i=0;i { cout< } cout< while(1) { cout< cout<<"**********************************************"< cout<<"****** 系统菜单******"< cout<<"**********************************************"< cout<<"*** ***"< cout<<"** 1. 先来先服务**"< cout<<"*** ***"< cout<<"**********************************************"< cout<<"**********************************************"< G:cout<<"请选择算法:"; F:cin>>str; //对输入数据进行有效性判断 a=decide(str); if(a==0) { cout<<"输入数据的类型错误,请重新输入!"< goto F;//输入错误,跳转到F,重新输入 } else c=trans(str,a); if(c==5) break; if(c>5) { cout<<"数据输入错误!请重新输入"< goto G; } switch(c) { case 1: //使用FCFS算法 FCFS(cidao,count); break; case 2: //使用SSTF算法 SSTF(cidao,count); break; case 3: //使用SCAN算法 SCAN(cidao,count); break; case 4: //使用CSCAN算法 CSCAN(cidao,count); break; } } } 2.1功能说明 这一段程序的主要功能为: (1)这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。 2.2接口说明 本程序的输入参数为: 磁盘请求序列:23 54 862 656 56 76 32 当前磁道号87 输出结果为: 2.3局部数据结构 本程序共有。。。个局部变量及数据结构,其类型定义及语义如下: 主要代码:for(i=0,j=1;j { sum+=abs(array[j]-array[i]); ave=(float)(sum)/(float)(m); } 2.4流程图 登录模块参数输入模算法实现模 2.5以实例说明运行过程 例如, 本程序的输入参数为: 磁盘请求序列:23 54 862 656 56 76 32 当前磁道号87 输出结果为: 实际运行结果如下
正在阅读:
推荐-FIFO磁盘调度算法操作系统课程设计报告1 精品04-11
2022年中山大学S3605001有机化学复试实战预测五套卷04-04
供应商质量保证协议书(新版)02-29
立定跳远教学反思12-23
2017-2022年中国饲料磷酸盐市场发展趋势研究报告(目录) - 图文01-09
浅谈核心素养下的高中生物教学04-01
克服恐惧作文700字07-02
一个人的作业作文800字07-11
幼儿基本信息表06-03
2022年人民调解工作的考察报告范文04-16
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 调度
- 磁盘
- 算法
- 操作系统
- 课程
- 报告
- 精品
- 推荐
- 设计
- FIFO
- 2022卓越学案高考总复习·英语(外研版)选修8Module 3知能训练轻
- 2022年全国普通高等学校招生统一考试历史(新课标1卷精编版)
- 2022年辽宁大学新闻与传播学院334新闻与传播专业综合能力[专业硕
- 供应商与顾客关系管理 练习题
- 部编版小学语文三年级下册 《荷花》 教案
- 四川南充市高考英语二轮阅读类测试(含写作)(1)
- 2022年八年级地理会考复习资料
- 【南方新课堂】2015-2022学年高中化学2.1.2化学键与化学反应中的
- 全镇换届重、难点村整顿具体实施方案(最新)
- 某真空击密处理地基工程监理规划
- google被限制登录不了,如何登陆上gmail邮箱妙计
- 2022新编人教版(八下)英语导学案Unit1What’sthematter第四课时S
- 中国冷链物流行业现状分析及发展趋势预测报告XXXX-2022年
- 2022年基督徒新年贺词大全-范文汇编
- 《经济法基础》-习题班_企业所得税、个人所得税法律制度(24页)
- 关于商业银行建立普惠金融体系的思考
- 初中化学_专题复习 溶液 溶解度教学设计学情分析教材分析课
- 2022-2022学年度第二学期清远市高一年级期末质量检测有答案(无听
- 2012-二级人力资源管理师考试背书要点
- 精选九年级英语下册Unit8CultureShapesUsLesson45DifferentManne