(1)模拟算法可采用C/C++语言实现;
(2)队列分4级,每级时间片大小为别为1、2、4、8,第一级队列优先级最高,后面依次递减;
(3)至少模拟不少于4个进程的调度过程,进程基本信息包含进程名称、进程PID、进程到达时间、进程服务时间(其中进程的PID标识为0~5000之间的随机整数);
(4)每次新进程进入系统时,显示当前系统中各队列的状态(至少包含进程基本信息、进程所处队列、进程的剩余运行时间等信息内容);
(5)当有进程离开系统时,显示当前系统中各队列的状态(至少包含进程基本信息、进程所处队列、进程的剩余运行时间等信息内容);
(6)直至所有进程离开系统,程序结束
首先定义了一个结构体PCB,用于表示进程,包括进程名、进程ID、到达时间、服务时间、所需时间和级别等属性。然后定义了一个队列数组q,用于存储不同级别的队列。接下来,程序从用户输入中获取需要调度的进程个数,并创建一个PCB数组来存储这些进程的信息。
在主函数中,首先对进程按照到达时间进行排序,并将第一个进程放入队列q[0]中。然后进入一个循环,不断检查当前时间是否等于下一个进程的到达时间,如果是,则将该进程加入队列q[0]。同时,根据进程的服务时间和剩余运行时间,将其降级到下一级队列(如果需要)。
在每个循环迭代中,程序还会检查当前队列中的进程是否执行完毕,如果执行完毕,则将其从队列中移除,并输出相关信息。最后,当所有进程都执行完毕时,程序结束。
实验代码如下:
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
typedef struct PCB{//表示进程
string pname;
int pid;
int arrival_time;
int server_time;
int need_time;
int level;
int survival_time;
}PCB;
int time_slice[4]={1,2,4,8};
queue<PCB>q[4];
int pcb_num;
bool cmp(PCB pcb1,PCB pcb2){
return pcb1.arrival_time<pcb2.arrival_time;
}
void print_queue(queue<PCB>q){
int count=0;
while(!q.empty()){
count++;
cout<<" 队列中第"<<count<<"个进程的基本信息如下:"<<endl;
PCB temp=q.front();
cout<<" 进程名称:"<<temp.pname<<endl;
cout<<" 进程PID:"<<temp.pid<<endl;
cout<<" 进程到达时间:"<<temp.arrival_time<<endl;
cout<<" 进程服务时间:"<<temp.server_time<<endl;
cout<<" 进程所处队列:"<<temp.level+1<<endl;
cout<<" 进程剩余运行时间:"<<temp.need_time<<endl;
q.pop();
}
};
int main(){
cout<<"请输入需要调度的进程个数:"<<endl;
cin>>pcb_num;
PCB pcb[pcb_num];
for (int i = 0; i < pcb_num; i++){
string pname;
int pid;
int arrival_time;
int server_time;
int need_time;
cout<<"请输入第"<<i+1<<"个进程的名称,到达时间(单位:秒),服务时间(单位:秒)"<<endl;
cin>>pname>>arrival_time>>server_time;
pcb[i].pname=pname;
pcb[i].pid=i;
pcb[i].arrival_time=arrival_time;
pcb[i].server_time=server_time;
pcb[i].need_time=server_time;
pcb[i].survival_time=1;
pcb[i].level=0;
}
sort(pcb,pcb+pcb_num-1,cmp);
q[0].push(pcb[0]);
int time=pcb[0].arrival_time;
int cpu_pid=pcb[0].pid;
int com_num=0;
cout<<"当前时间为:"<<time<<endl;
cout<<"进程名称为:\""<<pcb[com_num].pname<<"\"的进程已经进入系统"<<endl;
for(int i=0;i<4;i++){
if(!q[i].empty()){
cout<<i+1<<"级队列信息如下:"<<endl;
print_queue(q[i]);
}else{
cout<<i+1<<"级队列为空"<<endl;
}
}
while (!q[0].empty()||!q[1].empty()||!q[2].empty()||!q[3].empty()||com_num!=pcb_num-1){
time++;
if(!q[0].empty()){
int survivla=--q[0].front().survival_time;//占用处理机的时间减一
int need=q[0].front().need_time--;//进程所需时间减一
PCB temp=q[0].front();
if(temp.need_time==0){//进程执行完毕
q[0].pop();
cout<<"\n\n";
cout<<"当前时间为:"<<time<<endl;
cout<<"进程名称为:\""<<temp.pname<<"\"的进程已经离开系统"<<endl;
for(int i=0;i<4;i++){//输出目前队列信息
if(!q[i].empty()){
cout<<i+1<<"级队列信息如下:"<<endl;
print_queue(q[i]);
}else{
cout<<i+1<<"级队列为空"<<endl;
}
}
}else{//进程未执行完毕
if(survivla==0){//下处理机,降级
q[1].push(q[0].front());
q[1].back().survival_time=time_slice[1];
q[1].back().level=1;
q[0].pop();
}
}
}else if(!q[1].empty()){
int survivla=--q[1].front().survival_time;//占用处理机的时间减一
int need=q[1].front().need_time--;//进程所需时间减一
PCB temp=q[1].front();
if(temp.need_time==0){//进程执行完毕
q[1].pop();
cout<<"\n\n";
cout<<"当前时间为:"<<time<<endl;
cout<<"进程名称为:\""<<temp.pname<<"\"的进程已经离开系统"<<endl;
for(int i=0;i<4;i++){//输出目前队列信息
if(!q[i].empty()){
cout<<i+1<<"级队列信息如下:"<<endl;
print_queue(q[i]);
}else{
cout<<i+1<<"级队列为空"<<endl;
}
}
}else{//进程未执行完毕
if(survivla==0){//下处理机,降级
q[2].push(q[1].front());
q[2].back().survival_time=time_slice[2];
q[2].back().level=2;
q[1].pop();
}
}
}else if(!q[2].empty()){
int survivla=--q[2].front().survival_time;//占用处理机的时间减一
int need=q[2].front().need_time--;//进程所需时间减一
PCB temp=q[2].front();
if(temp.need_time==0){//进程执行完毕
q[2].pop();
cout<<"\n\n";
cout<<"当前时间为:"<<time<<endl;
cout<<"进程名称为:\""<<temp.pname<<"\"的进程已经离开系统"<<endl;
for(int i=0;i<4;i++){//输出目前队列信息
if(!q[i].empty()){
cout<<i+1<<"级队列信息如下:"<<endl;
print_queue(q[i]);
}else{
cout<<i+1<<"级队列为空"<<endl;
}
}
}else{//进程未执行完毕
if(survivla==0){//下处理机,降级
q[3].push(q[2].front());
q[3].back().survival_time=time_slice[3];
q[3].back().level=3;
q[2].pop();
}
}
}else if(!q[3].empty()){
int survivla=--q[3].front().survival_time;//占用处理机的时间减一
int need=q[3].front().need_time--;//进程所需时间减一
PCB temp=q[3].front();
if(temp.need_time==0){//进程执行完毕
q[3].pop();
cout<<"\n\n";
cout<<"当前时间为:"<<time<<endl;
cout<<"进程名称为:\""<<temp.pname<<"\"的进程已经离开系统"<<endl;
for(int i=0;i<4;i++){//输出目前队列信息
if(!q[i].empty()){
cout<<i+1<<"级队列信息如下:"<<endl;
print_queue(q[i]);
}else{
cout<<i+1<<"级队列为空"<<endl;
}
}
}else{//进程未执行完毕
if(survivla==0){//下处理机,降级
q[3].push(q[3].front());
q[3].back().survival_time=time_slice[3];
q[3].back().level=3;
q[3].pop();
}
}
}
if(com_num<pcb_num-1){//如果指定进程还没有全部进入系统
if(time==pcb[com_num+1].arrival_time){
q[0].push(pcb[++com_num]);//新的进程进入了系统
cout<<"\n\n";
cout<<"当前时间为:"<<time<<endl;
cout<<"进程名称为:\""<<pcb[com_num].pname<<"\"的进程已经进入系统"<<endl;
for(int i=0;i<4;i++){
if(!q[i].empty()){
cout<<i+1<<"级队列信息如下:"<<endl;
print_queue(q[i]);
}else{
cout<<i+1<<"级队列为空"<<endl;
}
}
}
}
}
}