磁盘是高速、大容量、旋转型、可直接存取的存储设备,它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出请求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求,由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。本实验要求模拟设计磁盘调度程序,观察调度程序的动态运行过程,通过实验来理解和掌握磁盘调度的职能。
假设磁盘访问序列为: 98,183,37,122,14,124,65,67;读写头起始位置:第53磁道
请分别按照下列调度算法安排磁头服务序列,并计算寻道距离:
#include <stdlib.h>
#include<iostream>
#include<cmath>
using namespace std;
typedef struct node
{
int data;
struct node *next;
}Node;
int main()
{
void fcfs(Node *,int,int);//声明先来先服务函数FCFS
void sstf(Node *,int,int);//声明最短寻道时间优先函数SSTF
void scan(Node *,int,int);//声明扫描函数SCAN
void print(Node *); //输出链表函数
Node *head,*p,*q; //建立一个链表
int it,c=0,f,s; //c为链表长度,f是开始的磁道号,s是选择哪个算法
head=(Node *)malloc(sizeof(Node));
head->next=NULL;
q=head;
cout<<" /**************磁盘调度算法***************/"<<endl;
cout<<endl;
cout<<"新建一个单链表,以0作为结束标志:";
cin>>it;
while(it!=0)
{
p=(Node *)malloc(sizeof(Node));
p->next=NULL;
p->data=it;
q->next=p;
q=p;
cin>>it;
c++;
}
cout<<"从几号磁道开始:";
cin>>f; //f为磁道号
print(head);
cout<<"链表长度为:"<<c<<endl;
cout<<"1、先来先服务算法FCFS"<<endl;
cout<<"2、最短寻道时间优先算法SSTF"<<endl;
cout<<"0、退出"<<endl;
cout<<"请选择:";
cin>>s;
cout<<endl;
while(s!=0)
{
switch(s)
{
case 1:cout<<"你选择了:先来先服务算法FCFS"<<endl;
fcfs( head,c,f);
break;
case 2:cout<<"你选择了:最短寻道时间优先算法SSTF"<<endl;
sstf( head,c,f);
break;
}
cout<<"退出请选0,继续请选1,2,3:";
cin>>s;
cout<<endl;
}
return 0;
}
/***********************************************************/
void fcfs(Node *head,int c,int f)//先来先服务算法
{
void print(Node *);
Node *l;//*m,*n;
float num=0; //num为平均寻道长度
l=head->next;
for(int i=0;i<c;i++)
{
num+=abs(l->data-f);
f=l->data;
l=l->next;
}
num=num/c;
cout<<"先来先服务的寻道顺序是:"<<endl;
print(head);
cout<<"平均寻道长度:"<<num<<endl;
}
/*****************************************************************/
void sstf(Node *head,int c,int f)//最短寻道时间优先算法
{
void print(Node *);
Node *p,*q,*r,*s,*l,*m;
l=(Node *)malloc(sizeof(Node));
l->next=NULL;
m=l;
q=head;
p=head->next;
s=head;
r=head->next;
float num=0;
for(int i=0;i<c;i++)
{
int min=abs(f-r->data);
for(int j=0;j<c-i-1;j++)
{
p=p->next;
q=q->next;
if(abs(f-p->data)<min)
{
min=abs(f-p->data);
r=p;
s=q;
}
}
num+=abs(f-r->data);
f=r->data;
s->next=r->next;
r->next=NULL;
m->next=r;
m=r;
q=head;
p=head->next;
s=head;
r=head->next;
}
num=num/c;
cout<<"最短寻道时间优先顺序是:"<<endl;
print(l);
cout<<"平均寻道长度:"<<num<<endl;
}
/*****************************************************/
void print(Node *head) //输出链表
{
Node *p;
p=head->next;
cout<<"单链表显示:";
if(p==NULL)
{
cout<<"单链表为空:";
}
else if(p->next==NULL)
{
cout<<p->data;
}
else
{
while(p->next!=NULL)
{
cout<<p->data<<"->";
p=p->next;
}
cout<<p->data<<endl;
}
}