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

📄 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=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 + -