📄 driver.cpp
字号:
#include<iostream>
#include<string>
#include<stdlib.h>
#include<time.h>
#include<Cmath>
using namespace std;
class I_O_Table //请求I/O表 接受请求
{
public:
string Process_Name;
int Cylinder_No;
int Track_No;
int Physic_Record;
int sign;
I_O_Table(){}
I_O_Table(string P_name,int C_name,int T_no,int P_record)
{
Process_Name=P_name;
Cylinder_No=C_name;
Track_No=T_no;
Physic_Record=P_record;
}
void Insert(string P_name,int C_name,int T_no,int P_record)
{
Process_Name=P_name;
Cylinder_No=C_name;
Track_No=T_no;
Physic_Record=P_record;
sign=0;
}
};
int Wait_Len=0;
I_O_Table wait[20];
int cylinder=0;//200个柱面有外向里编号(0 ~ 199)
int track=0;//每个柱面20个磁道,编号(0 ~ 19)-----即磁头号 或者 盘面号
int record=0;//磁道扇区物理记录编号(0 ~ 7)
int up_down=1;//电梯---1向上---0向下运动
int in_out=1;//磁头----1向里---0向外移动
int rotat=1;//磁盘-----1顺时针旋转----0逆时针旋转
void Access();
int size();
void move(int);
void main()
{
string go;
int seed[40]={1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0};
string pname[20]={"P1","P2","P3","P4","P5","P6","P7","P8","P9","P10","P11","P12","P13","P14","P15","P16","P17","P18","P19","P20"};
int cno[20]={197,89,77,35,5,2,4,50,1,23,134,22,44,56,75,0,29,98,111,146};
int tno[20]={3,5,1,7,8,5,0,12,14,1,3,2,4,13,19,4,2,5,8,10};
int precord[20]={1,2,3,5,0,3,1,2,9};
int waitno=0; //存放请求I/O表中等待的进程数
cout<<"输入请求I/O表中等待的进程数:";
cin>>waitno;
cout<<"开始请求I/O表的初始化"<<endl;
cout<<"进程名 柱面号 磁道号 物理记录面"<<endl;
srand((int)time(0));
for(int i=0;i<waitno;i++)
{
// int x=srand(time(NULL));
int j;
j=(int)(40*rand()/(RAND_MAX+1.0))+1;
cout<<"Press any key to continue"<<endl;
cin>>go;
if(seed[j]==0)
{
int address;
cout<<"输入物理地址为:";
cin>>address;
wait[Wait_Len].Insert(pname[Wait_Len],cno[Wait_Len],tno[Wait_Len],address);
cout<<pname[Wait_Len]<<" "<<cno[Wait_Len]<<" "<<tno[Wait_Len]<<" "<<address<<" sign"<<wait[Wait_Len].sign<<endl;
Wait_Len++;
}
else
{
cout<<"-----j------"<<j<<endl;
}/**/
}
cout<<"初始时刻:磁头臂-->里;电梯在最顶且-->下;为0柱面号;0物理记录"<<endl;
Access();
/*
srand((unsigned) time(&t));
printf("Ten random numbers from 0 to 99\n\n");
for(i=0; i<10; i++)
printf("%d\n", rand() % 2);*/
}
void Access()
{
int min=20;
int len=0;
int i(0);
for(;i<Wait_Len;i++)
{
if(abs(wait[i].Track_No-track)<min)//找最近的
{
min=wait[i].Track_No;
len=i;
}
}
cout<<"len="<<len<<" Wait_Len="<<Wait_Len<<endl;
while(size()!=Wait_Len)
{
while(1)
{
if(Wait_Len==len)
{
up_down=0;
len--;
break;
}
if(wait[len].sign==0)
{
cout<<"电梯上行----现在执行"<<wait[len].Process_Name<<"进程的请求:盘面号-->"<<wait[len].Track_No<<endl;
move(len);
wait[len].sign=1;
}
len++;
}
while(1)
{
if(len==0)
{
up_down=1;break;
}
if(wait[len].sign==0)
{
cout<<"电梯下行----现在执行"<<wait[len].Process_Name<<"进程的请求:盘面号-->"<<wait[len].Track_No<<endl;
move(len);
wait[len].sign=1;
}
len--;
}
}
cout<<"所有等待请求的进程已经全部响应!!!"<<endl;
}
int size()
{
int count=0;
for(int i=0;i<Wait_Len;i++)
{
if(wait[i].sign==1)count++;
}
return count;
}
void move(int i)
{
int symbol=0;
while(1)
{
if(cylinder==200)
{
cylinder--;
in_out=0;
break;
}
if(cylinder==-1)
{
cylinder++;
in_out=1;
break;
}
if(wait[i].Cylinder_No==cylinder)
{
symbol=1;
if(in_out==1)cout<<"磁头-->里移动"<<endl;
else cout<<"磁头-->外移动"<<endl;
break;
}
if(in_out==1)
cylinder++;
else cylinder--;
}
if(symbol==1)goto over;
while(1)
{
if(cylinder==-1)
{
cylinder++;
in_out=1;
break;
}
if(cylinder==200)
{
cylinder--;
in_out=0;
break;
}
if(wait[i].Cylinder_No==cylinder)
{
if(in_out==1)cout<<"磁头-->里移动"<<endl;
else cout<<"磁头-->外移动"<<endl;
break;
}
if(in_out==1)
cylinder++;
else cylinder--;
}
over:;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -