目录
前言
1 实验题目
2 实验目的
3 实验内容
3.1 步骤
3.2 关键代码
3.2.1 FIFO函数
3.2.2 SSTF函数
3.2.3 SCAN函数
3.2.4 C-SCAN函数
4 实验结果与分析
5 代码
前言
本实验为课设内容,博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭,另外,本次实验所用平台是dev c++5.11
1 实验题目
实验七 磁盘调度算法的模拟与实现
2 实验目的
(1) 了解磁盘结构以及磁盘上数据的组织方式。
(2) 掌握磁盘访问时间的计算方式。
(3) 掌握常用磁盘调度算法及其相关特性。
3 实验内容
3.1 步骤
(1)通过键盘输入请求的磁道总数、请求的磁道序列和当前磁头位置。
(2)实现FIFO函数。
(3)实现SSTF函数。
(4)实现SCAN函数。
(5)实现C-SCAN函数。
3.2 关键代码
3.2.1 FIFO函数
void FIFO(int req[],int len){int cnt=0;cout<<"FIFO算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cnt=cnt+abs(currt-req[i]);currt=req[i];cout<<req[i]<<" "; }cout<<endl<<"FIFO算法寻道总数为:"<<cnt<<endl;cout<<"FIFO算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
3.2.2 SSTF函数
void SSTF(int req[],int len){int cnt=0;int temp[len];int a[len];//加这个是防止下面赋值把req原来的内容改变了 for(int i=0;i<len;i++){a[i]=req[i];}int min;int index=0;for(int i=0;i<len;i++){min=100000;for(int j=0;j<len;j++){if(abs(currt-a[j])<min){min=abs(currt-a[j]);index=j;}}currt=a[index];temp[i]=currt;a[index]=100000;cnt=cnt+min;}cout<<"SSTF算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"SSTF算法寻道总数为:"<<cnt<<endl;cout<<"SSTF算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
3.2.3 SCAN函数
void SCAN(int req[],int len){int cnt=0;int temp[len];int index;int flag=0;int j=0;for(int i=0;i<len;i++){//大于当前磁道号的 if(req[i]>currt){cnt=cnt+req[i]-currt;currt=req[i];flag=1;temp[j++]=req[i];}if(!flag)index=i;//index=5}//currt=184for(int i=index;i>=0;i--){//小于当前磁道号的 cnt=cnt+currt-req[i];currt=req[i];temp[j++]=req[i];}cout<<"SCAN算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"SCAN算法寻道总数为:"<<cnt<<endl;cout<<"SCAN算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
3.2.4 C-SCAN函数
void C_SCAN(int req[],int len){int cnt=0;int temp[len];int index;int flag=0;int j=0;for(int i=0;i<len;i++){//大于当前磁道号的 if(req[i]>currt){cnt=cnt+req[i]-currt;currt=req[i];flag=1;temp[j++]=req[i];}if(!flag)index=i;//index=5}//currt=184for(int i=0;i<=index;i++){//小于当前磁道号的 cnt=cnt+abs(currt-req[i]);currt=req[i];temp[j++]=req[i];}cout<<"C_SCAN算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"C_SCAN算法寻道总数为:"<<cnt<<endl;cout<<"C_SCAN算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
4 实验结果与分析
输入磁道总数为9,序列为55 58 39 18 90 160 150 38 184,当前磁头位置为100的程序运行结果如下图所示,经过计算,程序输出的访问序列和平均寻道长度是正确的。
图1.1 磁盘调度算法结果
5 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;#define MAX 200//最大请求数 int req[MAX];//请求序列
int currt;//当前磁头位置
int tempCurrt;//保存currt //55 58 39 18 90 160 150 38 184
void FIFO(int req[],int len){int cnt=0;cout<<"FIFO算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cnt=cnt+abs(currt-req[i]);currt=req[i];cout<<req[i]<<" "; }cout<<endl<<"FIFO算法寻道总数为:"<<cnt<<endl;cout<<"FIFO算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
//55 58 39 18 90 160 150 38 184
void SSTF(int req[],int len){int cnt=0;int temp[len];int a[len];//加这个是防止下面赋值把req原来的内容改变了 for(int i=0;i<len;i++){a[i]=req[i];}int min;int index=0;for(int i=0;i<len;i++){min=100000;for(int j=0;j<len;j++){if(abs(currt-a[j])<min){min=abs(currt-a[j]);index=j;}}currt=a[index];temp[i]=currt;a[index]=100000;cnt=cnt+min;}cout<<"SSTF算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"SSTF算法寻道总数为:"<<cnt<<endl;cout<<"SSTF算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
//55 58 39 18 90 160 150 38 184
void SCAN(int req[],int len){int cnt=0;int temp[len];int index;int flag=0;int j=0;for(int i=0;i<len;i++){//大于当前磁道号的 if(req[i]>currt){cnt=cnt+req[i]-currt;currt=req[i];flag=1;temp[j++]=req[i];}if(!flag)index=i;//index=5}//currt=184for(int i=index;i>=0;i--){//小于当前磁道号的 cnt=cnt+currt-req[i];currt=req[i];temp[j++]=req[i];}cout<<"SCAN算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"SCAN算法寻道总数为:"<<cnt<<endl;cout<<"SCAN算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
//55 58 39 18 90 160 150 38 184
void C_SCAN(int req[],int len){int cnt=0;int temp[len];int index;int flag=0;int j=0;for(int i=0;i<len;i++){//大于当前磁道号的 if(req[i]>currt){cnt=cnt+req[i]-currt;currt=req[i];flag=1;temp[j++]=req[i];}if(!flag)index=i;//index=5}//currt=184for(int i=0;i<=index;i++){//小于当前磁道号的 cnt=cnt+abs(currt-req[i]);currt=req[i];temp[j++]=req[i];}cout<<"C_SCAN算法寻道序列如下:"<<endl;for(int i=0;i<len;i++){cout<<temp[i]<<" ";}cout<<endl<<"C_SCAN算法寻道总数为:"<<cnt<<endl;cout<<"C_SCAN算法平均寻道长度为:";printf("%.1f\n",(float)cnt*1.0/len);
}
//55 58 39 18 90 160 150 38 184
int main(){int num; cout<<"---------------磁盘调度算法的模拟与实现---------------"<<endl;cout<<"请输入接收到的磁道总数:";cin>>num; cout<<"请输入接收到的磁道序列:";for(int i=0;i<num;i++){cin>>req[i]; }cout<<"请输入当前磁头所在磁道的位置:";cin>>currt; tempCurrt=currt;FIFO(req,num);currt=tempCurrt;//恢复 SSTF(req,num);currt=tempCurrt;//恢复 sort(req,req+num);//因为sort直接把req原有内容改变了,直接在scan和c_scan之前排序就行了 SCAN(req,num);currt=tempCurrt;//恢复 C_SCAN(req,num);return 0;
}