zoukankan      html  css  js  c++  java
  • 若干简单的进程和作业调度的C++模拟程序

    进程调度(时间片轮转,动态优先级,链表形式): 

    #include<cstdio>
    #include<cstdlib>
    
    struct PCB
    {
        char name[10];
        char state; //状态
        int super; //优先级
        int ntime; //预计运行时间
        int rtime; //实际运行时间
        PCB *link;
    }*ready=NULL, *p;
    
    void disp(PCB *pr) /*建立进程显示函数,用于显示当前进程 */
    {
        printf("
     qname 	 state 	 super 	 ntime 	 rtime 
    ");
        printf("|%s 	 ",pr->name);
        printf("|%c 	 ",pr->state);
        printf("|%d 	 ",pr->super);
        printf("|%d 	 ",pr->ntime);
        printf("|%d 	 ",pr->rtime);
        printf("
    ");
    }
    
    void check() /* 建立进程查看函数 */
    {
        printf("
     ******** 当前正在运行的进程是:%s",p->name); /* 显示当前运行进程 */
        disp(p);
    
        printf("
     ******** 当前就绪队列状态为:
    "); /* 显示就绪队列状态 */
        PCB *pr=ready;
        while(pr!=NULL) disp(pr), pr=pr->link;
    }
    
    void sort() /* 建立对进程进行优先级排列函数 */
    {
        if(ready==NULL || (p->super)>(ready->super)) /* 优先级最大者,插入队首 */
        {
            p->link=ready;
            ready=p;
        }
        else /* 进程比较优先级,插入适当的位置中 */
        {
            PCB *first=ready, *second=first->link;
            while(second!=NULL)
            {
                if((p->super)>(second->super)) /* 若插入进程比当前进程优先数大,插入到当前进程前面 */
                {
                    first->link=p;
                    p->link=second;
                    return;
                }
    
                first=first->link;
                second=second->link;
            }
            first->link=p;
        }
    }
    
    void input() /* 建立进程控制块函数 */
    {
        system("cls");
    
        printf("
     请输入进程数目?");
        int num; scanf("%d",&num);
    
        for(int i=0;i<num;i++)
        {
            printf("
     进程号 No.%d:
    ",i);
            p=(PCB *)malloc(sizeof(PCB));
    
            printf("
     输入进程名:");
            scanf("%s",p->name);
    
            printf("
     输入进程优先数:");
            scanf("%d",&(p->super));
    
            printf("
     输入进程运行时间:");
            scanf("%d",&(p->ntime));
    
            printf("
    ");
    
            p->rtime=0;
            p->state='w';
            p->link=NULL;
    
            sort(); /* 调用 sort 函数 */
        }
    
        system("cls");
        printf("
     ******** 进程创建如下:
    ");
        PCB *pr=ready;
        while(pr!=NULL) disp(pr), pr=pr->link;
    }
    
    inline void destroy() /*建立进程撤消函数(进程运行结束,撤消进程) */
    {
        printf("
     进程 [%s] 已完成.
    ",p->name), free(p);
    }
    
    inline void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态) */
    {
        (p->rtime)++;
        if(p->rtime==p->ntime)
            destroy(); /* 调用 destroy 函数 */
        else
            --(p->super), p->state='w', sort();
    }
    
    int main() /*主函数*/
    {
        input();
    
        int h=0;
        while(ready!=NULL)
        {
            getchar();
            printf("
     The execute number:%d 
    ",++h);
    
            p=ready;
            ready=p->link;
            p->link=NULL;
            p->state='r';
    
            check();
            running();
    
            printf("
     按任意键继续......"), getchar();
        }
    
        printf("
    
     进程已经全部完成.
    ");
        getchar();
    
        return 0;
    }
    
    /*
    3
    A
    3
    5
    B
    2
    3
    C
    1
    4
    */

    作业调度(FCFS调度):

    #include<bits/stdc++.h>
    using namespace std;
    
    int cur_time;
    int limit;
    double turnover_time_sum, weighted_turnover_time_sum;
    
    struct JCB
    {
        int index; //作业序号
        string name; //作业名称
        string state; //状态
        int estimate_time; //预计运行时间
        int arrive_time; //到达时间
        int running_time; //实际运行时间
        int end_time; //结束时间
        inline int turnover_time()const //周转时间
        {
            return cur_time-arrive_time;
        }
        inline double weighted_turnover_time()const
        {
            return turnover_time()*1.0/running_time;
        }
        inline int waiting_time()const //等待时间
        {
            return turnover_time()-running_time;
        }
    
        void print()const
        {
            printf("作业 %d : 	",index);
            cout<<"|名称: "<<name<<" 	";
            cout<<"|状态: "<<state<<" 	";
            printf("|到达: %d 	",arrive_time);
            printf("|预计运行: %d 	",estimate_time);
            printf("|已运行: %d 	",running_time);
            printf("|已等待: %d 	",waiting_time());
            if(state=="destroy")
            {
                printf("|周转时间: %d 	",turnover_time());
                printf("|带权周转: %.2f",weighted_turnover_time());
            }
            printf("
    ");
        }
    };
    bool cmp(const JCB &a,const JCB &b)
    {
        return a.arrive_time<b.arrive_time;
    }
    
    vector<JCB> memory; //内存
    queue<JCB> fifo; //FIFO队列
    vector<JCB> destroy; //待销毁
    
    JCB createJob(int index) //创建
    {
        JCB res;
    
        printf("
    
    作业序号: %d
    ",res.index=index);
        res.state="reserve";
    
        printf("请输入作业名称:
    ");
        cin>>res.name;
    
        printf("请输入预计运行时间:
    ");
        cin>>res.estimate_time;
    
        printf("请输入到达时间:
    ");
        cin>>res.arrive_time;
    
        res.running_time=0;
    
        return res;
    }
    
    void printJobs() //输出各个作业情况
    {
        printf("
    ************************************************************
    ");
        printf("目前时间: %d
    ",cur_time);
    
        printf("
    内存中存在 %d 个作业:
    ",memory.size());
        for(auto job:memory) job.print();
    
        queue<JCB> tmp=fifo;
        printf("
    后备队列中存在 %d 个作业:
    ",tmp.size());
        while(tmp.size()) tmp.front().print(), tmp.pop();
    
        printf("
    待销毁 %d 个作业:
    ",destroy.size());
        for(auto job:destroy) job.print();
    
        cout<<endl<<endl<<endl<<endl;
    }
    
    void runJobs() //运行内存中的作业
    {
        for(unsigned int i=0;i<memory.size();i++)
        {
            memory[i].running_time++;
            if(memory[i].running_time==memory[i].estimate_time)
            {
                memory[i].state="destroy";
                memory[i].end_time=cur_time;
                destroy.push_back(memory[i]);
                memory.erase(memory.begin()+i);
                i--;
            }
        }
    }
    
    void destroyJobs() //销毁待销毁的作业
    {
        for(unsigned int i=0;i<destroy.size();i++)
        {
            turnover_time_sum+=destroy[i].turnover_time();
            weighted_turnover_time_sum+=destroy[i].weighted_turnover_time();
        }
        destroy.clear();
    }
    
    
    int main()
    {
        printf("请输入内存允许的最多作业数目:
    ");
        cin>>limit;
    
        printf("请输入作业总数目:
    ");
        int num; cin>>num;
    
        vector<JCB> tmp;
        for(int i=0;i<num;i++) tmp.push_back(createJob(i));
        sort(tmp.begin(),tmp.end(),cmp);
    
        cur_time=0;
        turnover_time_sum=weighted_turnover_time_sum=0.0;
        while(tmp.size()>0 || fifo.size()>0 || memory.size()>0)
        {
            while(memory.size()<limit && fifo.size()>0)
            {
                JCB tmp=fifo.front();
                fifo.pop();
                tmp.state="running";
                memory.push_back(tmp);
            }
    
            for(unsigned int i=0;i<tmp.size();i++)
            {
                if(tmp[i].arrive_time==cur_time)
                {
                    fifo.push(tmp[i]);
                    tmp.erase(tmp.begin()+i);
                    i--;
                }
            }
    
            runJobs();
    
            printJobs();
    
            destroyJobs();
    
            cur_time++;
        }
    
        printf("
    
    该组作业平均周转时间 %.2f, 平均带权周转时间 %.2f.
    ",turnover_time_sum/num,weighted_turnover_time_sum/num);
    }
    
    /*
    2
    7
    YJC
    5
    3
    HBG
    3
    1
    WYY
    10
    5
    QQQ
    2
    7
    ZVD
    8
    1
    WCY
    10
    10
    YJLGXC
    7
    5
    */

    作业调度(SJF调度):

    #include<bits/stdc++.h>
    using namespace std;
    
    int cur_time;
    int limit;
    double turnover_time_sum, weighted_turnover_time_sum;
    
    struct JCB
    {
        int index; //作业序号
        string name; //作业名称
        string state; //状态
        int estimate_time; //预计运行时间
        int arrive_time; //到达时间
        int running_time; //实际运行时间
        int end_time; //结束时间
        inline int turnover_time()const //周转时间
        {
            return cur_time-arrive_time;
        }
        inline double weighted_turnover_time()const
        {
            return turnover_time()*1.0/running_time;
        }
        inline int waiting_time()const //等待时间
        {
            return turnover_time()-running_time;
        }
    
        void print()const
        {
            printf("作业 %d : 	",index);
            cout<<"|名称: "<<name<<" 	";
            cout<<"|状态: "<<state<<" 	";
            printf("|到达: %d 	",arrive_time);
            printf("|预计运行: %d 	",estimate_time);
            printf("|已运行: %d 	",running_time);
            printf("|已等待: %d 	",waiting_time());
            if(state=="destroy")
            {
                printf("|周转时间: %d 	",turnover_time());
                printf("|带权周转: %.2f",weighted_turnover_time());
            }
            printf("
    ");
        }
    
        bool operator<(const JCB &o)const
        {
            return o.estimate_time<estimate_time;
        }
    };
    bool cmp(const JCB &a,const JCB &b)
    {
        return a.arrive_time<b.arrive_time;
    }
    
    vector<JCB> memory; //内存
    priority_queue<JCB> heap; //优先队列
    vector<JCB> destroy; //待销毁
    
    JCB createJob(int index) //创建
    {
        JCB res;
    
        printf("
    
    作业序号: %d
    ",res.index=index);
        res.state="reserve";
    
        printf("请输入作业名称:
    ");
        cin>>res.name;
    
        printf("请输入预计运行时间:
    ");
        cin>>res.estimate_time;
    
        printf("请输入到达时间:
    ");
        cin>>res.arrive_time;
    
        res.running_time=0;
    
        return res;
    }
    
    void printJobs() //输出各个作业情况
    {
        printf("
    ************************************************************
    ");
        printf("目前时间: %d
    ",cur_time);
    
        printf("
    内存中存在 %d 个作业:
    ",memory.size());
        for(auto job:memory) job.print();
    
        priority_queue<JCB> tmp=heap;
        printf("
    后备队列中存在 %d 个作业:
    ",tmp.size());
        while(tmp.size()) tmp.top().print(), tmp.pop();
    
        printf("
    待销毁 %d 个作业:
    ",destroy.size());
        for(auto job:destroy) job.print();
    
        cout<<endl<<endl<<endl<<endl;
    }
    
    void runJobs() //运行内存中的作业
    {
        for(unsigned int i=0;i<memory.size();i++)
        {
            memory[i].running_time++;
            if(memory[i].running_time==memory[i].estimate_time)
            {
                memory[i].state="destroy";
                memory[i].end_time=cur_time;
                destroy.push_back(memory[i]);
                memory.erase(memory.begin()+i);
                i--;
            }
        }
    }
    
    void destroyJobs() //销毁待销毁的作业
    {
        for(unsigned int i=0;i<destroy.size();i++)
        {
            turnover_time_sum+=destroy[i].turnover_time();
            weighted_turnover_time_sum+=destroy[i].weighted_turnover_time();
        }
        destroy.clear();
    }
    
    
    int main()
    {
        printf("请输入内存允许的最多作业数目:
    ");
        cin>>limit;
    
        printf("请输入作业总数目:
    ");
        int num; cin>>num;
    
        vector<JCB> tmp;
        for(int i=0;i<num;i++) tmp.push_back(createJob(i));
        sort(tmp.begin(),tmp.end(),cmp);
    
        cur_time=0;
        turnover_time_sum=weighted_turnover_time_sum=0.0;
        while(tmp.size()>0 || heap.size()>0 || memory.size()>0)
        {
            //将若干作业调度运行
            while(memory.size()<limit && heap.size()>0)
            {
                JCB tmp=heap.top(); heap.pop();
                tmp.state="running";
                memory.push_back(tmp);
            }
    
            //当前时间点到达的作业进入后备队列
            for(unsigned int i=0;i<tmp.size();i++)
            {
                if(tmp[i].arrive_time==cur_time)
                {
                    heap.push(tmp[i]);
                    tmp.erase(tmp.begin()+i);
                    i--;
                }
            }
    
            runJobs();
    
            printJobs();
    
            destroyJobs();
    
            cur_time++;
        }
    
        printf("
    
    该组作业平均周转时间 %.2f, 平均带权周转时间 %.2f.
    ",turnover_time_sum/num,weighted_turnover_time_sum/num);
    }
    
    /*
    2
    7
    YJC
    5
    3
    HBG
    3
    1
    WYY
    10
    5
    QQQ
    2
    7
    ZVD
    8
    1
    WCY
    10
    10
    YJLGXC
    7
    5
    */

    作业调度(HRRN调度):

    #include<bits/stdc++.h>
    using namespace std;
    
    int cur_time;
    int limit;
    double turnover_time_sum, weighted_turnover_time_sum;
    
    struct JCB
    {
        int index; //作业序号
        string name; //作业名称
        string state; //状态
        int estimate_time; //预计运行时间
        int arrive_time; //到达时间
        int running_time; //实际运行时间
        int end_time; //结束时间
        inline int turnover_time()const //周转时间
        {
            return cur_time-arrive_time;
        }
        inline double weighted_turnover_time()const
        {
            return turnover_time()*1.0/running_time;
        }
        inline int waiting_time()const //等待时间
        {
            return turnover_time()-running_time;
        }
        inline double response_ratio()const //响应比
        {
            return (waiting_time()+estimate_time)*1.0/estimate_time;
        }
    
        void print()const
        {
            printf("作业 %d : 	",index);
            cout<<"|名称: "<<name<<" 	";
            cout<<"|状态: "<<state<<" 	";
            printf("|到达: %d 	",arrive_time);
            printf("|预计运行: %d 	",estimate_time);
            printf("|已运行: %d 	",running_time);
            printf("|已等待: %d 	",waiting_time());
            if(state=="reserve")
            {
                printf("|响应比: %.2f",response_ratio());
            }
            if(state=="destroy")
            {
                printf("|周转时间: %d 	",turnover_time());
                printf("|带权周转: %.2f",weighted_turnover_time());
            }
            printf("
    ");
        }
        bool operator>(const JCB &o)const
        {
            return response_ratio()>o.response_ratio();
        }
    };
    bool cmp(const JCB &a,const JCB &b)
    {
        return a.arrive_time<b.arrive_time;
    }
    
    vector<JCB> memory; //内存
    vector<JCB> rq; //后备队列
    vector<JCB> destroy; //待销毁
    
    JCB createJob(int index) //创建
    {
        JCB res;
    
        printf("
    
    作业序号: %d
    ",res.index=index);
        res.state="reserve";
    
        printf("请输入作业名称:
    ");
        cin>>res.name;
    
        printf("请输入预计运行时间:
    ");
        cin>>res.estimate_time;
    
        printf("请输入到达时间:
    ");
        cin>>res.arrive_time;
    
        res.running_time=0;
    
        return res;
    }
    
    void printJobs() //输出各个作业情况
    {
        printf("
    ************************************************************
    ");
        printf("目前时间: %d
    ",cur_time);
    
        printf("
    内存中存在 %d 个作业:
    ",memory.size());
        for(auto job:memory) job.print();
    
        printf("
    后备队列中存在 %d 个作业:
    ",rq.size());
        for(auto job:rq) job.print();
    
        printf("
    待销毁 %d 个作业:
    ",destroy.size());
        for(auto job:destroy) job.print();
    
        cout<<endl<<endl<<endl<<endl;
    }
    
    void runJobs() //运行内存中的作业
    {
        for(unsigned int i=0;i<memory.size();i++)
        {
            memory[i].running_time++;
            if(memory[i].running_time==memory[i].estimate_time)
            {
                memory[i].state="destroy";
                memory[i].end_time=cur_time;
                destroy.push_back(memory[i]);
                memory.erase(memory.begin()+i);
                i--;
            }
        }
    }
    
    JCB findJobs() //在后备队列查找作业
    {
        unsigned int idx=0;
        for(unsigned int i=1;i<rq.size();i++)
        {
            if(rq[i]>rq[idx]) idx=i;
        }
        printf("调度该作业进入内存:
    ");
        rq[idx].print();
        JCB res=rq[idx];
        res.state="running";
        rq.erase(rq.begin()+idx);
        return res;
    }
    
    void destroyJobs() //销毁待销毁的作业
    {
        for(unsigned int i=0;i<destroy.size();i++)
        {
            turnover_time_sum+=destroy[i].turnover_time();
            weighted_turnover_time_sum+=destroy[i].weighted_turnover_time();
        }
        destroy.clear();
    }
    
    
    int main()
    {
        printf("请输入内存允许的最多作业数目:
    ");
        cin>>limit;
    
        printf("请输入作业总数目:
    ");
        int num; cin>>num;
    
        vector<JCB> tmp;
        for(int i=0;i<num;i++) tmp.push_back(createJob(i));
        sort(tmp.begin(),tmp.end(),cmp);
    
        cur_time=0;
        turnover_time_sum=weighted_turnover_time_sum=0.0;
        while(tmp.size()>0 || rq.size()>0 || memory.size()>0)
        {
            //将若干作业调度运行
            while(memory.size()<limit && rq.size()>0)
                memory.push_back(findJobs());
    
            //当前时间点到达的作业进入后备队列
            for(unsigned int i=0;i<tmp.size();i++)
            {
                if(tmp[i].arrive_time==cur_time)
                {
                    rq.push_back(tmp[i]);
                    tmp.erase(tmp.begin()+i);
                    i--;
                }
            }
    
            runJobs();
    
            printJobs();
    
            destroyJobs();
    
            cur_time++;
        }
    
        printf("
    
    该组作业平均周转时间 %.2f, 平均带权周转时间 %.2f.
    ",turnover_time_sum/num,weighted_turnover_time_sum/num);
    }
    
    /*
    2
    7
    YJC
    5
    3
    HBG
    3
    1
    WYY
    10
    5
    QQQ
    2
    7
    ZVD
    8
    1
    WCY
    10
    10
    YJLGXC
    7
    5
    */
  • 相关阅读:
    艾氏筛法资料
    CF Soldier and Cards (模拟)
    CF Soldier and Badges (贪心)
    POJ 1308 Is It A Tree? (并查集)
    HDU 1272 小希的迷宫 (并查集)
    HDU 1213 How Many Tables (并查集)
    POJ 1611 The Suspects (并查集)
    POJ 2236 Wireless Network (并查集)
    Iptables-linux服务器做路由转发
    asdf
  • 原文地址:https://www.cnblogs.com/dilthey/p/10804896.html
Copyright © 2011-2022 走看看