Hermione233 2022-09-21 23:50 采纳率: 100%
浏览 85
已结题

操作系统知识相关问题

假设一个系统有5个进程,他们的到达时间和服务时间如下表所示,忽略I/O以及其他的开销时间,若按**高响应比优先调度算法**进行CPU调度,请给出各进程的完成时间、周转时间、带权周转时间、平均周转时间和平均带权周转时间。(采用非抢占式调度)

进程名 进入时间 计算时间(分)
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2

  • 写回答

2条回答 默认 最新

  • 来灵 2022-09-22 08:34
    关注

    代码如下

    #include<iostream>
    #include<Windows.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include <time.h>
    #define N 5
    using namespace std;
    
    struct Mystruct
    {
        float arrivetime;
        float runtime;
        float starttime;
        float waittime;
        float endtime;
        float turnaroundtime;
        float rightturnaroundtime;
    
    }Thread[N];
    
    void sort(struct Mystruct Thread[]) {//按进程到达时间排序
    
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N - 1; j++) {
                if (Thread[j].arrivetime > Thread[j + 1].arrivetime) {
                    float t1 = Thread[j + 1].arrivetime;
                    Thread[j + 1].arrivetime = Thread[j].arrivetime;
                    Thread[j].arrivetime = t1;
                    float t2 = Thread[j + 1].runtime;
                    Thread[j + 1].runtime = Thread[j].runtime;
                    Thread[j].runtime = t2;
                }
            }
        }
    }
    
    float JRR(float i, float j, float k) {//计算响应比
    
        float s = (i - j + k) / k;
        //cout << i << " " << j << " " << k << "响应比" << s << endl;
        return s;
    }
    
    void RRsort(int i) {//找出最小响应比进程的下标与下次要运行的进程交换次序,使处在就绪状态响应比最小的进程下次运行
        int next = 0;
        float min = 30;
        for (int j = i + 1; j < N; j++)
        {
            if (Thread[j].arrivetime <= Thread[i].endtime) {
                float RR;
                //            cout << Thread[i].endtime << endl;
                if (i != 4)
                    RR = JRR(Thread[i].endtime, Thread[j].arrivetime, Thread[j].runtime);
    
                if (RR < min)//找出最小响应比
                {
    
                    min = RR;
                    next = j;
    
                }
            }
        }
    
        Mystruct temp;
        temp = Thread[i + 1];
        Thread[i + 1] = Thread[next];
        Thread[next] = temp;
    }
    
    
    void HRRN(struct Mystruct Thread[])
    
    {
        int count = 0;
        float avewaittime = 0, aveturnaroundtime = 0, averightturnaroundtime = 0;
    
        cout << "==========================高响应比算法调度==========================" << endl;
    
        cout << "作业号" << "\t" << "提交时间" << "\t" << "运行时间" << "\t" << "开始时间" << "\t" << "等待时间" << "\t" << "完成时间" << "\t" << "周转时间" << "\t" << "带权周转时间" << endl;
        for (int i = 0; i < N; i++)
        {
    
    
            count++;
            if (count == 1)Thread[i].starttime = Thread[i].arrivetime; else Thread[i].starttime = Thread[i - 1].starttime + Thread[i - 1].runtime;
    
            if (Thread[i].starttime < Thread[i].arrivetime)
            {
                Thread[i].starttime = Thread[i].arrivetime;
            }
            Thread[i].endtime = Thread[i].starttime + Thread[i].runtime;
    
            RRsort(i);//找出处在等待的最小响应比的进程下次运行
    
    
            Thread[i].waittime = Thread[i].starttime - Thread[i].arrivetime;
            Thread[i].turnaroundtime = Thread[i].endtime - Thread[i].arrivetime;
            Thread[i].rightturnaroundtime = Thread[i].turnaroundtime / Thread[i].runtime;
            avewaittime += Thread[i].waittime; aveturnaroundtime += Thread[i].turnaroundtime; averightturnaroundtime += Thread[i].rightturnaroundtime;
    
            char index;
            if (0 == i)
                index = 'A';
            else if(1 == i)
                index = 'B';
            else if (2 == i)
                index = 'C';
            else if (3 == i)
                index = 'D';
            else if (4 == i)
                index = 'E';
            cout << index << "\t" << Thread[i].arrivetime << "\t\t" << Thread[i].runtime << "\t\t" << Thread[i].starttime << "\t\t" << Thread[i].waittime << "\t\t" << Thread[i].endtime << "\t\t" << Thread[i].turnaroundtime << "\t\t" << Thread[i].rightturnaroundtime << endl;
        }
    
        cout << "平均等待时间:" << avewaittime / N << "\t" << "平均周转时间:" << aveturnaroundtime / N << "\t" << "平均带权周转时间:" << averightturnaroundtime / N << endl;
    }
    
    int main() {
    
        srand((int)time(0));
        for (int i = 0; i < N; i++) {
    
            Thread[i].arrivetime = i*2;
            if(0 ==i)
                Thread[i].runtime = 3;
            else if (1 == i)
                Thread[i].runtime = 6;
            else if (2 == i)
                Thread[i].runtime = 4;
            else if (3 == i)
                Thread[i].runtime = 5;
            else if (4 == i)
                Thread[i].runtime = 2;
            else{}
        }
    
        HRRN(Thread);
    
        system("pause");
    
        return 0;
    }
    

    运行结果如截图

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月30日
  • 已采纳回答 9月22日
  • 创建了问题 9月21日

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测