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

📄 8.cpp

📁 磁盘调度算法
💻 CPP
字号:
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

class table
{
private:
	string Pro;//定义进程名称
	int Team;//定义柱面号
	int Ci;//定义磁道面号
	int Rec;//定义记录号
public:
	static int count;                   
	table(){Pro="0";Team=0;Ci=0;Rec=0;}   
	void init(string pro,int team,int ci,int rec)
	{Pro=pro;Team=team;Ci=ci;Rec=rec;count++;}
	void del(){count--;}
	void add(){count++;}
	string get_Pro(){return Pro;}
	int get_Team(){return Team;}
	int get_Ci(){return Ci;}
	int get_Rec(){return Rec;}
	void show()
	{
		cout<<setw(9)<<Pro<<setw(7)<<Team<<setw(7)<<Ci<<setw(7)<<Rec<<endl;
	}
	void show2()
	{
		cout<<setw(9)<<Pro<<setw(7)<<Team<<setw(7)<<Ci<<setw(7)<<Rec;
	}
};

int table::count=0;

main()
{
	table io[20];   // 请求I/O表
	table out[20];  // 选中的进程表
	int k=1;        // 已选中的进程个数
	int i;
	int record=0;   // 记录选中的柱号
	int yi=0;       // 初始当前移臂方向为里移
	                // 用0代表里移UP-向柱号199方向,1代表外移DOWN-向柱号0方向
	int flag=0;
	int d[20];      // 记录调用的进程方向
	d[0]=0;
	int m=1;        // 已选中的进程方向个数
    char R='y';
	io[0].init("p1",100,10,1);
	io[1].init("p2",30,5,5);
	io[2].init("p3",40,2,4);
	io[3].init("p4",85,7,3);
	io[4].init("p5",60,8,4);  // 预先设置部分请求I/O表内容
	
	out[0].init("p0",0,0,0);
	out[0].del();
	cout<<"** 初始化: **"<<endl;
	cout<<"-----------------------------------------"<<endl;
	cout<<"     ---------- 请求I/O表 ----------     "<<endl;
	cout<<"      进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<endl;
	for(i=0;i<table::count;i++)
		io[i].show();
	cout<<endl;
	cout<<"     -------- 当前进程信息 ---------     "<<endl;
	cout<<"      进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<endl;
	out[0].show();
	cout<<endl;
	cout<<"     --- 电梯的当前移臂方向是: UP ---    "<<endl;
	cout<<"-----------------------------------------"<<endl;
    

    while(1)
	{
		
        float t;
		while(R=='y'){
		
		
		cout<<endl;
	   
		cout<<"请随机输入一个介于0~1的数"<<endl;
		
		cout<<"如输入2则显示当前请求I/O表"<<endl;
	    
		cin>>t;
		if(t==2)
		{
			cout<<"-----------------------------------------"<<endl;
			cout<<"     -------- 当前请求I/O表 --------     "<<endl;
			cout<<"      进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<endl;			
			for(i=0;i<table::count;i++)
				io[i].show();
			cout<<"-----------------------------------------"<<endl;
		}
		;
		
	    if(t<=0.5)
		{	
			cout<<endl;
			cout<<"** 接收请求: **"<<endl;
			string pro;
			int team,ci,rec;
			cout<<"请输入进程名: ";
			cin>>pro;
			cout<<"该进程柱面号(0-199):";
			cin>>team;
			cout<<"该进程磁道号(0-19):";
			cin>>ci;
			cout<<"该进程物理记录号(0-7):";
			cin>>rec;
			io[table::count].init(pro,team,ci,rec);
		
			cout<<endl;
			cout<<"-----------------------------------------"<<endl;
			cout<<"      ------ 新的请求I/O表 --------     "<<endl;
			cout<<"      进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<endl;
			for(i=0;i<table::count;i++)
				io[i].show();
			cout<<"-----------------------------------------"<<endl;
			cout<<"是否继续?y:继续,n:退出"<<endl;
			cin>>R;
			
		}
		;
		if(t>0.5&&t<=1)
		{
			cout<<endl;
			cout<<"** 驱动调度: **"<<endl;
			if(table::count==0)
				cout<<"*** I/O请求表为空。***"<<endl;
			else
			{
				for(i=0;i<table::count;i++)                   //找到相同的柱号 
				{
					if(io[i].get_Team()==out[k-1].get_Team())
					{
						flag=-1;                              //标志符置-1 
						record=i; 
						if(i==table::count-1)
							i=i+2;
						break;
					}
				}

				if(i==table::count)                           //柱号不相同
				{
				    io[table::count]=out[k-1];
				    io[table::count].add();
				    int min;
			    	min=io[0].get_Team();
                    for(int si=0;si<table::count-1;si++)      //进行排序
			 	    for(i=0;i<table::count-1;i++)             
					{	
					    if(io[i].get_Team()>io[i+1].get_Team())	
						{
						    table temp;
						    temp=io[i];
						    io[i]=io[i+1];
						    io[i+1]=temp;
						}
					}
					cout<<"-----------------------------------------"<<endl;

					for(i=0;i<table::count;i++)               //在请求I/O表中查找当前调度的进程
					{				
					    if(io[i].get_Team()==out[k-1].get_Team())
						{
							if(i==0&&yi==0)           
							{flag=i;record=i+1;break;}
							else if(i==0&&yi==1)
							{flag=i;record=i+1;yi=0;break;}
							else if(i==(table::count-1)&&yi==0)
							{flag=i;record=i-1;yi=1;break;}
							else if(i==(table::count-1)&&yi==1)
							{flag=i;record=i-1;break;}
							else if(i>0&&i<(table::count-1)&&yi==0)
							{flag=i;record=i+1;break;}
							else if(i>0&&i<(table::count-1)&&yi==1)
							{flag=i;record=i-1;break;}
							else
							;	   
						}
					}	    	
				}
				cout<<"电梯的当前移臂方向是:";
                if(yi==0)
				    cout<<"UP"<<endl;
				else
					cout<<"DOWN"<<endl;
				d[m]=yi;
				m++;
				cout<<endl;
				cout<<"调度的进程是:"<<endl;
				cout<<"      进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<endl;				
				io[record].show();                //显示调度的进程
				out[k]=io[record];
				k++;
				io[record]=io[table::count-1];    //进程被调度,从I/O表删除
				io[0].del();              
				if(flag!=-1)
				{
				    io[flag]=io[table::count-1];  //无相同柱面时,将加入请求表的进程删除
				    io[0].del();
				}		
				cout<<"-----------------------------------------"<<endl;
				cout<<"是否继续?y:继续,n:退出"<<endl;
				cin>>R;
			}
			}   
		}       
	}
	cout<<endl;
	cout<<"** 程序结束: **"<<endl;
	cout<<"----------------------------------------------"<<endl;
	cout<<"      ---------- 驱动调度过程 ----------     "<<endl;
	cout<<"      进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<setw(6)<<"方向"<<endl;
	for(i=0;i<k;i++)
	{
		if(d[i]==0)
		{out[i].show2();cout<<"      UP"<<endl;}
		else
		{out[i].show2();cout<<"      DOWN"<<endl;}	
	}	
	cout<<"----------------------------------------------"<<endl;
  return 0;  
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -