⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cipandiaodu.cpp

📁 操作系统中磁盘调度算法
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
#include<stdlib.h>
#define maxsize 100 //所分配的最多磁道数
#define flag 99999

//先来先服务调度算法

void FCFS(int array[],int m)
{
	int i,j;double sum=0;
	cout<<"调度顺序为:";
	for(i=0;i<m;i++)
	{
		cout<<array[i]<<" ";
	}
	cout<<endl;
	for(i=0,j=1;j<m;i++,j++)
	{
		sum+=fabs(array[j]-array[i]);//fabs求各个相邻磁道之绝对值
	}
	cout<<"总的磁道移动数:"<<"("<<sum<<")"<<endl;
	cout<<"平均移动的磁道数为: "<<"("<<sum/m<<")"<<endl<<endl;
}

//最短寻道时间优先调度算法

void ShortPath(int array[],int m)
{
	int current,i,j,k;
	double sum=0,temp=flag;
	cout<<"输入当前磁头所在磁道:  ";
	cin>>current;
	cout<<"调度顺序为:";
	for(j=0;j<m;j++)//扫描m遍
	{
		for(i=0;i<m;i++)//扫描一遍,找出一个离now最近的值
		{
			if(array[i]==flag)
				continue;
			if(fabs(current-array[i])<temp)
			{
				temp=fabs(current-array[i]);
				k=i;
			}
		}
		cout<<array[k]<<"   ";
		sum+=(fabs(current-array[k]));//统计移动的磁道总数
		current=array[k];//找到离now最近的元素输出后,now的值变成刚才输出的元素
		array[k]=flag;//将扫描过的元素标记为flag,可以跳过以后的扫描
		temp=flag;//还原比较值,用于下次扫描进行比较
	}
	cout<<endl;
	cout<<"	总的磁道移动数:"<<"("<<sum<<")"<<endl;
	cout<<"	平均移动磁道数:"<<"("<<sum/m<<")"<<endl<<endl;
}
//单向扫描
void SCAN(int array[],int m) //要给出当前磁道号和移动臂的移动方向
{
	int temp;
	int k=1;
	int current,l,r;
	int i,j;
	char a;
	double sum=0;
	for(i=0;i<m;i++)//将元素按从小到大进行排序
		for(j=i+1;j<m;j++)
		{
			if(array[i]>array[j])
			{
				temp=array[i];
				array[i]=array[j];
				array[j]=temp;
			}
		}
	cout<<"请输入当前磁头所在的磁道号:";
	cin>>current;
	if(array[m-1]<=current)//如果当前磁头距最大磁道数最近,则将排序后的数组反向顺序输出
	{	
		cout<<"调度顺序为:";
		for(i=m-1;i>=0;i--)
			cout<<array[i]<<" ";
		sum=current-array[0];//计算总的移动磁道数
	}
	else
		if(array[0]>=current)//如果当前磁头距最小磁道数最近,则将排序后的数组顺序输出
		{
			cout<<"调度顺序为:";
			for(i=0;i<m;i++)
				cout<<array[i]<<" ";
			sum=array[m-1]-current;//计算总的移动磁道数
		}
		else//now在数组中
		{
			while(array[k]<current)
			{
				k++;
			}
			l=k-1;
			r=k;//确定array[l]<now<array[r]
			cout<<"请输入当前移动臂的移动的方向 (i 表示向内 ,o表示向外) : ";
			cin>>a;
			cout<<"调度顺序为:";
			if(a=='i')
			{
				for(j=l;j>=0;j--)
				{
					cout<<array[j]<<" ";
				}
				for(j=r;j<m;j++)
				{
					cout<<array[j]<<" ";
				}
				sum=current-2*array[0]+array[m-1];
			}
			else
			{
				for(j=r;j<m;j++)
				{
					cout<<array[j]<<" ";
				}
				for(j=l;j>=0;j--)
				{
					cout<<array[j]<<" ";
				}
				sum=2*array[m-1]-current-array[0];
			}
		}
		cout<<endl;
		cout<<"	总的磁道移动数:"<<"("<<sum<<")"<<endl;
		cout<<"	平均移动磁道数: "<<"("<<sum/m<<")"<<endl<<endl;
}
//循环扫描调度算法
void CSCAN(int array[],int m)
{
	int temp;
	int k=1;
	int current,l,r;
	int i,j;
	double sum=0;
	for(i=0;i<m;i++)
		for(j=i+1;j<m;j++)
		{
			if(array[i]>array[j])
			{
				temp=array[i];
				array[i]=array[j];
				array[j]=temp;
			}
		}
cout<<"请输入当前磁头所在的磁道号:";
cin>>current;
if(array[m-1]<=current)//如果当前磁头距最大磁道数最近,则将排序后的数组反向顺序输出
{	
	cout<<"调度顺序为:";
	for(i=0;i<m;i++)
		cout<<array[i]<<" ";
	sum=current-array[0]+array[m-1];
}
else
	if(array[0]>=current)//如果当前磁头距最小磁道数最近,则将排序后的数组顺序输出
	{
		cout<<"调度顺序为:";
		for(i=0;i<m;i++)
			cout<<array[i]<<" ";
		sum=array[m-1]-current;
	}
    else
	{	
		cout<<"调度顺序为:";
		while(array[k]<current)
		{
			k++;
		}
		l=k-1;
		r=k;
		for(j=r;j<m;j++)
		{
			cout<<array[j]<<" ";
		}
		for(j=0;j<r;j++)
		{
			cout<<array[j]<<" ";
		}
		sum=2*array[m-1]-current;
	}
	cout<<endl;
	cout<<"	总的磁道移动数:"<<"("<<sum<<")"<<endl;
    cout<<"	平均移动磁道数: "<<"("<<sum/m<<")"<<endl<<endl;
}
//主函数
void main()
{
	int c;
	int cidao[maxsize],beifen1[maxsize],beifen2[maxsize];//相当于最多进程数
	int i=0,a,count;//a用来暂时记录输入的磁道数
	cout<<endl;
	cout<<"请输入要访问的磁道(0为结束标志):"<<endl;
	cin>>a;
	while(a!=0&&i<=maxsize)//将所占的数磁道放入数组
	{
		cidao[i]=a;
		beifen1[i]=a;
		beifen2[i]=a;
		i++;
		cin>>a;
	}
	count=i;//count记录总的个数
	cout<<endl;
	while(1)
	{
		cout<<"请选择服务方式:"<<endl<<endl;
		cout<<"1. 先来先服务 2. 最短寻道时间优先 "<<endl;
		cout<<"3. 电梯调度  4. 循环扫描   5. 退出"<<endl;
		cout<<"请选择服务:";
		cin>>c;
		if(c>5)
		{
			cout<<"请重新输入:"<<endl;
			continue;
		}
		switch(c)
		{
			case 1:  FCFS(cidao,count); break;
			case 2:  ShortPath(cidao,count); break;
			case 3:  SCAN(beifen1,count); break;
			case 4:  CSCAN(beifen2,count);  break;
			case 5:  exit(0);
		}
	}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -