#include <bits/stdc++.h>
using namespace std;
int a[100],s[100],y[100],A[100],n;//a[]代表来的时间,s[]代表剩余服务时间 ,y[]代表服务时间 ,n代表进程总数 
bool check()
{    for(int k=1;k<=n;k++)
        if(s[k]>0)
        return false;
    return true;
}
int main()
{    cout<<"****非抢占式多级反馈队列调度算法****"<<endl;
    cout<<"请输入进程总数:";
    cin>>n;
    cout<<"请输入队列最高级数:";
    int i;
    cin>>i;
    int w[i+1][n+1]={};//记录各个队列中的进程 w[1][2]=3 代表第一队列中第二个等待的进程号为3 
    int end[n+1]={};//记录结束时间 
    for(int k=1;k<=n;k++)
    {    cout<<k<<":"<<endl;
        int p;
        cout<<"请依次输入进程的信息"<<endl;
        cout<<"请输入进程代号pn=";
        cin>>p;
        cout<<"请输入到达时间at=";
        cin>>a[k];
        cout<<"请输入服务时间st=";
        cin>>s[k]; 
        y[k]=s[k];
        A[k]=a[k];
    }
    printf("调度序号     运行的进程pn     开始运行时刻     运行时间     剩余服务时间     结束运行时刻\n");
    int t=0;
    int g=1;//进程到达时加入第一队列; 
    int xuhao=1;
    while(!check())
    {    if(A[g]>=0&&A[g]<=t&&g<=n)
        {    int u;
            for(u=1;u<=n;u++)
            {    if(w[1][u]==0)
                break;
            }
            w[1][u]=g;
            A[g]=-0.1;//进入第一队列后就不会在让它进入了。 
            g++;
        }
        int d,e;//记录这一次该哪个进程运行了。 
        for(int k=1;k<=i;k++)
        {    if(w[k][1]>=1)
                {    d=k;
                    e=w[k][1];
                    break;
                }
        }
        int time=pow(2,d-1);//运行时间
        if(s[e]>time)//该时间片不能让该进程结束。 
        {    s[e]=s[e]-time;
            w[d][1]=0;
            for(int h=2;h<=n;h++)//这一队列后面的整体往前移一位 
             if(w[d][h]>=1)
             {    int temp=w[d][h];
                 w[d][h]=w[d][h-1];
                 w[d][h-1]=temp;
             }
            for(int k=1;k<=n;k++)//进入下一队列; 
            {    if(w[d+1][k]==0)
                {w[d+1][k]=e;
                break;
                }
             } 
            printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",xuhao,e,t,time,s[e],t+time);
            t=t+time;
            xuhao++;
            continue;
        }
        else if(s[e]==time)//真好能结束
        {    s[e]=0;
            w[d][1]=0;
            for(int h=2;h<=n;h++)//这一队列后面的整体往前移一位 
             if(w[d][h]>=1)
             {    int temp=w[d][h];
                 w[d][h]=w[d][h-1];
                 w[d][h-1]=temp;
             }
            end[e]=t+time;
            printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",xuhao,e,t,time,s[e],t+time); 
            t=t+time;
            xuhao++;
            continue;
         } 
         else//这一时间片能结束该进程
         {    end[e]=t+s[e];//s[e]是真正运行时间 
             int z=s[e];
             s[e]=0;
             w[d][1]=0;
             for(int h=2;h<=n;h++)//这一队列后面的整体往前移一位 
             if(w[d][h]>=1)
             {    int temp=w[d][h];
                 w[d][h]=w[d][h-1];
                 w[d][h-1]=temp;
             }
             printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",xuhao,e,t,z,s[e],t+z); 
             t=t+z;//由于该调度过程时间片没有用完,所以序号不加1; 
             continue;
          } 
    }
    float sum1,sum2=0;
    printf("进程pn\t   完成时刻\t   周转时间\t   带权周转时间\n");
    for(int k=1;k<=n;k++)
    {    int g=end[k]-a[k];//周转时间
        float h=float(g/float(y[k]));//带权周转时间 
        printf("%d\t\t%d\t\t%d\t\t%f\n",k,end[k],g,h);
        sum1+=g;
        sum2+=h;
    }
    cout<<"平均周转时间 : "<<float(sum1/n)<<endl<<"平均带权周转时间 : "<<float(sum2/n);
 }

