目录
前言
本实验为课设内容,博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭,另外,本次实验所用平台是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=184
for(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=184
for(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=184
for(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=184
for(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;
}