操作系统知识相关问题

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

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

代码如下

#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

t=0时,只有进程A到达,故运行进程A,直到t=3时结束
t=3时,只有经常B在等待,故运行经常B,直到t=6时结束
t=6时,有进程C和进程D再等待,进程C的响应比是((6-4)+4)/4=1.25,进程D的响应比是((6-6)+5)/5=1.0,所以进程C先运行直到t=6+4=10时结束
t=10时,有进程D和E在等待,进程C的响应比是((10-6)+5)/5=1.8,进程E的响应比是((10-8)+2)/2=2,所以进程E先运行直到t=10+2=12时结束
t=12时,只有进程D在等待,故运行进程D直到t=12+5=17时结束