磁盘调度—FCFS与SSTF算法

磁盘是高速、大容量、旋转型、可直接存取的存储设备,它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出请求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求,由于磁盘访问时间主要受寻道时间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;
	}
}

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值