非抢占式多级反馈队列调度算法 C++实现相关推荐

  1. 时间片轮转(RR)、优先级调度算法以及多级反馈队列调度算法

    一.调度算法 (一)时间片轮转(RR, Round-Robin) 例题:各进程到达就绪队列的时间.需要的运行时间如下表所示.使用时间片轮转调度算法,分析时间片大小分别是2.5时的进程运行情况. 常用于 ...

  2. java多级反馈队列进程调度,多级队列反馈调度算法 请教多级反馈队列调度算法...

    请教多级反馈队列调度算法???????????? 在某一操作系统中对进程调度采用多级反馈队列调度算法.现设定采用三级分数给小编了,小编来 0时刻A到达,进入I队列,执行2个时间段后,转向队列II,再执 ...

  3. 【计算机操作系统】用java模拟非抢占式(先来先到、短作业、高响应比),时间片轮转调度算法

    . 首先,我来介绍一下该程序大致内容 程序使用了ArrayList链表来模拟各进程队列,并且结果会显示出每个时刻的进程的运行信息.最后的所有进程的执行结果和进程的执行顺序. ps:各个模拟程序是相互独 ...

  4. C#进程调度的模拟实现:模拟先来先服务调度算法、短作业优先调度算法和优先级调度算法(考虑非抢占式和抢占式),进行算法评价,输出调度结果和算法评价指标。

    没什么水平,希望能帮到你 环境:visual studio 2019 附带工程资源:C#进程调度的模拟实现附带资源-C#文档类资源-CSDN下载 先来先服务的调度算法:是一种非抢占式的算法,先来先服务 ...

  5. 非抢占式优先算法例题_非抢占式高优先级调度算法

    v1.0 可编辑可修改 1 /* 非抢占式高优先级调度算法(优先数越大级别越高) 算法思想: 在按进程达到时间由小到大的顺序输入进程信息后, 先对其优先数进行排列, 将 最先到达的进程的到达时间设为开 ...

  6. 一、操作系统——处理机(作业)调度算法:先来先服务算法FCFS、最短作业优先算法SJF(非抢占式)、 最短剩余时间优先算法SRTN(抢占式)、最高响应比优先算法HRRN

    各种调度算法的学习思路: 调度算法的评价指标: 一.先来先服务算法(FCFS):First Come First Serve 二.最短作业优先算法(SJF非抢占式):Shortest Job Firs ...

  7. 非抢占式优先级调度算法_华为鸿蒙操作系统内核真面目之抢占式和非抢占式内核...

    华为鸿蒙操作系统内核真面目之抢占式和非抢占式内核 众所周知华为鸿蒙操作系统内核是Linux内核.而Linux内核即是抢占式内核也是非抢占式内核.设置软件优先级在优先级在0-99之间是抢占式优先级.设置 ...

  8. 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)

    文章目录 0.思维导图 1.时间片轮转---RR 2.优先级调度算法 3.多级反馈队列调度算法 4.三种算法的对比总结 0.思维导图 1.时间片轮转-RR Round-Robin 时间片为2举例 以时 ...

  9. 【学习笔记】第二章——时间片轮转RR、优先级调度、多级反馈队列调度算法

    文章目录 一. 时间片轮转 二. 优先级调度 三. 多级反馈队列调度算法 四. 总结 一. 时间片轮转 公平,轮流给进程提供时间片 只用于进程调度(只有进程才能被分配时间片) 抢占式,由时钟装置发出时 ...

最新文章

  1. 加速数据分析,这12种高效Numpy和Pandas函数为你保驾护航
  2. 个人计算机技术分享,一个计算机类本科毕业设计分享
  3. 设计模式读书笔记-----代理模式
  4. 分享30个最佳 jQuery Lightbox 效果插件
  5. 为什么要用MyBatis-Spring JDBC
  6. 使用 Node.js Express 的最佳实践
  7. (1-e^(-j5w))/(1-e^(-jw))=e^(-j2w)*sin(5w/2)/sin(w/2)的证明过程
  8. 腾讯状告前工程师开发游戏抄袭《王者荣耀》,赔偿 1940 万元!
  9. python经典程序实例-你不知道的Python语言的经典五大案例
  10. Linux完美学习笔记
  11. 因果推断-Uplift Model:Meta Learning
  12. 基于遗传算法的simulink/PID参数整定(s函数)
  13. 新浪云sae springboot项目部署
  14. @Value读取properties中文乱码解决方案
  15. 在cmd运行java_用cmd运行java时的问题
  16. 计算机英语性考任务答案,2010秋英语(1)形考答案
  17. Android电源管理介绍
  18. 对不起!我来晚了!——《Android群英传》出版祭
  19. Ubuntu 14.04 更换源(官方源——阿里源)
  20. 使用tdd构建golang Web 应用(4)

热门文章

  1. 【1419. 数青蛙】
  2. 英特尔 CPU 惊天漏洞事件完全详解
  3. OpenCV中的图像处理3.9(六)轮廓线特征与属性
  4. C语言 二叉树的相关操作
  5. Java开发的模拟双色球抽奖程序 功能非常齐全 完整源码
  6. sqlserver用户登录失败
  7. 贾志刚-OpenCV下的numpy数组操作
  8. Android 蓝牙遥控器调试记录
  9. [一种声音]胡适致毕业生:在不健全的中国,如何不堕落
  10. OpenSees 源码编译过程