磁盘调度算法
更新时间:2024-05-29 13:55:01 阅读量: 综合文库 文档下载
实验六
磁盘调度算法
【实验目的】
通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。
【实验内容】
问题描述:
设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。
程序要求:
1)利用先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法模拟磁道访问过程。
2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。
3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。
4)输出:每种算法的平均寻道长度。
实现提示:
用C++语言实现提示:
1)程序中变量定义参考(根据需要可添加)如下:
const int MaxNumber=100; int TrackOrder[MaxNumber]; int MoveDistance[MaxNumber]; double AverageDistance; bool direction;
2)页面置换的实现过程如下: ? 变量初始化;
? 接收用户输入磁道个数n和磁盘访问序列,选择算法1-FCFS,2-SSTF,3-SCAN,4-循环SCAN,输入开始磁盘号m和磁头移动方向;
? 根据用户选择的算法进行磁道访问,输出磁盘调度算法的模拟过程;
? 计算选择每次移动的磁头移动距离和算法的平均寻道长度;
?
输出选择算法的平均寻道长度。
实验要求:
1)上机前认真复习磁盘调度算法,熟悉FCFS、SSTF、SCAN和循环SCAN算法的过程;
2)上机时独立编程、调试程序;
3)根据具体实验要求,完成好实验报告(包括实验的目的、内
容、要求、源程序、实例运行结果截图、发现的问题以及解决方法)。 【实验分析】
需求分析:
(1) 按提示输入磁道个数,不得大于MaxNum;依次输入磁盘访问序列;按提示输入开始磁道号,磁头移动方向(1为磁道号增加方向,0为磁道号减少方向);根据提示输入要进行的算法类型,1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。
(2) 输出的形式:先输出每次访问的磁道号和移动的磁头移动距离,最后输出平均寻道长度。
(3) 程序所能达到的功能:根据用户选择的算法进行磁道访问,输出磁盘调度算法的模拟过程,输出每次移动的磁头移动距离和算法的平均寻道长度。
(4) 测试数据: 输入数据分别为:9
55 58 39 18 90 160 150 38 184 100 1 输入:1
输出:被访问的下一个磁道号55 移动距离(磁道数)45
被访问的下一个磁道号58 移动距离(磁道数)3 被访问的下一个磁道号39 移动距离(磁道数)19 被访问的下一个磁道号18 移动距离(磁道数)21
被访问的下一个磁道号90 移动距离(磁道数)72 被访问的下一个磁道号160 移动距离(磁道数)70 被访问的下一个磁道号150 移动距离(磁道数)10 被访问的下一个磁道号38 移动距离(磁道数)112 被访问的下一个磁道号184 移动距离(磁道数)146 平均寻道长度:55.3333 输入:2
输出:被访问的下一个磁道号90 移动距离(磁道数)10
被访问的下一个磁道号58 移动距离(磁道数)32 被访问的下一个磁道号55 移动距离(磁道数)3 被访问的下一个磁道号39 移动距离(磁道数)16 被访问的下一个磁道号38 移动距离(磁道数)1 被访问的下一个磁道号18 移动距离(磁道数)20 被访问的下一个磁道号150 移动距离(磁道数)132 被访问的下一个磁道号160 移动距离(磁道数)10 被访问的下一个磁道号184 移动距离(磁道数)24 平均寻道长度:27.5556 输入:3
输出:被访问的下一个磁道号150 移动距离(磁道数)50
被访问的下一个磁道号160 移动距离(磁道数)10 被访问的下一个磁道号184 移动距离(磁道数)24 被访问的下一个磁道号90 移动距离(磁道数)94
被访问的下一个磁道号58 移动距离(磁道数)32 被访问的下一个磁道号55 移动距离(磁道数)3 被访问的下一个磁道号39 移动距离(磁道数)16 被访问的下一个磁道号38 移动距离(磁道数)1 被访问的下一个磁道号18 移动距离(磁道数)20 平均寻道长度:27.7778 输入:4
输出:被访问的下一个磁道号150 移动距离(磁道数)50
被访问的下一个磁道号160 移动距离(磁道数)10 被访问的下一个磁道号184 移动距离(磁道数)24 被访问的下一个磁道号18 移动距离(磁道数)166 被访问的下一个磁道号38 移动距离(磁道数)20 被访问的下一个磁道号39 移动距离(磁道数)1 被访问的下一个磁道号55 移动距离(磁道数)16 被访问的下一个磁道号58 移动距离(磁道数)3 被访问的下一个磁道号90 移动距离(磁道数)32 平均寻道长度:35.7778 概要设计:
(1)本程序中用到的数据的定义:
const int MaxNumber=100;
int TrackOrder[MaxNumber];//存放磁盘访问序列 int MoveDistance[MaxNumber];//存放每次的寻道长度 int VisitOrder[MaxNumber];//存放访问的顺序 bool direction;//磁头移动方向 int n;//磁道个数 int m;//开始磁道号 (2)主程序的流程:
变量初始化=》用户选择执行的算法=》若不符合条件,则退=》若符合,执行算法=》输出结果
(3)各程序模块之间的层次(调用)关系。
主程序调用初始化模块以及算法模块、输出模块
详细设计
实现程序模块的具体算法。 #include
int TrackOrder[MaxNumber];//存放磁盘访问序列 int MoveDistance[MaxNumber];//存放每次的寻道长度 int VisitOrder[MaxNumber];//存放访问的顺序 bool direction;//磁头移动方向 int n;//磁道个数 int m;//开始磁道号
出 void init(){//变量初始化 cout<<\输入磁道个数\ cin>>n;
cout<<\磁盘访问序列\ for(int i=0;i
cout<<\输入开始磁道号\ cin>>m;
cout<<\输入磁头移动方向,1为磁道号增加方向,0为磁道号减少方向\
cin>>direction; }
void fcfs(){
for(int i=0;i MoveDistance[i]=m-TrackOrder[i]; else MoveDistance[i]=TrackOrder[VisitOrder[i-1]]-TrackOrder[i];//按输入的磁盘访问序列寻道,寻道长度为前一个访问的磁道号减 当前访问的 } } void shunxu(){//排序,从小到大排列磁盘访问序列 for(int i=1;i if(TrackOrder[j]>TrackOrder[j+1]){ int temp=TrackOrder[j+1]; TrackOrder[j+1]=TrackOrder[j]; TrackOrder[j]=temp;//冒泡排序 } } } } void sstf(){ shunxu(); int i; int temp; for(i=0;i break; } }//找到小于开始磁道号的最后一个元素 if(abs(TrackOrder[temp]-m)>abs(TrackOrder[temp+1]-m)){//比较小于开始磁道号的最后一个元素和下一个元素哪个离开始磁道号远 VisitOrder[0]=temp+1; MoveDistance[0]=TrackOrder[temp+1]-m; temp=temp+1; } else{ VisitOrder[0]=temp; MoveDistance[0]=TrackOrder[temp]-m; }//取距离小的那个为第一个访问的元素 int h=temp-1; int k=temp+1; i=1; while(h>-1&&k if(abs(TrackOrder[h]-TrackOrder[VisitOrder[i-1]])>abs(TrackOrder[k]-TrackOrder[VisitOrder[i-1]])){ VisitOrder[i]=k; MoveDistance[i]=TrackOrder[VisitOrder[i-1]]-TrackOrder[k]; ++i; k++; } else{ VisitOrder[i]=h; MoveDistance[i]=TrackOrder[VisitOrder[i-1]]-TrackOrder[h]; ++i; h--; } } if(h==-1){ for(;k MoveDistance[i]=TrackOrder[VisitOrder[i-1]]-TrackOrder[k]; ++i; } } else{ for(;h>-1;--h){ VisitOrder[i]=h; MoveDistance[i]=TrackOrder[VisitOrder[i-1]]-TrackOrder[h]; ++i; } } } void scan(){ shunxu(); int k,i; k=1; int temp; if(direction){//若向磁道号增加方向访问 for(i=0;i if(TrackOrder[i]>100){//找到第一个大于开始磁道号的元素 temp=i; VisitOrder[0]=i; MoveDistance[0]=TrackOrder[i]-100; break; } } ++i; while(i MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; ++i; ++k; } i=temp-1;//遍历完后,回到刚刚第一个大于开始磁道号的元素的前一个向前遍历 while(i>-1){ VisitOrder[k]=i; MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; --i; ++k; } } else{//若向磁道号减小方向访问 for(i=0;i if(TrackOrder[i+1]>100){//找到最后一个小于磁道号的元素 temp=i; VisitOrder[0]=i; MoveDistance[0]=TrackOrder[i]-100; break; } } --i;//向前遍历 while(i>-1){ VisitOrder[k]=i; MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; --i; ++k; } i=temp+1;//遍历完后,回到刚刚最后一个小于开始磁道号的元素的后一个向后遍历 while(i MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; ++i; ++k; } } } void cscan(){ shunxu(); int k,i; k=1; int temp; if(direction){//若向磁道号增加方向访问 for(i=0;i if(TrackOrder[i]>100){//找到第一个大于开始磁道号的元素 temp=i; VisitOrder[0]=i; MoveDistance[0]=TrackOrder[i]-100; break; } } ++i; while(i MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; ++i; ++k; } i=0;//遍历完再从第一个元素开始遍历 while(i MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; ++i; ++k; } } else{//若向磁道号减小方向访问 for(i=0;i if(TrackOrder[i+1]>100){//找到最后一个小于磁道号的元素 temp=i; VisitOrder[0]=i; MoveDistance[0]=TrackOrder[i]-100; break; } } --i;//向前遍历 while(i>-1){ VisitOrder[k]=i; MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; --i; ++k; } i=n-1;//遍历完后从最后一个元素向前遍历 while(i>temp){ VisitOrder[k]=i; MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; --i; ++k; } } } void output(){ int sum=0;//求磁道数总和 for(int i=0;i 被 访 问 的 下 一 个 磁 道 号 \移动距离(磁道数)\ sum=sum+abs(MoveDistance[i]); } cout<<\平均寻道长度:\输出平均寻道长度 } void main(){ init(); int a; cout<<\选择算法,1-FCFS,2-SSTF,3-SCAN,4-循环SCAN\ cin>>a; switch(a){ case(1): fcfs();break; case(2): sstf();break; case(3): scan();break; case(4): cscan();break; }//根据用户选择的算法进行磁盘调度算法 output(); } 调试分析 1、 执行算法前,要先申请变量。 2、 执行后面三种算法时,要注意先将磁道序列从小到大排序。 3、 执行SSTF算法时,先找到小于开始磁道号的最后一个元素, 以此元素为分割点,向前和向后遍历序列,每次移动一个,比较出离前一个访问的磁道号近的访问。 4、 执行SCAN和CSCAN算法时,要先判断用户输入的是向磁道 号增加的方向执行还是向磁道号减少的方向执行。 5、 时间的复杂度是O(n). 用户使用说明 按提示输入磁道个数,不得大于MaxNum;依次输入磁盘访问序列;按提示输入开始磁道号,磁头移动方向(1为磁道号增加方向,0为磁道号减少方向);根据提示输入要进行的算法类型,1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。 测试结果 输入数据分别为:9 55 58 39 18 90 160 150 38 184 100 1 输入:1 输出:被访问的下一个磁道号55 移动距离(磁道数)45 被访问的下一个磁道号58 移动距离(磁道数)3 被访问的下一个磁道号39 移动距离(磁道数)19 被访问的下一个磁道号18 移动距离(磁道数)21 被访问的下一个磁道号90 移动距离(磁道数)72 被访问的下一个磁道号160 移动距离(磁道数)70 被访问的下一个磁道号150 移动距离(磁道数)10 被访问的下一个磁道号38 移动距离(磁道数)112 被访问的下一个磁道号184 移动距离(磁道数)146 平均寻道长度:55.3333 输入:2 输出:被访问的下一个磁道号90 移动距离(磁道数)10 被访问的下一个磁道号58 移动距离(磁道数)32 被访问的下一个磁道号55 移动距离(磁道数)3 被访问的下一个磁道号39 移动距离(磁道数)16 被访问的下一个磁道号38 移动距离(磁道数)1 被访问的下一个磁道号18 移动距离(磁道数)20 被访问的下一个磁道号150 移动距离(磁道数)132 被访问的下一个磁道号160 移动距离(磁道数)10 被访问的下一个磁道号184 移动距离(磁道数)24 平均寻道长度:27.5556 输入:3 输出:被访问的下一个磁道号150 移动距离(磁道数)50 被访问的下一个磁道号160 移动距离(磁道数)10 被访问的下一个磁道号184 移动距离(磁道数)24 被访问的下一个磁道号90 移动距离(磁道数)94 被访问的下一个磁道号58 移动距离(磁道数)32 被访问的下一个磁道号55 移动距离(磁道数)3 被访问的下一个磁道号39 移动距离(磁道数)16 被访问的下一个磁道号38 移动距离(磁道数)1 被访问的下一个磁道号18 移动距离(磁道数)20 平均寻道长度:27.7778 输入:4 输出:被访问的下一个磁道号150 移动距离(磁道数)50 被访问的下一个磁道号160 移动距离(磁道数)10 被访问的下一个磁道号184 移动距离(磁道数)24 被访问的下一个磁道号18 移动距离(磁道数)166 被访问的下一个磁道号38 移动距离(磁道数)20 被访问的下一个磁道号39 移动距离(磁道数)1 被访问的下一个磁道号55 移动距离(磁道数)16 被访问的下一个磁道号58 移动距离(磁道数)3 被访问的下一个磁道号90 移动距离(磁道数)32 平均寻道长度:35.7778
正在阅读:
磁盘调度算法05-29
最新人教版二年级语文下册19大象的耳朵第二课时公开课教学设计07-09
国际税收学习要点11-15
高级园林绿化工试题库(含答案)05-06
浅谈形体礼仪课对中职学校空乘专业的意义12-19
流体力学泵与风机期末试卷与答案11-23
我的爸爸作文1500字07-07
素质教育材料分析题06-16
诗词五首08-25
信息技术基础复习提纲 - 图文07-05
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 调度
- 磁盘
- 算法
- XX污水处理厂监理大纲
- 135战法面授日记--股票
- 大学物理课后习题答案(高教版 共三册)
- 海上货物流通的法律衔接问题研究
- 成本控制开题报告
- 工程审计中的问题和对策
- 网络营销学习指导与练习教材习题答案
- 化学校本课程《趣味化学实验》
- 《模拟电子技术》复习题10套及答案
- 07款别克君威使用说明书
- 境内机构外债-国家外汇管理局
- 吉林农业大学《食品包装学》课件考试知识要点
- 银行数据质量管理暂行办法
- 新高中物理第四章电磁感应5电磁感应现象的两类情况学案新人教版
- 新概念题归纳版
- 数控实习报告 - 图文
- 江苏省无锡市南长实验中学2015-2016学年七年级数学下学期第一次
- 苏教版四年级下册导学案《云雀的心愿》
- VB程序设计考试题(A卷)dd(1)
- Visual Basic企业员工管理系统设计(含源文件)