zoukankan      html  css  js  c++  java
  • 多道程序系统的作业调度模拟程序——先来先服务

    2、编写并调度一个多道程序系统的作业调度模拟程序。

      作业调度算法:采用基于先来先服务的调度算法。

      对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。

    本程序中,我设定CPU最大可运行资源数为10,时间片为0.5,如果输入的作业(单个)占用CPU时间大于10,程序终止,无法调度。

    测试样例:

    作业名    提交时间    CPU运行时间   IO时间

      1           5           2            1

      2           2           5            3

      3           2           4            2

    FCFS:

    按照提交时间排序:2,3,1

    leave time 的次行才是上一行完成的作业。

    由于微观上是轮转调度,从作业2开始,运行0.5后交给作业3,再运行0.5后交给作业1,由于作业1的CPU占用时间比较短,因此先运行结束,完成时间是开始时间,CPU服务时间和IO时间的总和。

    时间从2开始运行,每个作业使用CPU 0.5后交给下个作业,到作业1完成时,共需要轮转4次,每次相当于消耗1.5,这个作业不占用CPU的时间相当于2(整个开始时间)+ 4*1.5(占用CPU时间完成) = 8。

    ex:作业1 先完成,完成时间 2 + 4*1.5(4轮,每轮1.5) + 1(IO时间) = 9

                       周转时间 9 - 5 = 4

    作业3 完成 ,完成时间 2(整个开始时间) + 6(作业1完成) + 4*1(作业3剩余部分) + 2(IO时间) = 14

    作业2 完成 ,完成时间 2 + 6 + 4 + 2*0.5 + 3 = 16

    代码:

    #include <iostream>
    #include <cmath>
    #include <cstdlib>
    
    using namespace std;
    
    struct Box
    {
        string ID;                                       //作业号
        double begin_time;                               //提交时间
        double rtime;                                    //已经运行时间
        double turnaround_time;                          //周转时间
        double cpu_service_time;                         //占用CPU的时间
        double io_time;                                  //用于I/O的时间
        double finish_time;                              //完成时间
        double Wturnaround_time;                         //带权周转时间
        Box& operator = (const Box& p2)                 //重载 = 运算符,方便排序
        {
            this->begin_time = p2.begin_time;
            this->rtime = p2.rtime;
            this->finish_time = p2.finish_time;
            this->cpu_service_time = p2.cpu_service_time;
            this->io_time = p2.io_time;
            this->ID = p2.ID;
            this->turnaround_time = p2.turnaround_time;
            this->Wturnaround_time = p2.Wturnaround_time;
            return *this;
        }
    };
    
    typedef struct
    {
        Box data[100];
    
    } JCB;
    
    const double CPU = 10.0;
    const double index = 0.5;
    JCB jcb,jcb_1;
    int n,number;
    
    void init()                                                        //初始化作业块
    {
        cout<<"please input the number of the job:";
        cin>>n;
        number = n;
        for(int i = 0; i<n; i++)
        {
            cout<<"process ID:";
            cin>>jcb.data[i].ID;
            cout<<jcb.data[i].ID<<"'s begin time:";
            cin>>jcb.data[i].begin_time;
            cout<<jcb.data[i].ID<<"'s cpu_service time:";
            cin>>jcb.data[i].cpu_service_time;
            cout<<jcb.data[i].ID<<"'s I/O time:";
            cin>>jcb.data[i].io_time;
            jcb.data[i].rtime = 0;
        }
        for(int i = 0; i<n-1; i++)                                    //按照提交时间从前到后排序
        {
            for(int j = i+1; j<n; j++)
            {
                if(jcb.data[i].begin_time > jcb.data[j].begin_time)
                    swap(jcb.data[i],jcb.data[j]);
            }
        }
        for(int i = 0; i<n-1; i++)                        //提交时间相同,序号小的在前
        {
            for(int j = i+1; j<n; j++)
            {
                if(jcb.data[i].begin_time == jcb.data[j].begin_time && jcb.data[i].ID > jcb.data[j].ID)
                    swap(jcb.data[i],jcb.data[j]);
            }
        }
    }
    
    void FCFS()                                                //先来先服务
    {
        int j = 0;
        double running = CPU;
        double bt = jcb.data[0].begin_time;
        double gtt = 0;
        double gwtt = 0;
        double real_begin;
        double record = jcb.data[j].begin_time;
        int num = n-1;
        cout<<"ID     "<<"leave time  "<<"begin time  "<<"turnaround time  "<<"finish time  "<<"wighted turnaround time"<<endl;
        while(1)
        {
            if(jcb.data[j].cpu_service_time > CPU)
            {
                cout<<"over running range!!!"<<endl;
                exit(0);
            }
            jcb.data[j].rtime += index;
            record += index;
            if(running >= 0)
            {
                if (jcb.data[j].rtime >= jcb.data[j].cpu_service_time)
                {
                    real_begin = bt;
                    jcb.data[j].finish_time = record+ jcb.data[j].io_time;
                    jcb.data[j].turnaround_time = jcb.data[j].finish_time - jcb.data[j].begin_time;
                    jcb.data[j].Wturnaround_time = jcb.data[j].turnaround_time / jcb.data[j].rtime;
                    cout<<jcb.data[j].ID<<"         "<<real_begin<<"                "
                    <<jcb.data[j].begin_time<<"                  "<<jcb.data[j].turnaround_time
                    <<"              "<<jcb.data[j].finish_time<<"                 "
                    <<jcb.data[j].Wturnaround_time<<endl;
                    n--;
                    running -= jcb.data[j].cpu_service_time;
                    bt = record;
                    gtt += jcb.data[j].turnaround_time;
                    gwtt += jcb.data[j].Wturnaround_time;
                }
                else
                {
                    num++;
                    swap(jcb.data[num],jcb.data[j]);
                }
            }
            else
            {
                running += jcb.data[j].cpu_service_time;
                num++;
                swap(jcb.data[num],jcb.data[j]);
            }
            if(n == 0)
                break;
            j++;
        }
        cout<<" average of turnaround time:"<<gtt/number<<endl<<"average of wighted turnaround time:"<<gwtt/number<<endl;
    }
    
    
    int main()
    {
        init();
        FCFS();
        return 0;
    }


  • 相关阅读:
    详解Webpack-dev-server的proxy用法
    .sync修饰符
    [Vue]createElement参数
    ElementUi学习笔记
    A5000项目阅读笔记
    webpack学习-10天搞定webpack4
    bhuilder 采坑日记-大小写问题
    angularjs:$$animateJs is not a function 错误
    webpack4 Cannot find module '@babel/core'
    算法-图论-最短路径-Dijsktra算法
  • 原文地址:https://www.cnblogs.com/NikkiNikita/p/9450753.html
Copyright © 2011-2022 走看看