操作系统实验六


title: 操作系统实验六
categories:

  • 操作系统实验
    tags:

上机目的

1、(实验程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的工作过程。
2、假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度,本程序采用随机数来产生磁道数。

二、上机内容与要求

算法所需的各种参数由输入产生(手工输入或者随机数产生)。最后的结果要求是在运行四种算法的程序后,能够输出调度过程、平均寻道长度的正确结果。
课后习题练习,检测算法是否正确。

代码

#include <iostream>
#include <cmath>
using namespace std;
const int Length=9;
int Originset=100;
int CiDao[Length]={55,58,39,18,90,160,150,38,184};
void xzsort(int a[],int length)
{
	for(int i=0;i<length-1;i++)
	{
		int k=i;
		for(int j=i+1;j<length;j++)
		{
			if(a[j]<a[k]) k=j;
			
		}
		if(k!=i)
		{
			int middle =a[i];
			a[i]=a[k];
			a[k]=middle;
		}
	}
}
int FCFS()
{
	int FWLength=0;
	int nowset=Originset;
	for(int i=0;i<Length;i++)
	{
		FWLength=FWLength+abs(nowset-CiDao[i]);
		cout<<nowset<<"->"<<CiDao[i]<<"的长度为:"<<abs(nowset-CiDao[i])<<endl;
		nowset=CiDao[i];
	}
	return FWLength;
}

int SSTF()
{
	int FWLength=0;
	int newcidao[Length+1];
	int nowset=Originset;
	for(int i=0;i<Length+1;i++)
	{
		if(i!=Length)
		{
			newcidao[i]=CiDao[i];
		}
		else
		{
			newcidao[i]=nowset;
		}
	}
	xzsort(newcidao,Length+1);
	int nowsymbol=-1;
	for(int i=0;i<Length+1;i++)
	{
		if(newcidao[i]==nowset)
		{
			nowsymbol=i;
			break;
		}
	}
	bool fwsymbol[Length+1]={false};
	fwsymbol[nowsymbol]=true;
	int fwcount=1;
	while(fwcount!=Length+1)
	{
		int rear=10000;
		int front=10000
		;
		int i=nowsymbol+1;
		int j=nowsymbol-1;
		for(;i<Length+1;i++)
		{
			if(fwsymbol[i]==false)
			{
				rear = abs(newcidao[nowsymbol]-newcidao[i]);
				break;
			}
		}
		for(;j>=0;j--)
		{
			if(fwsymbol[j]==false)
			{
				front=abs(newcidao[nowsymbol]-newcidao[j]);
				break;
			}
		}
		if(rear>front)
		{
			FWLength=FWLength+front;
			cout<<newcidao[nowsymbol]<<"->"<<newcidao[j]<<"的长度为:"<<front<<endl;
			nowsymbol=j;
			fwsymbol[j]=true;
			fwcount++;
		}
		else
		{
			FWLength=FWLength+rear;
			cout<<newcidao[nowsymbol]<<"->"<<newcidao[i]<<"的长度为:"<<rear<<endl;
			nowsymbol=i;
			fwsymbol[i]=true;
			fwcount++;
			 
		}
	}
	return FWLength;
}

int SCAN()
{
	int FWLength=0;
		int newcidao[Length+1];
		int nowset=Originset;
		for(int i=0;i<Length+1;i++)
		{
			if(i!=Length)
			{
				newcidao[i]=CiDao[i];
			}
			else
			{
				newcidao[i]=nowset;
			}
		}
		xzsort(newcidao,Length+1);
		int nowsymbol=-1;
		for(int i=0;i<Length+1;i++)
		{
			if(newcidao[i]==nowset)
			{
				nowsymbol=i;
				break;
			}
		}
		for(int i=nowsymbol;i>0;)
		{
			if(i==Length)
			{
				FWLength=FWLength+abs(newcidao[i]-newcidao[nowsymbol-1]);
				cout<<newcidao[i]<<"->" <<newcidao[nowsymbol-1]<<"的长度为:"<<abs(newcidao[i]-newcidao[nowsymbol-1])<<endl;
				i=nowsymbol-1; 
			} 
			else if(i>=nowsymbol&&i<Length)
			{
				FWLength=FWLength+abs(newcidao[i]-newcidao[i+1]);
				cout<<newcidao[i]<<"->"<<newcidao[i+1]<<"的长度为:"<< abs(newcidao[i]-newcidao[i+1])<<endl;
				i++;
			}
			else if(i<nowsymbol)
			{
				FWLength=FWLength+abs(newcidao[i]-newcidao[i-1]);
				cout<<newcidao[i]<<"->"<<newcidao[i-1]<<"的长度为:"<<abs(newcidao[i]-newcidao[i-1])<<endl;
				i--;
			}
		} 
		return FWLength;
		
}

int CSCAN()
{
	int FWLength=0;
			int newcidao[Length+1];
			int nowset=Originset;
			for(int i=0;i<Length+1;i++)
			{
				if(i!=Length)
				{
					newcidao[i]=CiDao[i];
				}
				else
				{
					newcidao[i]=nowset;
				}
			}
			xzsort(newcidao,Length+1);
			int nowsymbol=-1;
			for(int i=0;i<Length+1;i++)
			{
				if(newcidao[i]==nowset)
				{
					nowsymbol=i;
					break;
				}
			}
			for(int i=nowsymbol;;)
			{
				if(i==Length)
				{
					FWLength=FWLength+abs(newcidao[i]-newcidao[0]);
					cout<<newcidao[i]<<"->" <<newcidao[0]<<"的长度为:"<<abs(newcidao[i]-newcidao[0])<<endl;
					i=0;
				}
				else if(i>=nowsymbol&&i<Length)
				{
					FWLength=FWLength+abs(newcidao[i]-newcidao[i+1]);
					cout<<newcidao[i]<<"->"<<newcidao[i+1]<<"的长度为:"<< abs(newcidao[i]-newcidao[i+1])<<endl;
					i++;
				}
				else if(i<nowsymbol)
				{
					FWLength = FWLength +abs(newcidao[i]-newcidao[i+1]);
					cout<<newcidao[i]<<"->"<<newcidao[i+1]<<"的长度"<<abs(newcidao[i]-newcidao[i+1])<<endl;
					i=i+1;
					if(nowsymbol!=0)
					{
						if(i==nowsymbol-1)
							{
								break;
												
							}
					}
					else
					{
						if(i==nowsymbol)
						{
							break;
						}
					}
					
				}
			}
			return FWLength;
}

int  main()
{
	cout<<"1.FCFS\n2.SSTF\n3.SCAN\n4.CSCAN\n请输入:";
	int  options;
	cin>>options;
	switch (options) {
		case 1:
			{int zoc=FCFS();
						cout<<"FCFS总长度为:"<<zoc<<endl<<"平均长度为:"<<zoc/1.0/Length;
			
						break;}
		case 2:
			{int zoc = SSTF();
			cout<<"SSTF总长度为:"<<zoc<<endl<<"平均长度为:"<<zoc/1.0/Length;			
			break;
			}
		case 3:
			{
				int zoc=SCAN();
				cout<<"SCAN总长度为:"<<zoc<<endl<<"平均长度为:"<<zoc/1.0/Length;
			break;
			}
			case 4:
				{
					int zoc=CSCAN();
					cout<<"CSCAN总长度为:"<<zoc<<endl<<"平均长度为:"<<zoc/1.0/Length;
					break; 
				}
		default:
			//TODO
			break;
	}
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elik-hb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值