操作系统实验——多级反馈队列算法

(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;
               }
            }
         }
      }
   }
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值