实验指南
运行环境:
Dev c++
算法思想:
FCFS:按照访问序列的顺序调度
SSTF:每次寻找距离当前磁头位置最近的柱面号进行调度
单向扫描:按照从里到外逐个找到最近,直到扫到最大柱面,再空扫到最小柱面,再进行逐个找最近的进行调度
双向扫描:按当前磁头方向找到逐个找最近的,直到扫到边缘柱面,再反方向扫回去
电梯调度:按照当前磁头方向逐个找最近的,直到这一方向所有需要访问的都访问了,再返回去按逐个找最近的方式进行调度
关键数据结构定义:
const int N = 1e3+10;
int length;
int sequence[N];//访问柱面的顺序(从1开始)
int result[N];//存放最短优先的结果
int now;//当前柱面
程序框架:
//函数名:in参数:无
void in(){
//函数功能:输入访问序列信息
}
//函数名:FCFS参数:无
void FCFS(){
//函数功能:调用先来先服务算法
}
//函数名:SSTF参数:无
void SSTF(){
//函数功能:调用短进程优先调度算法
}
//函数名:Elevator参数:无
void Elevator(){
//函数功能:调用电梯调度算法
}
//函数名:Oneway_scan参数:无
void Oneway_scan(){
//函数功能:调用单向扫描算法
}
//函数名:Twoway_scan参数:无
void Twoway_scan(){
//函数功能:调用双向扫描算法
}
//函数名:Out参数:无
void Out(){
//函数功能:输出选项菜单
}
int main()
{
while (1)
{
Out();//给出选项
int c;
scanf("%d", &c);
switch (c){//选择算法
case 1:FCFS();
break;
case 2:SSTF();
break;
case 3:Oneway_scan();
break;
case 4:Twoway_scan();
break;
case 5:Elevator();
break;
default:printf("\n调度结束!");
exit(1);
}
}
return 0;
}
测试用例:
1
8
98 183 37 122 14 124 65 67
53
2
8
98 183 37 122 14 124 65 67
53
3
8
98 183 37 122 14 124 65 67
53
4
8
98 183 37 122 14 124 65 67
53
5
8
98 183 37 122 14 124 65 67
53
0
关键代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const int N = 1e3+10;
int length;
int sequence[N];//访问柱面的顺序(从1开始)
int result[N];//存放最短优先的结果
int now;//当前柱面
//函数名:in参数:无
void in(){
//函数功能:输入访问序列信息
printf("请输入访问序列的长度:");
scanf("%d",&length);
printf("请输入访问的柱面顺序:");
for(int i=0;i<length;i++)
{
scanf("%d",&sequence[i]);
}
printf("请输入正在访问的柱面:");
scanf("%d",&now);
}
//函数名:FCFS参数:无
void FCFS(){
//函数功能:调用先来先服务算法
int sum = 0;
printf("\n***********FCFS磁盘移臂调度过程***********\n");
in();
result[0] = now;
for(int i=1;i<=length;i++)
{
result[i] = sequence[i-1];
sum = sum+abs(result[i]-result[i-1]);
}
printf("\n移动的顺序为:\n");
for(int i=0;i<=length;i++)
printf("%d ",result[i]);
printf("\n");
printf("移动的柱面为:%d\n",sum);
}
//函数名:SSTF参数:无
void SSTF(){
//函数功能:调用短进程优先调度算法
int temp,sum=0,l,r,i,j;
printf("\n***********SSTF磁盘移臂调度过程***********\n");
in();
sequence[length]=now;
for(i=0;i<=length-1;i++)
for(j=i+1;j<=length;j++)
{
if(sequence[j]>sequence[i])
{
temp=sequence[j];
sequence[j] = sequence[i];
sequence[i] = temp;
}
}
for(i=0;i<=length;i++)
{
if(sequence[i] == now)
{
l = i-1;
r = i+1;
break;
}
}
result[0]=now;
j=1;
while(1)
{
if(r<=length&&abs(sequence[i]-sequence[l])>abs(sequence[i]-sequence[r]))
{
sum=sum+abs(sequence[i]-sequence[r]);
i=r;
r=r+1;
result[j++]=sequence[i];
}
else if(l>=0&&abs(sequence[i]-sequence[l])<abs(sequence[i]-sequence[r]))
{
sum=sum+abs(sequence[i]-sequence[l]);
i=l;
l=l-1;
result[j++]=sequence[i];
}
else if(r>length&&l<0)
break;
else
{
if(l>=0)
{
sum=sum+abs(sequence[i]-sequence[l]);
i=l;
l=l-1;
result[j++]=sequence[i];
}
else
{
sum=sum+abs(sequence[i]-sequence[r]);
i=r;
r=r+1;
result[j++]=sequence[i];
}
}
}
printf("\n最短优先的顺序为:\n");
for(i=0;i<=length;i++)
printf("%d ",result[i]);
printf("\n");
printf("移动柱面为:%d\n",sum);
}
//函数名:Elevator参数:无
void Elevator(){
//函数功能:调用电梯调度算法
printf("\n***********电梯调度过程***********\n");
in();
int temp,sum=0,l,r,i,j;
sequence[length]=now;
for(i=0;i<=length-1;i++)
for(j=i+1;j<=length;j++)
{
if(sequence[j]>sequence[i])
{
temp=sequence[j];
sequence[j] = sequence[i];
sequence[i] = temp;
}
}
for(i=0;i<=length;i++)
{
if(sequence[i] == now)
{
l = i-1;
r = i+1;
break;
}
}
result[0]=now;
j=1;
while(r<=length)
{
result[j++] = sequence[r];
sum = sum + abs(result[j-1]-result[j-2]);
r++;
}
while(l>=0)
{
result[j++] = sequence[l];
sum = sum + abs(result[j-1]-result[j-2]);
l--;
}
printf("\n电梯调度(由里向外)移动的顺序为:\n");
for(i=0;i<=length;i++)
printf("%d ",result[i]);
printf("\n");
printf("移动柱面为:%d\n",sum);
for(i=0;i<=length;i++)
{
if(sequence[i] == now)
{
l = i-1;
r = i+1;
break;
}
}
result[0]=now;
j=1;
sum=0;
while(l>=0)
{
result[j++] = sequence[l];
sum = sum + abs(result[j-1]-result[j-2]);
l--;
}
while(r<=length)
{
result[j++] = sequence[r];
sum = sum + abs(result[j-1]-result[j-2]);
r++;
}
printf("\n电梯调度(由外向里)移动的顺序为:\n");
for(i=0;i<=length;i++)
printf("%d ",result[i]);
printf("\n");
printf("移动柱面为:%d\n",sum);
}
//函数名:Oneway_scan参数:无
void Oneway_scan(){
//函数功能:调用单向扫描算法
printf("\n***********单向扫描过程***********\n");
in();
int temp,sum=0,l,r,i,j;
sequence[length]=now;
sequence[length+1]=199;
sequence[length+2]=0;
for(i=0;i<=length+1;i++)
for(j=i+1;j<=length+2;j++)
{
if(sequence[j]>sequence[i])
{
temp=sequence[j];
sequence[j] = sequence[i];
sequence[i] = temp;
}
}
for(i=0;i<=length+2;i++)
{
if(sequence[i] == now)
{
l=i-1;
r=length+2;
break;
}
}
result[0]=now;
j=1;
while(l>=0)
{
result[j++] = sequence[l];
sum = sum + abs(result[j-1]-result[j-2]);
l--;
}
while(r>i)
{
result[j++] = sequence[r];
sum = sum + abs(result[j-1]-result[j-2]);
r--;
}
printf("\n单向扫描移动的顺序为:\n");
for(i=0;i<=length+2;i++)
printf("%d ",result[i]);
printf("\n");
printf("移动柱面为:%d\n",sum);
}
//函数名:Twoway_scan参数:无
void Twoway_scan(){
//函数功能:调用双向扫描算法
printf("\n***********双向扫描过程***********\n");
in();
int temp,sum=0,l,r,i,j;
sequence[length]=now;
sequence[length+1]=199;
for(i=0;i<=length;i++)
for(j=i+1;j<=length+1;j++)
{
if(sequence[j]>sequence[i])
{
temp=sequence[j];
sequence[j] = sequence[i];
sequence[i] = temp;
}
}
for(i=0;i<=length+1;i++)
{
if(sequence[i] == now)
{
l=i-1;
r=i+1;
break;
}
}
result[0]=now;
j=1;
while(l>=0)
{
result[j++] = sequence[l];
sum = sum + abs(result[j-1]-result[j-2]);
l--;
}
while(r<=length+1)
{
result[j++] = sequence[r];
sum = sum + abs(result[j-1]-result[j-2]);
r++;
}
printf("\n双向扫描移动的顺序为:\n");
for(i=0;i<=length+1;i++)
printf("%d ",result[i]);
printf("\n");
printf("移动柱面为:%d\n",sum);
}
//函数名:Out参数:无
void Out(){
//函数功能:输出选项菜单
printf("***************磁盘驱动调度***************\n");
printf(" * 1.FCFS *\n");
printf(" * 2.SSTF *\n");
printf(" * 3.单向扫描 *\n");
printf(" * 4.双向扫描 *\n");
printf(" * 5.电梯调度 *\n");
printf(" * 0.退出 *\n");
printf(" 请输入选项[ ]\b\b");
}
int main()
{
while (1)
{
Out();//给出选项
int c;
scanf("%d", &c);
switch (c){//选择算法
case 1:FCFS();
break;
case 2:SSTF();
break;
case 3:Oneway_scan();
break;
case 4:Twoway_scan();
break;
case 5:Elevator();
break;
default:printf("\n调度结束!");
exit(1);
}
}
return 0;
}
实验结果
实验总结
①学会了移臂调度算法;
②通过算法可以看出不同的算法有不同的时间差;
③这次的算法是在已有的数组里面修改的,觉得写得不是很好。