设计并实现一个分别利用下列磁盘调度算法进行磁盘调度的模拟程序。
(1)扫描算法(向内寻道和向外寻道)
(2)循环扫描算法
设计要求:
1. 磁头初始磁道号,磁头初始运动方向,序列长度,磁道号序列等数据可键盘输入。
2. 最好能实现磁道号序列中磁道号的动态增加。
3. 磁道访问序列以链表的形式存储。
4. 给出各磁盘调度算法的调度顺序和平均寻道长度。
代码实现:
#include <iostream>
#include <string>
#include <conio.h>
#include <windows.h>
#include<iomanip>
#include <stdlib.h>
using namespace std;
class LinList;
struct LinNode
{
int no;
LinNode *next;
};
class LinList
{
private :
LinNode *head;
public :
int size;
LinList() //构造函数,用于构造头结点和声明长度
{
head=new LinNode;
head->next=NULL;
size=0;
}
void Insert(int no)//插入函数
{
LinNode *newnode=new LinNode;
newnode->no=no;
newnode->next=NULL;
Index(size-1)->next=newnode;
size++;
}
LinNode *Index(int i)//定位函数
{
if(i<-1||i>size-1)
{
printf(" ");
exit(0);
}
if(i==-1)return head;
if(i==0)return head->next;
LinNode *p=head->next;
int k=0;
while(p!=NULL&&k<i)
{
p=p->next;
k++;
}
return p;
}
int *sort()//排序
{
int count=0;
int *a=new int [size];
a[0]=Index(0)->no;
count++;
for(int i=1;i<size;i++)
{
for(int j=0;j<count;j++)
{
if(Index(i)->no<a[j])
{
for(int k=count;k>j;k--)
{a[k]=a[k-1];}
a[j]=Index(i)->no;
count++;
break;
}
if(Index(i)->no>=a[j])
{
if(j==count-1)
{a[count]=Index(i)->no;count++;break;}
else
{continue;}
}
}
}
return a;
}
void SCAN1(int start_place)//电梯调度算法(向外寻道)
{
printf(" ->SCAN调度算法(向外寻道)如下:\n ");
float sum=0;
float ave;
int *a=sort();
for(int i=0;i<size;i++)
{
if(start_place<=a[i])
{for(int m=i;m<size;m++)
{
if(i==0&&m==size-1)
{
printf("%d",a[m]);
sum+=abs(a[m]-a[m-1]);
}
else
{
printf("%d,->",a[m]);
if(m==i){sum+=abs(start_place-a[i]);}
else
{sum+=abs(a[m]-a[m-1]);}
}
}
for(int n=i-1;n>=0;n--)
{
if(n==i-1){sum+=abs(a[n]-a[size-1]);}
if(n!=i-1){sum+=abs(a[n]-a[n+1]);}
if(n==0){printf("%d\n",a[n]);}
else
{
printf("%d,->",a[n]);}
}
ave=sum/size;
printf("->平均寻道长度为:%f",ave);
break;
}
}
}
void SCAN2(int start_place)//电梯调度算法(向内寻道)
{
printf(" ->SCAN调度算法(向内寻道)如下:\n ");
float sum=0;
float ave;
int *a=sort();
for(int i=0;i<size;i++)
{
if(start_place<=a[i])
{
for(int n=i-1;n>=0;n--)
{
if(n==i-1){sum+=abs(a[n]-a[size-1]);}
if(n!=i-1){sum+=abs(a[n]-a[n+1]);}
if(n==0){printf("%d",a[n]);}
else
{
printf("%d,->",a[n]);}
}
for(int m=i;m<size;m++)
{
if(i==0&&m==size-1)
{
printf("%d\n",a[m]);
sum+=abs(a[m]-a[m-1]);
}
else
{
printf("->%d,",a[m]);
if(m==i){sum+=abs(start_place-a[i]);}
else
{sum+=abs(a[m]-a[m-1]);}
}
}
ave=sum/size;
printf("->平均寻道长度为:%f",ave);
break;
}
}
}
void CSCAN(int start_place) //循环算法
{
printf(" ->CSCAN调度算法如下:\n");
float sum=0;
float ave;
int *a=sort();
for(int i=0;i<size;i++)
{
if(start_place<=a[i])
{
for(int m=i;m<size;m++)
{
if(i==0&&m==size-1)
{
printf("%d",a[m]);
sum+=abs(a[m]-a[m-1]);
}
else
{
printf("%d->",a[m]);
if(m==i){sum+=abs(start_place-a[i]);}
else
{sum+=abs(a[m]-a[m-1]);}
}
}
for(int n=0;n<=i-1;n++)
{
if(n==0){sum+=abs(a[n]-a[size-1]);}
if(n!=0){sum+=abs(a[n]-a[n-1]);}
if(n==i-1){printf("%d\n",a[n]);}
else
{printf("%d->",a[n]);}
}
ave=sum/size;
printf(" ->平均寻道长度为:%f",ave);
break;
}
}
}
void show()//显示函数
{
for(int i=0;i<size;i++)
{
if(i==size-1)
{
printf("%d",Index(i)->no);
//cout<<Index(i)->no<<endl<<endl;
break;
}
printf("%d->",Index(i)->no);
//cout<<Index(i)->no<<"->";
}
}
};
int main()
{
printf(" *********************************\n");
printf(" ** 丨磁*盘*调*度*2丨 **\n");
printf(" *********************************\n");
LinList linlist;
int i,start_place;
printf(" ->请输入需要调度的序列(以0结束):\n");
scanf("%d",&i);
while(i)
{
linlist.Insert(i);
scanf("%d",&i);
}
printf(" ->请输入开始的磁道号:");
scanf("%d",&start_place);
printf(" ->链表的长度为:%d\n",linlist.size);
printf(" ->单链表显示:\n");
linlist.show();
int flag=1;
while(flag)
{
printf(" **************************\n");
printf(" * 1:返回重新输入磁道 *\n");
printf(" * 2:循环扫描算法 *\n");
printf(" * 3:扫描算法 *\n");
printf(" * 4:EXIT退出 *\n");
printf(" **************************\n");
printf(" ->请输入数字:");
int k;
scanf("%d",&k);
switch(k)
{
case 1:
main();break;
case 2:
linlist.CSCAN(start_place);
break;
case 3:
{
printf(" ******************************\n");
printf(" * 5:向外寻道按,6:向内寻道按 *\n");
printf(" ******************************\n");
printf("请输入数字5或6 ->");
int j;
scanf("%d",&j);
switch(j)
{
case 5:
linlist.SCAN1(start_place);break;
case 6:
linlist.SCAN2(start_place);break;
}
}
break;
case 4:
{
flag=0;
break;
printf("->请输入任意字符结束:");
getche();}
}
}
return 0;
}
运行结果: