作业调度

实现作业调度的三种典型算法:先来先服务;短作业优先;高响应比优先,程序会给出算法的平均周转时间平均带权周转时间
实现算法的大致过程如下:

主要算法流程图

代码如下:

#include<iostream>
using namespace std;
struct jobs {
    char name;
    double inTime;
    double runTime;
    double finishTime;
    double turnTime;
    double weight;
    double rratio;
};
double avgturnTime,avgweight;
void input(jobs *p,int n);
void output(jobs *p,int n);
void datap(jobs *p,int n);
void sort(jobs *p,int n);
void fcfs(jobs *p,int n);
void sjf(jobs *p,int n);
void hrf(jobs *p,int n);
int main() {
    int n;
    cout<<"输入作业数目:";
    cin>>n;
    jobs *a=new jobs[n];
    input(a,n);
    fcfs(a,n);
    cout<<"\n";
    sjf(a,n);
    cout<<"\n";
    hrf(a,n);
    delete a;
    return 0;
}
void input(jobs *p,int n) {
    for(int i=0; i<n; i++) {
        cout<<"请输入第"<<i+1<<"作业信息(作业名、到达时间、服务时间):"<<endl;
        cin>>p[i].name>>p[i].inTime>>p[i].runTime ;
    }
}
void datap(jobs *p,int n) {
    avgturnTime=avgweight=0;
    p[0].finishTime =p[0].inTime +p[0].runTime ;
    for(int i=1; i<n; i++) {
        p[i].finishTime=p[i-1].finishTime+p[i].runTime;
    }
    for(int j=0; j<n; j++) {
        p[j].turnTime =p[j].finishTime -p[j].inTime ;
        p[j].weight =p[j].turnTime /p[j].runTime ;
        avgturnTime+=p[j].turnTime/n;
        avgweight+=p[j].weight/n;
    }
}
void output(jobs *p,int n) {
    cout<<endl<<"作业名\t到达时间\t开始时间\t服务时间\t结束时间\t周转时间\t带权周转时间\n";
    double stime;
    for(int k=0; k<n; k++) {
        if (k==0) stime=0;
        else stime=p[k-1].finishTime;
        cout<<""<<p[k].name<<"\t"<<p[k].inTime<<"\t\t"<<stime<<"\t\t"<<p[k].runTime<<"\t\t"<<p[k].finishTime<<"\t\t"<<p[k].turnTime<<"\t\t"<<p[k].weight<<"\n";
    }
    cout<<"平均周转时间="<<avgturnTime<<endl;
    cout<<"平均带权周转时间="<<avgweight<<endl;
}
void sort(jobs *p,int n) {
    for(int i=n-1; i>=1; i--)
        for(int j=0; j<i; j++)
            if(p[j].inTime >p[j+1].inTime ) {
                jobs temp;
                temp=p[j];
                p[j]=p[j+1];
                p[j+1]=temp;
            }
}
void fcfs(jobs *p,int n) {
    sort(p,n);
    datap(p,n);
    cout<<"--先来先服务算法--";
    output(p,n);
}
void sjf(jobs *p,int n) {
    sort(p,n);
    for(int i=0; i<n-1; i++) {
        int k=0;
        if(i==0)
            p[i].finishTime =p[i].inTime +p[i].runTime ;
        else
            p[i].finishTime =p[i].runTime +p[i-1].finishTime ;
        for(int j=i+1; j<n; j++) {
            if(p[j].inTime<=p[i].finishTime )
                k++;
        }
        double minrunTime=p[i+1].runTime ;
        int mark=i+1;
        for(int m=i+1; m<i+k; m++) {
            if(p[m+1].runTime <minrunTime) {
                minrunTime=p[m+1].runTime ;
                mark=m+1;
            }
        }
        jobs temp;
        temp=p[i+1];
        p[i+1]=p[mark];
        p[mark]=temp;
    }
    datap(p,n);
    cout<<"--短作业优先算法--";
    output(p,n);
}
void hrf(jobs *p,int n) {
    sort(p,n);
    for(int i=0; i<n-1; i++) {
        int k=0;
        if(i==0)
            p[i].finishTime =p[i].inTime +p[i].runTime ;
        else
            p[i].finishTime =p[i].runTime +p[i-1].finishTime ;
        for(int j=i+1; j<n; j++) {
            if(p[j].inTime <=p[i].finishTime )
                k++;
        }
        double maxrratio=(p[i].finishTime -p[i+1].inTime )/p[i+1].runTime ;
        int mark=i+1;
        for(int m=i+1; m<i+k; m++) {
            if((p[i].finishTime -p[m+1].inTime)/p[m+1].runTime >=maxrratio) {
                maxrratio=(p[i].finishTime -p[m+1].inTime)/p[m+1].runTime;
                mark=m+1;
            }
        }
        jobs temp;
        temp=p[i+1];
        p[i+1]=p[mark];
        p[mark]=temp;
    }
    datap(p,n);
    cout<<"--高响应比优先算法--";
    output(p,n);
}

运行的结果
输入作业数目:6
请输入第1作业信息(作业名、到达时间、服务时间):
A 0 6
请输入第2作业信息(作业名、到达时间、服务时间):
B 2 50
请输入第3作业信息(作业名、到达时间、服务时间):
C 5 20
请输入第4作业信息(作业名、到达时间、服务时间):
D 5 10
请输入第5作业信息(作业名、到达时间、服务时间):
E 12 40
请输入第6作业信息(作业名、到达时间、服务时间):
F 15 8
--先来先服务算法--
作业名 到达时间 开始时间 服务时间 结束时间 周转时间 带权周转时间
A 0 0 6 6 6 1
B 2 6 50 56 54 1.08
C 5 56 20 76 71 3.55
D 5 76 10 86 81 8.1
E 12 86 40 126 114 2.85
F 15 126 8 134 119 14.875
平均周转时间=74.1667
平均带权周转时间=5.2425

--短作业优先算法--
作业名 到达时间 开始时间 服务时间 结束时间 周转时间 带权周转时间
A 0 0 6 6 6 1
D 5 6 10 16 11 1.1
F 15 16 8 24 9 1.125
C 5 24 20 44 39 1.95
E 12 44 40 84 72 1.8
B 2 84 50 134 132 2.64
平均周转时间=44.8333
平均带权周转时间=1.6025

--高响应比优先算法--
作业名 到达时间 开始时间 服务时间 结束时间 周转时间 带权周转时间
A 0 0 6 6 6 1
D 5 6 10 16 11 1.1
C 5 16 20 36 31 1.55
F 15 36 8 44 29 3.625
B 2 44 50 94 92 1.84
E 12 94 40 134 122 3.05
平均周转时间=48.5
平均带权周转时间=2.0275

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351