📄 进程调度.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 + -