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

📄 进程调度.cpp

📁 操作系统的几个实验
💻 CPP
字号:

#include<iostream.h>
#include<stdio.h>

#define PROCESS_NUM  1000

int choose_arithmetic(int);        //3种不同算法的选择:1.FIFO   2.时间片轮转调度(Timeslice_cycle)  3.优先级算法(PRI)
void process_set();                //实验进程参数的设置
void Run_FIFO();                   //运行FIFO算法
void Run_Timeslice_cycle();        //运行时间片轮转调度算法
void Run_PRI();                    //运行优先级算法算法
void Display_Title();              //输出表格头
void Display_Data();               //输出进程各项参数
bool Check_WorkTime();             //计算还需运行时间

struct PCB
{
	char ProcessID;                //进程标识ID
	unsigned short int PRI;        //进程优先级数
	unsigned short int Chip;       //时间片数
	unsigned short int CPUTime;    //进程已经占用CPU的时间
	unsigned short int WorkTime;   //进程还需要运行的时间
	char State;                    //进程的状态,运行E、就绪R和完成F三种状态之一
};

PCB Process[PROCESS_NUM];
int P_N;

//3种不同算法的选择:1.FIFO   2.时间片轮转调度(Timeslice_cycle)  3.优先级算法(PRI)
//返回选择的值
int choose_arithmetic(int a)
{
	cout<<"请选择调度算法:  "<<endl;
	cout<<"************************************"<<endl;
	cout<<"1.先来先服务(FIFO)"<<endl;
	cout<<"2.时间片轮转调度(Timeslice_cycle)"<<endl;
	cout<<"3.优先级算法(PRI)"<<endl;
	cout<<"************************************"<<endl;
	cout<<"选择:";
	cin>>a;
	if(a<1||a>3)
	{
		cout<<"输入错误!"<<endl;
		cout<<"************************************"<<endl;
		cout<<"请重新选择:";
		cin>>a;
	}
	else return a;
}

//设置进程的各种参数
void process_set()
{
	cout<<"************************************"<<endl;
	cout<<"请输入进程数:";
L1:	cin>>P_N;
	if (P_N<1)                                 //防止非法输入  P_N必需大于0
	{
		cout<<"输入错误!"<<endl;
		cout<<"************************************"<<endl;
		cout<<"请重新输入进程数:";
		goto L1;
	}
	else
	{
		if(P_N>0)
		{
			for(int i=0;i<P_N;i++)
			{
				Process[i].ProcessID='A'+i;
				Process[i].State='R';
				Process[i].CPUTime=0;
				cout<<"请输入进程 "<<Process[i].ProcessID<<" 的时间片数 :";
				cin>>Process[i].Chip;
				while(Process[i].Chip<=0)      //防止非法输入 Process[i].Chip必需大于0
				{
					cout<<"输入错误!"<<endl;
					cout<<"************************************"<<endl;
					cout<<"请输入进程 "<<Process[i].ProcessID<<" 的时间片数 :";
					cin>>Process[i].Chip;
				}
				if(Process[i].Chip==0)
				{
					Process[i].State='F';
				}
				Process[i].WorkTime=Process[i].Chip;
				Process[i].PRI=Process[i].Chip;
			}
			Display_Title();
			Display_Data();
		}
	}

}


//FIFO算法
void Run_FIFO()
{
	int check_data=0;
	char a;
	cout<<"Press ENTER key to continue..."<<endl;
	a=getchar();
	for(int i=0;i<PROCESS_NUM;i++)
	{
		PCB buffer;
		while(Process[i].WorkTime!=0)
		{
			Process[i].CPUTime++;
			Process[i].WorkTime--;
			if(Process[i].WorkTime==0)
			{
				Process[i].State='F';
				check_data++;
			}
			Display_Title();
			Display_Data();
			cout<<"Press ENTER key to continue..."<<endl;
			a=getchar();
		}
	
	}
	cout<<"Process are finished."<<endl;
}


