《操作系统--磁盘调度算法》
实验报告
姓 名: 范学升
学 号:1001050903
班 级:电科10-1班
专 业:电子信息科学与技术
一、实验目的:
通过模拟设计磁盘驱动调度程序,观察驱动调度程序的动态运行过程,理解和掌握磁盘驱动调度的职能,并比较各种算法的调度结果。
二、实验内容:
要求设计主界面能灵活选择某算法,且实现以下算法:
(1)先来先服务算法(FCFS)
(2)最短寻道时间优先算法(SSTF)
(3)扫描算法(SCAN)
(4)循环扫描算法(CSCAN)
三、实验步骤
详细设计:
源代码
#include
#include
using namespace std;
void FCFS(int a[],int n);
void SSTF(int a[],int n);
void SCAN(int a[],int n);
void CSCAN(int a[],int n);
int main()
{
int n;//磁道的个数
int s;//功能号
cout
cin>>n;
int *a=new int[n];
cout
srand((unsigned)time(NULL));
for(int i=0;i
{
a[i]=(rand()%100)+1;
cout
}
cout
while(1)
{ cout
cout
cout
cout
cout
cout
cout
cout
cin>>s;
if(s>4)
{
cout
}
else
{
switch(s)
{ case 0: exit(0);break ;
case 1:FCFS(a,n); break;
case 2:SSTF(a, n);break;
case 3:SCAN(a, n);break;
case 4:CSCAN(a,n);break;
}
}
}
return 0;
}
//先来先服务调度算法(FCFS)
void FCFS(int a[],int n)
{
int sum=0,j,i,first=0,now;
cout
cin>>now;//确定当前磁头所在位置
cout
for( i=0;i
{
cout
}
//计算sum
for(i=0,j=1;j
{
first+=abs(a[j]-a[i]);//外围磁道与最里面磁道的距离
}
sum+=first+abs(now-a[0]);
cout
cout
}
最短寻道时间算法(SSTF)
void SSTF(int a[],int n)
{
int temp;
int k=1;
int now,l,r;
int i,j,sum=0;
//将磁道号按递增排序
for(i=0;i
for(j=i+1;j
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
cout
for( i=0;i
{
cout
}
cout
cout
cin>>now;//确定当前磁头所在位置
cout
if(a[n-1]
{
for(i=n-1;i>=0;i--)
cout
sum=now-a[0];
}
else
if(a[0]>=now)//当前磁头位置小于最里欲访问磁道
{
for(i=0;i
cout
sum=a[n-1]-now;
}
else
{
while(a[k]
{
k++;
}
l=k-1;//在磁头位置的前一个欲访问磁道
r=k;//磁头欲访问磁道
while((l>=0)&&(r
{
if((now-a[l])
{
cout
sum+=now-a[l];
now=a[l];
l=l-1;
}
else
{
cout
sum+=a[r]-now;
now=a[r];
r=r+1;
}
}
if(l=-1)//磁头位置里侧的磁道已访问完
{
for(j=r;j
{
cout
}
sum+=a[n-1]-a[0];
}
if(r==n)//磁头位置外侧的磁道已访问完
{
for(j=k-1;j>-1;j--) //访问磁头位置里侧的磁道
{
cout
}
sum+=a[n-1]-a[0];
}
}
cout
cout
}
扫描算法(SCAN)
void SCAN(int a[],int n)
{
int temp;
int k=1;
int now,l,r;
int i,j,sum=0;
for(i=0;i
for(j=i+1;j
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
cout
for( i=0;i
{
cout
}
cout
cout
cin>>now;
//以下算法确定磁道访问顺序
if(a[n-1]
{
for(i=n-1;i>=0;i--)
cout
sum=now-a[0];
}
else
if(a[0]>=now) //磁头位置小于最里欲访问磁道
{
for(i=0;i
cout
sum=a[n-1]-now;
}
else //磁头位置在最里侧磁道与最外侧磁道之间 { int d;
while(a[k]
{ //确定当前磁道在已排的序列中的位置
k++;
}
l=k-1;//在磁头位置的前一个欲访问磁道
r=k; //磁头欲访问磁道
cout>d; //确定磁头访问的方向
cout
if(d==0||d==1)
{
if(d==0) //磁头向内
{
for(j=l;j>=0;j--)
{
cout
}
for(j=r;j
{
cout
}
sum=now-2*a[0]+a[n-1];
}
if(d==1) //磁头向外
{
for(j=r;j
{
cout
}
for(j=l;j>=0;j--)
{
cout
}
sum=2*a[n-1]-now-a[0];
}
}
else
cout
}
cout
cout
}
循环扫描算法(CSCAN)
void CSCAN(int a[],int n)
{
int temp;
int now,l,r;
int i,j,sum=0;
int k=1;
for(i=0;i
for(j=i+1;j
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
cout
for( i=0;i
{
cout
}
cout
cout
cin>>now;//确定当前磁道号
if(a[n-1]
{
for(i=0;i
cout
sum=now-2*a[0]+a[n-1];
}
else
if(a[0]>=now)//磁头位置小于最里欲访问磁道
{
for(i=0;i
cout
sum=a[n-1]-now;
}
else //磁头位置在最里侧磁道与最外侧磁道之间
{ int d;
while(a[k]
{
k++;
}
l=k-1;//在磁头位置的前一个欲访问磁道
r=k; //磁头欲访问磁道
cout>d; //确定磁头访问的方向
cout
if(d==0||d==1)
{
if(d==1) //磁头向外侧访问
{
for(j=r;j
cout
}
for(j=0;j
{
cout
}
sum=2*a[n-1]-now-2*a[0]+a[l];
}
if(d==0) //磁头向内侧访问
{
for(j=r-1;j>=0;j--)
{
cout
}
for(j=n-1;j>=r;j--)//
{
cout
}
sum=2*a[n-1]-2*a[0]+now-a[r]; }
}
else
cout
}
cout
cout
}
(3)测试结果:
1.先来先服务算法(FCFS)测试结果
2.最短寻道时间算法(SSTF)测试结果
3.循环扫描算法(SCAN)测试结果
4.循环扫描算法(CSCAN)测试结果
10
《操作系统--磁盘调度算法》
实验报告
姓 名: 范学升
学 号:1001050903
班 级:电科10-1班
专 业:电子信息科学与技术
一、实验目的:
通过模拟设计磁盘驱动调度程序,观察驱动调度程序的动态运行过程,理解和掌握磁盘驱动调度的职能,并比较各种算法的调度结果。
二、实验内容:
要求设计主界面能灵活选择某算法,且实现以下算法:
(1)先来先服务算法(FCFS)
(2)最短寻道时间优先算法(SSTF)
(3)扫描算法(SCAN)
(4)循环扫描算法(CSCAN)
三、实验步骤
详细设计:
源代码
#include
#include
using namespace std;
void FCFS(int a[],int n);
void SSTF(int a[],int n);
void SCAN(int a[],int n);
void CSCAN(int a[],int n);
int main()
{
int n;//磁道的个数
int s;//功能号
cout
cin>>n;
int *a=new int[n];
cout
srand((unsigned)time(NULL));
for(int i=0;i
{
a[i]=(rand()%100)+1;
cout
}
cout
while(1)
{ cout
cout
cout
cout
cout
cout
cout
cout
cin>>s;
if(s>4)
{
cout
}
else
{
switch(s)
{ case 0: exit(0);break ;
case 1:FCFS(a,n); break;
case 2:SSTF(a, n);break;
case 3:SCAN(a, n);break;
case 4:CSCAN(a,n);break;
}
}
}
return 0;
}
//先来先服务调度算法(FCFS)
void FCFS(int a[],int n)
{
int sum=0,j,i,first=0,now;
cout
cin>>now;//确定当前磁头所在位置
cout
for( i=0;i
{
cout
}
//计算sum
for(i=0,j=1;j
{
first+=abs(a[j]-a[i]);//外围磁道与最里面磁道的距离
}
sum+=first+abs(now-a[0]);
cout
cout
}
最短寻道时间算法(SSTF)
void SSTF(int a[],int n)
{
int temp;
int k=1;
int now,l,r;
int i,j,sum=0;
//将磁道号按递增排序
for(i=0;i
for(j=i+1;j
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
cout
for( i=0;i
{
cout
}
cout
cout
cin>>now;//确定当前磁头所在位置
cout
if(a[n-1]
{
for(i=n-1;i>=0;i--)
cout
sum=now-a[0];
}
else
if(a[0]>=now)//当前磁头位置小于最里欲访问磁道
{
for(i=0;i
cout
sum=a[n-1]-now;
}
else
{
while(a[k]
{
k++;
}
l=k-1;//在磁头位置的前一个欲访问磁道
r=k;//磁头欲访问磁道
while((l>=0)&&(r
{
if((now-a[l])
{
cout
sum+=now-a[l];
now=a[l];
l=l-1;
}
else
{
cout
sum+=a[r]-now;
now=a[r];
r=r+1;
}
}
if(l=-1)//磁头位置里侧的磁道已访问完
{
for(j=r;j
{
cout
}
sum+=a[n-1]-a[0];
}
if(r==n)//磁头位置外侧的磁道已访问完
{
for(j=k-1;j>-1;j--) //访问磁头位置里侧的磁道
{
cout
}
sum+=a[n-1]-a[0];
}
}
cout
cout
}
扫描算法(SCAN)
void SCAN(int a[],int n)
{
int temp;
int k=1;
int now,l,r;
int i,j,sum=0;
for(i=0;i
for(j=i+1;j
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
cout
for( i=0;i
{
cout
}
cout
cout
cin>>now;
//以下算法确定磁道访问顺序
if(a[n-1]
{
for(i=n-1;i>=0;i--)
cout
sum=now-a[0];
}
else
if(a[0]>=now) //磁头位置小于最里欲访问磁道
{
for(i=0;i
cout
sum=a[n-1]-now;
}
else //磁头位置在最里侧磁道与最外侧磁道之间 { int d;
while(a[k]
{ //确定当前磁道在已排的序列中的位置
k++;
}
l=k-1;//在磁头位置的前一个欲访问磁道
r=k; //磁头欲访问磁道
cout>d; //确定磁头访问的方向
cout
if(d==0||d==1)
{
if(d==0) //磁头向内
{
for(j=l;j>=0;j--)
{
cout
}
for(j=r;j
{
cout
}
sum=now-2*a[0]+a[n-1];
}
if(d==1) //磁头向外
{
for(j=r;j
{
cout
}
for(j=l;j>=0;j--)
{
cout
}
sum=2*a[n-1]-now-a[0];
}
}
else
cout
}
cout
cout
}
循环扫描算法(CSCAN)
void CSCAN(int a[],int n)
{
int temp;
int now,l,r;
int i,j,sum=0;
int k=1;
for(i=0;i
for(j=i+1;j
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
cout
for( i=0;i
{
cout
}
cout
cout
cin>>now;//确定当前磁道号
if(a[n-1]
{
for(i=0;i
cout
sum=now-2*a[0]+a[n-1];
}
else
if(a[0]>=now)//磁头位置小于最里欲访问磁道
{
for(i=0;i
cout
sum=a[n-1]-now;
}
else //磁头位置在最里侧磁道与最外侧磁道之间
{ int d;
while(a[k]
{
k++;
}
l=k-1;//在磁头位置的前一个欲访问磁道
r=k; //磁头欲访问磁道
cout>d; //确定磁头访问的方向
cout
if(d==0||d==1)
{
if(d==1) //磁头向外侧访问
{
for(j=r;j
cout
}
for(j=0;j
{
cout
}
sum=2*a[n-1]-now-2*a[0]+a[l];
}
if(d==0) //磁头向内侧访问
{
for(j=r-1;j>=0;j--)
{
cout
}
for(j=n-1;j>=r;j--)//
{
cout
}
sum=2*a[n-1]-2*a[0]+now-a[r]; }
}
else
cout
}
cout
cout
}
(3)测试结果:
1.先来先服务算法(FCFS)测试结果
2.最短寻道时间算法(SSTF)测试结果
3.循环扫描算法(SCAN)测试结果
4.循环扫描算法(CSCAN)测试结果
10