⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver.cpp

📁 本程序实现了操作系统中的驱动调度
💻 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 + -