//时间片轮转调度算法
void Run_Timeslice_cycle()
{
	char cID,a;
	int j,check_data=0;
	bool i;
	PCB buffer;
	cout<<"请输入你首先要运行的进程(A";
	for(int ii=1;ii<P_N;ii++)
	{
		cout<<","<<(char)('A'+ii);
	}
	cout<<")";
	cin>>cID;
	j=(int)(cID-'a');
	buffer=Process[j];
	for(ii=0;ii<j;ii++)
	{
		buffer=Process[0];
		for(int k=0;k<(P_N-1);k++)
		{			
			Process[k]=Process[k+1];
		}
		Process[(P_N-1)]=buffer;
	}
	while(i)
	{
		PCB buffer;
		if(Process[0].WorkTime!=0)
		{
			Process[0].CPUTime++;
			Process[0].WorkTime--;
			if(Process[0].WorkTime==0)
			{
				Process[0].State='F';
				check_data++;
			}
		}
		buffer=Process[0];
		for(int j=0;j<(P_N-1);j++)
		{			
			Process[j]=Process[j+1];
		}
		Process[(P_N-1)]=buffer;
		Display_Title();
    	Display_Data();
		cout<<"Press ENTER key to continue..."<<endl;
		a=getchar();
		i=bool(Check_WorkTime);
		if(check_data==P_N) 
		{
			i=0;
			cout<<"Process are finished."<<endl;
		}
	}
}


//优先级算法
void Run_PRI()
{
	int check_data=0;
	bool i;
	char a;
	i=bool(Check_WorkTime);
	cout<<"Press ENTER key to continue..."<<endl;
	a=getchar();
	while(i)
	{
		PCB buffer;
		int p1=0,p2=1;
		while(p2<=P_N)                   //优先级排序
		{
			if(Process[p1].PRI>=Process[p2].PRI)
			{
				p2++;
			}
			else
			{
				p1=p2;
				p2++;
			}
		}
		Process[p1].CPUTime++;
		Process[p1].WorkTime--;
		if(Process[p1].WorkTime==0)
		{
			Process[p1].State='F';
			Process[p1].PRI=0;
			check_data++;
		}
		Display_Title();
    	Display_Data();
		cout<<"按Enter键继续运行程序"<<endl;
		a=getchar();
		i=bool(Check_WorkTime);
		if(check_data==P_N) 
		{
			i=0;
			cout<<"所有进程已运行结束。"<<endl;
		}
	}
}


//标题头函数
void Display_Title()
{
 cout<<"***************************************************************************"<<endl;
 cout<<"    进程标识ID "<<"   进程优先数"<<"   时间片数";
 cout<<"   已运行时间"<<"   还要运行时间"<<"   状态"<<endl;
 cout<<"---------------------------------------------------------------------------"<<endl;
}


//进程参数的输出
void Display_Data()
{
	for(int i=0;i<P_N;i++)
	{
		cout<<"        ";
		cout<<Process[i].ProcessID<<"              ";
		cout<<Process[i].PRI<<"           ";
		cout<<Process[i].Chip<<"           ";
		cout<<Process[i].CPUTime<<"           ";
		cout<<Process[i].WorkTime<<"           ";
		cout<<Process[i].State<<endl;
	}
	cout<<"***************************************************************************"<<endl;
}


bool Check_WorkTime()
{
	for(int i=0;i<P_N;i++)
	{
		if(Process[i].State!='F')
		{
			return true;
		}
		
	}
	return false;
}



//主函数
void main()
{
	int a;
	a=choose_arithmetic(a);  
	process_set();
	switch(a)
	{
	case 1:
		Run_FIFO();
		break;
	case 2:
		Run_Timeslice_cycle();
		break;
	case 3:
		Run_PRI();
		break;
	}
}

⌨️ 快捷键说明

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