1、磁盘调度算法实验六磁盘调度算法【实验目的】通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。【实验内容】问题描述:设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。程序要求:1)利用先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法模拟磁道访问过程。2)模拟四种
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)页面置换的实现过程如下: 变量初
3、始化; 接收用户输入磁道个数n和磁盘访问序列,选择算法1-FCFS,2-SSTF,3-SCAN,4-循环SCAN,输入开始磁盘号m和磁头移动方向; 根据用户选择的算法进行磁道访问,输出磁盘调度算法的模拟过程; 计算选择每次移动的磁头移动距离和算法的平均寻道长度; 输出选择算法的平均寻道长度。实验要求:1)上机前认真复习磁盘调度算法,熟悉FCFS、SSTF、SCAN和循环SCAN算法的过程;2)上机时独立编程、调试程序;3)根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图、发现的问题以及解决方法)。【实验分析】需求分析:(1) 按提示输入磁道个数,不得大于M
4、axNum;依次输入磁盘访问序列;按提示输入开始磁道号,磁头移动方向(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 被访问的
5、下一个磁道号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 被访问的下
6、一个磁道号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 被访问
7、的下一个磁道号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 被访问的下一
8、个磁道号58 移动距离(磁道数)3 被访问的下一个磁道号90 移动距离(磁道数)32 平均寻道长度:35.7778 概要设计:(1)本程序中用到的数据的定义: const int MaxNumber=100;int TrackOrderMaxNumber;/存放磁盘访问序列int MoveDistanceMaxNumber;/存放每次的寻道长度int VisitOrderMaxNumber;/存放访问的顺序bool direction;/磁头移动方向int n;/磁道个数int m;/开始磁道号(2)主程序的流程: 变量初始化=用户选择执行的算法=若不符合条件,则退出=若符合,执行算法=输出结
9、果(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磁盘访问序列e
10、ndl; 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; else MoveDistancei=TrackOrderVisitOrderi-1-TrackOrderi;/按输入的磁盘访问序列寻道,寻道长度为前一个访问的磁道号减当前访问的 void shunxu()/排序,从小到大排列磁盘访问序列 for(int i=
11、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; MoveD
12、istance0=TrackOrdertemp+1-m; temp=temp+1; else VisitOrder0=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+; else VisitOrderi=h; MoveDi
13、stancei=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;
14、 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=
15、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
16、)/向后遍历 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;/向
17、前遍历 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(M
18、oveDistancei)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、 执行算法前,要先申
19、请变量。2、 执行后面三种算法时,要注意先将磁道序列从小到大排序。3、 执行SSTF算法时,先找到小于开始磁道号的最后一个元素,以此元素为分割点,向前和向后遍历序列,每次移动一个,比较出离前一个访问的磁道号近的访问。4、 执行SCAN和CSCAN算法时,要先判断用户输入的是向磁道号增加的方向执行还是向磁道号减少的方向执行。5、 时间的复杂度是O(n).用户使用说明 按提示输入磁道个数,不得大于MaxNum;依次输入磁盘访问序列;按提示输入开始磁道号,磁头移动方向(1为磁道号增加方向,0为磁道号减少方向);根据提示输入要进行的算法类型,1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。
20、测试结果输入数据分别为: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输入:
21、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 移动距离(磁道数
22、)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
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1