# include <cstdio>
# include <cstring>
# include <cmath>
# include <algorithm>
# include <iostream>
using namespace std;
const int maxn = 100;
const int size = 1000;
const int p_size = 10000;
int pass[p_size];
int flag;
int flag1;
int n,now;
int s,sum;
int nnow,everage;
int p[maxn],b[maxn],sp[maxn],lenp[maxn];
struct node{
int cnum; //控制器号
int cstate; //控制器状态 ,0空闲 ,1占用
int connum; //连接设备号
int conpass[5]; //连接通道号
}controller[size]; //控制器
struct node1{
char name[100];
int dnum; //设备号
int conc; //连接控制器号
}device[size]; //设备
int sc()
{
printf("\n->请输入选择: ");
int a;
scanf("%d",&a);
printf("\n");
return a;
}
void ask()
{
printf("请输入分配设备信息:\n");
int n;
printf("->设备号:");
scanf("%d",&n);
while(device[n].dnum)
{
printf("该设备号已存在!\n");
printf("->设备号:");
scanf("%d",&n);
}
device[n].dnum = n;
printf("->设备名:");
scanf("%s",device[n].name);
printf("->连接的控制器号:");
int p, a, b, c;
scanf("%d",&p);
while(controller[p].cstate)
{
printf("该控制器已被占用,请重新选择!\n");
printf("->连接的控制器号:");
scanf("%d",&p);
}
device[n].conc = p;
controller[p].cstate = 1;
controller[p].connum = n;
printf("->连接通道号(3个通道):");
scanf("%d%d%d",&a,&b,&c);
while(pass[a] || pass[b] || pass[c])
{
if(pass[a]) printf("%d通道已被占用,请重新选择!\n",a);
if(pass[b]) printf("%d通道已被占用,请重新选择!\n",b);
if(pass[c]) printf("%d通道已被占用,请重新选择!\n",c);
printf("->连接通道号(3个):");
scanf("%d%d%d",&a,&b,&c);
}
controller[p].conpass[0] = a;
controller[p].conpass[1] = b;
controller[p].conpass[2] = c;
pass[a] = p;
pass[b] = p;
pass[c] = p;
flag++;
flag1++;
printf("分配成功!\n\n");
}
void rid()
{
printf("->请输入释放设备号:");
int n;
scanf("%d",&n);
int m = 1;
if(!device[n].dnum) printf("不存在设备!\n\n");
else if(!device[n].conc) printf("该设备空闲!\n\n");
else
{
int a = device[n].conc;
device[n].conc = 0;
controller[a].cstate = 0;
controller[a].connum = 0;
pass[controller[a].conpass[0]] = 0;
pass[controller[a].conpass[1]] = 0;
pass[controller[a].conpass[2]] = 0;
flag1--;
printf("释放成功!\n\n");
}
}
void del()
{
printf("->请输入删除设备号:");
int n;
scanf("%d",&n);
if(!device[n].dnum) printf("不存在设备!\n\n");
else
{
if(device[n].conc) flag1--;
int a = device[n].conc;
device[n].dnum = 0;
device[n].conc = 0;
controller[a].cstate = 0;
controller[a].connum = 0;
pass[controller[a].conpass[0]] = 0;
pass[controller[a].conpass[1]] = 0;
pass[controller[a].conpass[2]] = 0;
flag--;
printf("删除成功!\n\n");
}
}
void allot() //设备管理
{
printf("---------------------------------\n");
printf("--------设备管理-----------------\n");
printf("--------1、请求分配--------------\n");
printf("--------2、释放------------------\n");
printf("--------3、删除------------------\n");
printf("--------0、返回------------------\n");
printf("---------------------------------\n");
int n = sc();
while(n<0 || n>3)
{
printf("输入错误,请重新输入!\n");
n = sc();
}
if(n==1) ask();
else if(n==2) rid();
else if(n==3) del();
else return;
allot();
}
void exl1() //设备分配表
{
if(!flag) printf("没有设备!\n");
else
{
int mark = 0;
printf(" 设备名 设备号 连接控制器号\n");
for(int i=1;i<size;i++)
{
if(device[i].dnum)
{
mark++;
printf("%8s %4d %8d\n",device[i].name,device[i].dnum,device[i].conc);
}
if(mark>=flag) break;
}
}
printf("\n");
}
void exl2() //通道分配表
{
if(!flag1) printf("没有通道被占用!\n");
else
{
int mark = 0;
printf("已占用通道:\n");
printf(" 通道号 连接控制器号\n");
for(int i=1;i<p_size;i++)
{
if(pass[i])
{
printf("%6d %6d\n",i,pass[i]);
mark++;
}
if(mark>=3*flag) break;
}
}
printf("\n");
}
void exl3() //控制器分配表
{
if(!flag1) printf("没有控制器被占用!\n");
else
{
int mark = 0;
printf(" 控制器号 控制器状态 连接设备号 连接通道号\n");
for(int i=1;i<size;i++)
{
if(controller[i].cstate)
{
printf("%8d %6d %6d %2d %2d %2d\n",controller[i].cnum,controller[i].cstate,controller[i].connum,controller[i].conpass[0],controller[i].conpass[1],controller[i].conpass[2]);
mark++;
}
if(mark>=flag) break;
}
}
printf("\n");
}
void manage() //分配信息
{
printf("---------------------------------\n");
printf("--------分配信息-----------------\n");
printf("--------1、设备分配表------------\n");
printf("--------2、通道分配表------------\n");
printf("--------3、控制器分配表----------\n");
printf("--------0、返回------------------\n");
printf("---------------------------------\n");
int n = sc();
while(n<0 || n>3)
{
printf("输入错误,请重新输入!\n");
n = sc();
}
if(n==1) exl1();
else if(n==2) exl2();
else if(n==3) exl3();
else return;
manage();
}
void show()
{
sum=0;
cout<<"\n被访问的下一磁道号 移动距离(磁道数)\n";
for(int i=0;i<n;++i)
{
printf("%10d %8d\n",sp[i],lenp[i]);
sum+=lenp[i];
}
cout<<"\n平均寻道长度:"<<(double)sum/n<<"\n";
}
void FCFS() //先来先服务
{
for(int i=0;i<n;++i)
{
sp[i]=p[i];
if(i) lenp[i]=abs(sp[i-1]-sp[i]);
else lenp[i]=abs(now-sp[i]);
}
}
void SSTF() //最短寻道优先
{
nnow=now;
int fl[maxn]={0};
for(int i=0;i<n;++i)
{
int minx=999999,pp;
for(int j=0;j<n;++j)
{
if(!fl[j]&&abs(nnow-p[j])<minx)
{
minx=abs(nnow-p[j]);
pp=j;
}
}
sp[i]=p[pp];
lenp[i]=minx;
nnow=p[pp];
fl[pp]=1;
}
}
bool cmp(int a,int b)
{
return a>b;
}
void SCAN() //扫描算法
{
nnow=now;
int aa[maxn],bb[maxn],ak=0,bk=0;
for(int i=0;i<n;++i)
{
if(p[i]<nnow)aa[ak++]=p[i];
else bb[bk++]=p[i];
}
sort(aa,aa+ak,cmp);
sort(bb,bb+bk);
int i=0;
for(int j=0;j<bk;++j)
{
sp[i]=bb[j];
lenp[i++]=bb[j]-nnow;
nnow=bb[j];
}
for(int j=0;j<ak;++j)
{
sp[i]=aa[j];
lenp[i++]=nnow-aa[j];
nnow=aa[j];
}
}
void CSCAN() //循环扫描算法
{
nnow=now;
int aa[maxn],bb[maxn],ak=0,bk=0;
for(int i=0;i<n;++i)
{
if(p[i]<nnow)aa[ak++]=p[i];
else bb[bk++]=p[i];
}
sort(aa,aa+ak);
sort(bb,bb+bk);
int i=0;
for(int j=0;j<bk;++j)
{
sp[i]=bb[j];
lenp[i++]=bb[j]-nnow;
nnow=bb[j];
}
for(int j=0;j<ak;++j)
{
sp[i]=aa[j];
lenp[i++]=abs(aa[j]-nnow);
nnow=aa[j];
}
}
void dispatch() //磁盘调度
{
xbegin:
cout<<"->请输入被访问的总磁道数: ";
cin>>n;
if(n<=0||n>100)
{
cout<<"输入不合法,请重新输入!\n";
goto xbegin;
}
nowCD:
cout<<"->请输入当前磁道: ";
cin>>now;
if(now<0)
{
cout<<"磁道不存在,请重新输入!\n";
goto nowCD;
}
pCD:
cout<<"->请按顺序输入所有需要访问的磁道:";
for(int i =0;i<n;++i)cin>>p[i];
for(int i=0;i<n;++i)
{
//b[i]=p[i];
if(p[i]<0)
{
cout<<"输入中有不存在的磁道,请重新输入!\n";
goto pCD;
}
}
serve:
cout<<"\n";
cout<<"---------------------------------\n";
cout<<"----磁盘调度---------------------\n";
cout<<"----1、先来先服务算法(FCFS)----\n";
cout<<"----2、最短寻道优先算法(SSTF)--\