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;
}