磁盘调度算法.doc_第1页
磁盘调度算法.doc_第2页
磁盘调度算法.doc_第3页
磁盘调度算法.doc_第4页
磁盘调度算法.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验六磁盘调度算法【实验目的】通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务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 TrackOrderMaxNumber;int MoveDistanceMaxNumber;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 1841001输入: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 TrackOrderMaxNumber;/存放磁盘访问序列int MoveDistanceMaxNumber;/存放每次的寻道长度int VisitOrderMaxNumber;/存放访问的顺序bool direction;/磁头移动方向int n;/磁道个数int m;/开始磁道号(2) 主程序的流程: 变量初始化=用户选择执行的算法=若不符合条件,则退出=若符合,执行算法=输出结果(3) 各程序模块之间的层次(调用)关系。 主程序调用初始化模块以及算法模块、输出模块详细设计实现程序模块的具体算法。#include using namespace std;const int MaxNumber=100;int TrackOrderMaxNumber;/存放磁盘访问序列int MoveDistanceMaxNumber;/存放每次的寻道长度int VisitOrderMaxNumber;/存放访问的顺序bool direction;/磁头移动方向int n;/磁道个数int m;/开始磁道号void init()/变量初始化cout输入磁道个数n;cout磁盘访问序列endl;for(int i=0;iTrackOrderi;cout输入开始磁道号m;cout输入磁头移动方向,1为磁道号增加方向,0为磁道号减少方向direction;void fcfs()for(int i=0;in;+i)VisitOrderi=i;if(i=0)MoveDistancei=m-TrackOrderi;elseMoveDistancei=TrackOrderVisitOrderi-1-TrackOrderi;/按输入的磁盘访问序列寻道,寻道长度为前一个访问的磁道号减当前访问的void shunxu()/排序,从小到大排列磁盘访问序列for(int i=1;in;+i)for(int j=0;jTrackOrderj+1)int temp=TrackOrderj+1;TrackOrderj+1=TrackOrderj;TrackOrderj=temp;/冒泡排序void sstf()shunxu();int i;int temp;for(i=0;im)temp=i;break;/找到小于开始磁道号的最后一个元素if(abs(TrackOrdertemp-m)abs(TrackOrdertemp+1-m)/比较小于开始磁道号的最后一个元素和下一个元素哪个离开始磁道号远VisitOrder0=temp+1;MoveDistance0=TrackOrdertemp+1-m;temp=temp+1;elseVisitOrder0=temp;MoveDistance0=TrackOrdertemp-m;/取距离小的那个为第一个访问的元素int h=temp-1;int k=temp+1;i=1;while(h-1&kabs(TrackOrderk-TrackOrderVisitOrderi-1)VisitOrderi=k;MoveDistancei=TrackOrderVisitOrderi-1-TrackOrderk;+i;k+;elseVisitOrderi=h;MoveDistancei=TrackOrderVisitOrderi-1-TrackOrderh;+i;h-;if(h=-1)for(;k-1;-h)VisitOrderi=h;MoveDistancei=TrackOrderVisitOrderi-1-TrackOrderh;+i;void scan()shunxu();int k,i;k=1;int temp;if(direction)/若向磁道号增加方向访问for(i=0;i100)/找到第一个大于开始磁道号的元素temp=i;VisitOrder0=i;MoveDistance0=TrackOrderi-100;break;+i;while(i-1)VisitOrderk=i;MoveDistancek=TrackOrderVisitOrderk-1-TrackOrderi;-i;+k;else/若向磁道号减小方向访问for(i=0;i100)/找到最后一个小于磁道号的元素temp=i;VisitOrder0=i;MoveDistance0=TrackOrderi-100;break;-i;/向前遍历while(i-1)VisitOrderk=i;MoveDistancek=TrackOrderVisitOrderk-1-TrackOrderi;-i;+k;i=temp+1;/遍历完后,回到刚刚最后一个小于开始磁道号的元素的后一个向后遍历while(in)VisitOrderk=i;MoveDistancek=TrackOrderVisitOrderk-1-TrackOrderi;+i;+k;void cscan()shunxu();int k,i;k=1;int temp;if(direction)/若向磁道号增加方向访问for(i=0;i100)/找到第一个大于开始磁道号的元素temp=i;VisitOrder0=i;MoveDistance0=TrackOrderi-100;break;+i;while(in)/向后遍历VisitOrderk=i;MoveDistancek=TrackOrderVisitOrderk-1-TrackOrderi;+i;+k;i=0;/遍历完再从第一个元素开始遍历while(itemp)VisitOrderk=i;MoveDistancek=TrackOrderVisitOrderk-1-TrackOrderi;+i;+k;else/若向磁道号减小方向访问for(i=0;i100)/找到最后一个小于磁道号的元素temp=i;VisitOrder0=i;MoveDistance0=TrackOrderi-100;break;-i;/向前遍历while(i-1)VisitOrderk=i;MoveDistancek=TrackOrderVisitOrderk-1-TrackOrderi;-i;+k;i=n-1;/遍历完后从最后一个元素向前遍历while(itemp)VisitOrderk=i;MoveDistancek=TrackOrderVisitOrderk-1-TrackOrderi;-i;+k;void output()int sum=0;/求磁道数总和for(int i=0;in;+i)cout被访问的下一个磁道号TrackOrderVisitOrderi 移动距离(磁道数)abs(MoveDistancei)endl;sum=sum+abs(MoveDistancei);cout平均寻道长度:double(sum)/nendl;/输出平均寻道长度void main()init();int a;cout选择算法,1-FCFS,2-SSTF,3-SCAN,4-循环SCANa;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 1841001输入: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 被访问的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论