📄 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=1;//1表示占有 0表示空闲块
}
};
int const wait_length=20;
int Wait_Len=0;
I_O_Table wait[wait_length];
int cylinder=0;//200个柱面有外向里编号(0 ~ 199)
int track=0;//每个柱面20个磁道,编号(0 ~ 19)-----即磁头号 或者 盘面号
int record=0;//磁道扇区物理记录编号(0 ~ 7)
int up_down=0;//电梯---0向上---1向下运动
int in_out=1;//磁头----1向里---0向外移动
int rotat=1;//磁盘-----1顺时针旋转----0逆时针旋转
void Access();
int size();
void move(int);
int Find_Null();
int len=0;
int accessi(0);
void main()
{
int 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;
srand((int)time(0));
cout<<"初始时刻:磁头臂-->里;电梯在最顶且-->下;为0柱面号;0物理记录"<<endl;
while(1)
{
int j;
j=(int)(40*rand()/(RAND_MAX+1.0))+1;
gogo:
cout<<"\n输入[0 ~ 1]之间的随机数:";
cin>>go;
if(go<0||go>1)
{
cout<<"\n输入错误,请重新输入!!!"<<endl;
goto gogo;
}
if(1==go)
{
int address;
addr: cout<<"\n输入物理地址[0 ~ 7]:";
cin>>address;
if(address<0||address>7)
{
cout<<"\n输入错误,请重新输入!!!"<<endl;
goto addr;
}
else
{
int vx=Find_Null();
wait[vx].Insert(pname[vx],cno[vx],tno[vx],address);
if(vx==Wait_Len)Wait_Len++;
}
}
else
{
if(size()!=0)
{
Access();
}
else cout<<"现在没有I/O请求"<<endl;
//cout<<"-----j------"<<j<<endl;
}/**/
}
}
void Access()
{
int min=20;
while(1)
{
if(len==Wait_Len)
{
up_down=1;
}
if(1==wait[len].sign)
{
wait[len].sign=0;
if(1==up_down)
{
cout<<"\n电梯下行----现在执行"<<wait[len].Process_Name<<"进程的请求:\n盘面号-->"<<wait[len].Track_No;
move(len);
len--;
break;
}
else
{
cout<<"\n电梯上行----现在执行"<<wait[len].Process_Name<<"进程的请求:\n盘面号-->"<<wait[len].Track_No;
move(len);
len++;
break;
}
}
if(1==up_down)len--;
else len++;
}
cout<<"进程名 柱面号 磁道号 物理记录面"<<endl;
for(int xo=0;xo<Wait_Len;xo++)
{
if(wait[xo].sign==1)
{
cout<<wait[xo].Process_Name<<'\t'<<wait[xo].Cylinder_No<<'\t'<<wait[xo].Track_No<<'\t'<<wait[xo].Physic_Record<<endl;
}
}
cout<<endl;
}
int size()
{
int count=0;
for(int i=0;i<Wait_Len;i++)
{
if(wait[i].sign==1)count++;
}
return count;
}
int symbol=0;
void move(int i)
{
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<<"\t磁头-->里移动"<<endl;
else cout<<"\t磁头-->外移动"<<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:;
}
int Find_Null()
{
for(int i=0;i<wait_length;i++)
{
if(wait[i].sign==0)break;
}
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -