C++模拟处理机HRRN调度算法

版权声明:个人博客网址 https://29dch.github.io/ GitHub网址 https://github.com/29DCH,欢迎大家前来交流探讨和star+fork! 转载请注明出处! https://blog.csdn.net/CowBoySoBusy/article/details/84818919

本实验随机输入的进程个数、进程名称、进程提交到系统的时间、进程运行所需时间。通过模拟程序。显示以下信息:
1)处理机对进程的调度过程。
2)计算这N个进程的平均周转时间。
三、HRRN(最高响应比调度算法)原理
最高响应比调度:在每次调度作业时,先计算后备队中每个作业的响应比,然后挑选响应比高者投入运行。
响应比R定义:
R=(w+S)/S
(R:响应比,W=等待时间,S=运行时间)
响应比R= 周转时间 / 运行时间
=(运行时间 + 等待时间)/ 运行时间
= 1 +(等待时间 / 运行时间)

四、示例
如:输入
进程个数:5
进程名称 到达系统时间 所需服务时间
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2

显示运行结果:
进程名称 到达系统时间 所需服务时间 开始时间 结束时间
A 0 3 0 3
B 2 6 3 9
C 4 4 9 13
E 8 2 13 15
D 6 5 15 20
5个进程的平均周转时间:(3+7+9+7+14)/5=8

#include <bits/stdc++.h>
using namespace std;

struct Process
{
    char name;
    int start_time;
    int surves_time;
    int turnover_time;
    int end_time;
    double priority;
} P[1000];

bool cmp1(const Process &p1, const Process &p2)
{
    if(p1.start_time==p2.start_time)
        return p1.surves_time<p2.surves_time;
    return p1.start_time<p2.start_time;
}

bool cmp3(const Process &p1, const Process &p2)
{
    return (p1.priority > p2.priority) || (p1.priority==p2.priority && p1.start_time<p2.start_time);
}

void HRRN(Process *p, int n)
{
    int i, j, k, finish;
    double sum=0.0;
    finish = 0;
    j = 0;
    sort(p, p+n, cmp1);
    for(i = 0; i < n; i++)
    {
        while(j<n && p[j].start_time <= finish)
            j++;
        for(k = i; k < j; k++)
            p[k].priority = (finish-p[k].start_time+p[k].surves_time) / p[k].surves_time;
        sort(p+i, p+j, cmp3);

        if(p[i].start_time > finish)
            p[i].end_time = p[i].start_time + p[i].surves_time;
        else
            p[i].end_time = finish + p[i].surves_time;
        p[i].turnover_time = p[i].end_time - p[i].start_time;
        finish = p[i].end_time;
    }
    cout<<"进程名称\t"<<"到达系统时间\t"<<"所需服务时间\t"<<"开始时间\t"<<"结束时间\t"<<endl;
    for(int i=0; i<n; i++)
    {
        if(!i)
            cout<<p[i].name<<"\t\t"<<p[i].start_time<<"\t\t"<<p[i].surves_time<<"\t\t"<<p[i].start_time<<"\t\t"<<p[i].end_time<<endl;
        else
            cout<<p[i].name<<"\t\t"<<p[i].start_time<<"\t\t"<<p[i].surves_time<<"\t\t"<<p[i-1].end_time<<"\t\t"<<p[i].end_time<<endl;
        sum+=p[i].turnover_time;
    }
    cout<<"平均周转时间: "<<sum/n*1.0<<endl;
}

int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0; i<n; i++)
            cin>>P[i].name>>P[i].start_time>>P[i].surves_time;
        HRRN(P,n);
    }
    return 0;
}

效果图:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CowBoySoBusy/article/details/84818919