响应比最高优先调度

一、实验目的

作业调度算法是指依照某种原则或策略从后备作业队列中选取作业的方法。响应比最高者优先算法是通过计算输入井后备队列中每个作业的响应比大小,从中选择响应比最高的作业装入主存,这样既考虑了作业的等待时间,又考虑了作业的运行时间。本实验要求学生设计一个响应比最高者优先算法来模拟实现作业调度过程。

二、实验要求

假设本系统仍采用单道批处理系统,忽略设备工作时间和系统进行调度所花的时间。要求从键盘输入作业个数N,及每个作业的作业名、作业入井时间、估计运行时间。请编程输出采用响应比最高者优先算法得到的每个作业调度序号、作业名、作业入井时间、开始调度时间、运行时间、结束时间、周转时间, 以及所有作业的平均周转时间。

三、源代码

#include <iostream>
#include <cstdio>
const int N=10;
using namespace std;

typedef struct time{
    int hour;
    int minute;
}time;
//作业控制块
typedef struct jcb{
    string name;
    time intime;//入井时间
    int runtime;
    bool flag;//作业是否完成
}jcb;
jcb jobs[N];
//运行结果表单
typedef struct form{
    int seq;//序号
    jcb job;//作业
    time schetime;//调度时间
    time endtime;//结束时间
    int trtime;//周转时间
}form;
form forms[N];
int n;
//打印表单的结果
void print()
{
    int i;
    cout<<"序号\t作业名\t入井时间\t调度时间\t运行时间\t结束时间\t周转时间"<<endl;
    for(i=0;i<n;i++)
    {
        cout<<forms[i].seq<<"\t"<<forms[i].job.name<<"\t";
        printf("%d:%.*d",forms[i].job.intime.hour,2,forms[i].job.intime.minute);cout<<"\t\t";
        printf("%d:%.*d",forms[i].schetime.hour,2,forms[i].schetime.minute);cout<<"\t\t";
        cout<<forms[i].job.runtime<<"\t\t";
        printf("%d:%.*d",forms[i].endtime.hour,2,forms[i].endtime.minute);cout<<"\t\t";
        cout<<forms[i].trtime<<endl;
    }
}
//初始化表单
void init()
{
    int i;
    for(i=0;i<n;i++)
    {
        forms[i].job=jobs[i];
    }
}
//修改更新表单
void revise(int t,int sequ)
{
    forms[t].seq=sequ;//序号
    if(sequ==1)//调度时间
    {
        forms[t].schetime.hour=jobs[t].intime.hour;
        forms[t].schetime.minute=jobs[t].intime.minute;
    }
    else
    {
        int k;
        for(int i=0;i<n;i++)
        {
            if(forms[i].seq==sequ-1)
            {
                k=i;
            }
        }
        forms[t].schetime.hour=forms[k].endtime.hour;
        forms[t].schetime.minute=forms[k].endtime.minute;
    }
    int ltime;//结束时间
    ltime=forms[t].schetime.hour*60+forms[t].schetime.minute+forms[t].job.runtime;
    forms[t].endtime.hour=ltime/60;
    forms[t].endtime.minute=ltime%60;
    //周转时间
    forms[t].trtime=forms[t].endtime.hour*60+forms[t].endtime.minute-forms[t].job.intime.hour*60-forms[t].job.intime.minute;
}
//计算响应比,返回响应比最高
int Response(int it[],int k,int t)
{
    double res[10];
    int i,lt1,lt2;
    lt1=forms[t].endtime.hour*60+forms[t].endtime.minute;
    for(i=0;i<k;i++)//计算响应比
    {
        lt2=jobs[it[i]].intime.hour*60+jobs[it[i]].intime.minute;
        res[i]=(lt1-lt2+jobs[it[i]].runtime*1.0)/jobs[it[i]].runtime;
    }
    int temp=0;
    for(i=1;i<k;i++)//寻找最高响应比
    {
        if(res[temp]<res[i])
        {
            temp=i;
        }
    }
    return it[temp];
}
//寻找最先入井作业
int searc()
{
    int i,temp;
    int st[10];
    for(i=0;i<n;i++)//计算各作业入井时间先后
    {
        st[i]=jobs[i].intime.hour*60+jobs[i].intime.minute;
    }
    temp=0;
    for(i=1;i<n;i++)//寻找最先入井作业
    {
        if(st[temp]>st[i])
        {
            temp=i;
        }
    }
    return temp;
}
//寻找已入井还未完成的作业
int searcs(int t)
{
    int it[10];//存放已入井的作业
    int i,lt1,lt2,jb,k=0;
    lt2=forms[t].endtime.hour*60+forms[t].endtime.minute;
    for(i=0;i<n;i++)//找出已入井的作业
    {
        lt1=jobs[i].intime.hour*60+jobs[i].intime.minute;
        if(lt1<=lt2&&jobs[i].flag!=true)
        {
            it[k]=i;
            k++;
        }
    }
    //计算响应比
    jb=Response(it,k,t);
    return jb;
}
//最高响应比算法
void HRRF()
{
    int sequ,t;
    sequ=0;//运行的顺序
    //1.找出最先入井的作业,让其运行
    t=searc();
    sequ++;
    revise(t,sequ);
    jobs[t].flag=true;//作业已运行完成
    //2.找出后面入井的作业,计算响应比
    while(sequ<n)
    {
        t=searcs(t);
        sequ++;
        revise(t,sequ);
        jobs[t].flag=true;
    }
}
int main()
{
    int i;
    cout<<"请输入要运行的作业个数:";
    cin>>n;
    cout<<"作业名\t入井时间\t运行时间"<<endl;
    for(i=0;i<n;i++)
    {
        cin>>jobs[i].name;
        scanf("%d:%d",&jobs[i].intime.hour,&jobs[i].intime.minute);
        cin>>jobs[i].runtime;
    }
    init();
    HRRF();
    print();
    return 0;
}

四、运行结果

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值