资源描述
实验报告
学院(系)名称:计算机与通信工程学院
姓名
王远志
学号
专业
计算机科学与技术
班级
2013级3班
实验项目
实验二:磁盘调度算法得实现
课程名称
操作系统
课程代码
实验时间
2015 年12月 11 日 第5-8节
实验地点
软件实验室7-219
批改意见
成绩
教师签字:
实验内容:
1. 本实验就是模拟操作系统得磁盘寻道方式,运用磁盘访问顺序得不同来设计磁盘得调度算法。
2. 实现得磁盘调度算法有FCFS,SSTF,SCAN,CSCAN与 NStepSCAN算法。
3. 设定开始磁道号寻道范围,依据起始扫描磁道号与最大磁道号数,随机产生要进行寻道得磁道号序列。
4. 选择磁盘调度算法,显示该算法得磁道访问顺序,计算出移动得磁道总数与平均寻道总数。
5. 按算法得寻道效率进行排序,并对各算法得性能进行分析比较。
实验要求:
1.详细描述实验设计思想、程序结构及各模块设计思路;
2. 详细描述程序所用数据结构及算法;
3. 明确给出测试用例与实验结果;
4. 为增加程序可读性,在程序中进行适当注释说明;
5. 认真进行实验总结,包括:设计中遇到得问题、解决方法与收获等;
6. 实验报告撰写要求结构清晰、描述准确逻辑性强;
7. 实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】
#include<iostream>
#include<iomanip>
#include<math、h>
using namespace std;
const int MaxNumber=100;
int TrackOrder[MaxNumber];
int MoveDistance[MaxNumber]; //----移动距离;
int FindOrder[MaxNumber]; //-----寻好序列。
double AverageDistance; //-----平均寻道长度
bool direction; //-----方向 true时为向外,false为向里
int BeginNum; //----开始磁道号。
int M; //----磁道数。
int N; //-----提出磁盘I/O申请得进程数
int SortOrder[MaxNumber]; //----排序后得序列
bool Finished[MaxNumber];
void Inith()
{
cout<<"请输入磁道数:";
cin>>M;
cout<<"请输入提出磁盘I/O申请得进程数:";
cin>>N;
ﻩcout<<"请依次输入要访问得磁道号:";
for(int i=0;i<N;i++)
cin>>TrackOrder[i];
ﻩfor(int j=0;j<N;j++)
ﻩ MoveDistance[j]=0;
ﻩﻩcout<<"请输入开始磁道号:";
ﻩ cin>>BeginNum;
ﻩfor(int k=0;k<N;k++)
ﻩ Finished[k]=false;
for(int l=0;l<N;l++)
ﻩSortOrder[l]=TrackOrder[l];
}
//=====================排序函数,将各进程申请得磁道按从小到大排列=================
void Sort()
{ //------冒泡排序
ﻩ int temp;
for(int i=N-1;i>=0;i--)
ﻩﻩfor(int j=0;j<i;j++)
ﻩ{
ﻩ ﻩif(SortOrder[j]>SortOrder[j+1])
ﻩﻩ {
ﻩﻩ temp=SortOrder[j];
ﻩ SortOrder[j]=SortOrder[j+1];
ﻩﻩﻩﻩ SortOrder[j+1]=temp;
ﻩ ﻩ}
ﻩ }
}
//============FCFS,先来先服务=================================
void FCFS()
{
ﻩint temp;
temp=BeginNum; //--------将BeginNum赋给temp作为寻道时得当前所在磁道号
for(int i=0;i<N;i++)
{
MoveDistance[i]=abs(TrackOrder[i]-temp); //-------计算移动磁道数
ﻩ temp=TrackOrder[i]; //-------寻到后,将此道作为当前所在磁道号,赋给temp
FindOrder[i]=TrackOrder[i]; //-----寻好得赋给寻好序列
}
}
//========SSTF,最短寻道法=============================
void SSTF()
{
int temp,n;
int A=M;
ﻩtemp=BeginNum; //--------将BeginNum赋给temp作为寻道时得当前所在磁道号
ﻩfor(int i=0;i<N;i++)
ﻩ{
ﻩﻩfor(int j=0;j<N;j++) //-------寻找最短得寻道长度
{
ﻩ if(abs(TrackOrder[j]-temp)<A&&Finished[j]==false)
ﻩ ﻩ{
ﻩA=abs(TrackOrder[j]-temp);
ﻩﻩ n=j;
ﻩﻩ}
ﻩﻩﻩelse continue;
ﻩﻩ}
ﻩ Finished[n]=true; //-------将已经寻找到得Finished赋值为true
MoveDistance[i]=A; //-------寻道长度
temp=TrackOrder[n]; //-------当前寻道号。
ﻩA=M; //-----重置A值
ﻩFindOrder[i]=TrackOrder[n]; //----寻好得赋给寻好序列
}
}
//=====================SCAN,扫描算法==========================
void SCAN()
{
ﻩint m,n,temp;
temp=BeginNum;
Sort(); //------排序
cout<<"请选择开始方向:1--向外;0---向里"; //------选择扫描方向
ﻩcin>>m;
if(m==1)
direction=true;
ﻩelse if(m==0)
direction=false;
ﻩelse
ﻩ cout<<"输入错误";
ﻩfor(int i=0;i<N;i++)
ﻩ{
ﻩﻩif(SortOrder[i]<BeginNum)
ﻩ ﻩcontinue;
else
ﻩﻩ{
ﻩ ﻩn=i;
ﻩ break;
}
ﻩ}
if(direction==true) //------选择向外
{
for(int i=n;i<N;i++)
{
MoveDistance[i-n]=abs(SortOrder[i]-temp);
ﻩ ﻩtemp=SortOrder[i];
ﻩ ﻩ FindOrder[i-n]=SortOrder[i];
}
ﻩﻩfor(int j=n-1;j>=0;j--)
ﻩﻩ{
ﻩﻩ MoveDistance[N-1-j]=abs(SortOrder[j]-temp);
ﻩﻩﻩﻩtemp=SortOrder[j];
ﻩﻩﻩﻩFindOrder[N-1-j]=SortOrder[j];
ﻩ }
}
else //-------选择向里
{
ﻩfor(int i=n-1;i>=0;i--)
ﻩ{
ﻩﻩMoveDistance[N-i-4]=abs(SortOrder[i]-temp);
ﻩﻩﻩtemp=SortOrder[i];
ﻩﻩ FindOrder[N-i-4]=SortOrder[i];
ﻩ}
for(int j=n;j<N;j++)
{
ﻩﻩ ﻩMoveDistance[j]=abs(SortOrder[j]-temp);
ﻩ temp=TrackOrder[j];
ﻩ FindOrder[j]=SortOrder[j];
}
}
}
//=================CSCAN,循环扫描算法=======================
void CSCAN()
{
int m,n,temp;
ﻩtemp=BeginNum;
Sort();
ﻩcout<<"请选择开始方向:1--向外;0---向里";
cin>>m;
if(m==1)
direction=true;
ﻩelse if(m==0)
ﻩﻩdirection=false;
else
ﻩcout<<"输入错误";
for(int i=0;i<N;i++)
ﻩ{
if(SortOrder[i]<BeginNum)
ﻩﻩcontinue;
ﻩelse
ﻩ{
ﻩﻩ n=i;
ﻩﻩﻩbreak;
ﻩ }
ﻩ}
if(direction==true)
ﻩ{
ﻩﻩfor(int i=n;i<N;i++)
{
ﻩﻩﻩMoveDistance[i-n]=abs(SortOrder[i]-temp);
ﻩﻩﻩﻩtemp=SortOrder[i];
ﻩ ﻩ FindOrder[i-n]=SortOrder[i];
ﻩﻩ}
for(int j=0;j<n;j++)
ﻩ {
MoveDistance[N-n+j]=abs(SortOrder[j]-temp);
ﻩﻩ ﻩtemp=SortOrder[j];
ﻩﻩﻩ FindOrder[N-n+j]=SortOrder[j];
ﻩ}
ﻩ}
ﻩelse
{
ﻩﻩfor(int i=n-1;i>=0;i--)
ﻩ {
ﻩﻩ MoveDistance[n-1-i]=abs(SortOrder[i]-temp);
ﻩ temp=SortOrder[i];
ﻩ FindOrder[n-1-i]=SortOrder[i];
ﻩ}
for(int j=N-1;j>=n;j--)
ﻩ{
MoveDistance[N-j+n-1]=abs(SortOrder[j]-temp);
ﻩﻩﻩﻩtemp=SortOrder[j];
ﻩFindOrder[N-j+n-1]=SortOrder[j];
ﻩ}
ﻩ}
}
//========计算平均寻道时间==============
void Count()
{
int Total=0;
for(int i=0;i<N;i++)
{
ﻩ Total+=MoveDistance[i];
ﻩ}
AverageDistance=((double)Total)/((double)N);
}
void Show()
{
ﻩcout<<"================从"<<BeginNum<<"号磁道开始====================="<<endl;
ﻩcout<<setw(20)<<"被访问得下一个磁道号"<<setw(20)<<"移动距离(磁道数)"<<endl;
ﻩfor(int i=0;i<N;i++)
ﻩ{
ﻩﻩcout<<setw(15)<<FindOrder[i]<<setw(15)<<MoveDistance[i]<<endl;
}
cout<<setw(20)<<"平均寻道长度:"<<AverageDistance<<endl;
cout<<endl;
}
int main()
{
ﻩint y=1;
int s;
ﻩInith();
while(y)
ﻩ{
cout<<"请选择寻道方式:1--FCFS; 2--SSTF; 3--SCAN;4--CSCSN;";
ﻩcin>>s;
switch(s)
ﻩ {
ﻩﻩ case 1:FCFS();Count();Show();break;
ﻩ case 2:SSTF();Count();Show();break;
ﻩﻩﻩcase 3:SCAN();Count();Show();break;
ﻩ case 4:CSCAN();Count();Show();break;
ﻩﻩ}
cout<<"就是否继续选择寻道算法?1--就是;2--否";
ﻩint p;
ﻩ cin>>p;
ﻩ y=p;
}
ﻩreturn 0;
}
实验结果:
FCFS方式:
Sstf方式:
SCAN方式:
4、CSCSN
展开阅读全文