作業(yè)調(diào)度

實現(xiàn)作業(yè)調(diào)度的三種典型算法:先來先服務(wù)枯芬;短作業(yè)優(yōu)先论笔;高響應(yīng)比優(yōu)先,程序會給出算法的平均周轉(zhuǎn)時間平均帶權(quán)周轉(zhuǎn)時間千所。
實現(xiàn)算法的大致過程如下:

主要算法流程圖

代碼如下:

#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<<"輸入作業(yè)數(shù)目:";
    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<<"作業(yè)信息(作業(yè)名狂魔、到達時間、服務(wù)時間):"<<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<<"作業(yè)名\t到達時間\t開始時間\t服務(wù)時間\t結(jié)束時間\t周轉(zhuǎn)時間\t帶權(quán)周轉(zhuǎn)時間\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<<"平均周轉(zhuǎn)時間="<<avgturnTime<<endl;
    cout<<"平均帶權(quán)周轉(zhuǎn)時間="<<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<<"--先來先服務(wù)算法--";
    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<<"--短作業(yè)優(yōu)先算法--";
    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<<"--高響應(yīng)比優(yōu)先算法--";
    output(p,n);
}

運行的結(jié)果
輸入作業(yè)數(shù)目:6
請輸入第1作業(yè)信息(作業(yè)名淫痰、到達時間最楷、服務(wù)時間):
A 0 6
請輸入第2作業(yè)信息(作業(yè)名、到達時間待错、服務(wù)時間):
B 2 50
請輸入第3作業(yè)信息(作業(yè)名籽孙、到達時間、服務(wù)時間):
C 5 20
請輸入第4作業(yè)信息(作業(yè)名火俄、到達時間犯建、服務(wù)時間):
D 5 10
請輸入第5作業(yè)信息(作業(yè)名、到達時間瓜客、服務(wù)時間):
E 12 40
請輸入第6作業(yè)信息(作業(yè)名适瓦、到達時間、服務(wù)時間):
F 15 8
--先來先服務(wù)算法--
作業(yè)名 到達時間 開始時間 服務(wù)時間 結(jié)束時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
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
平均周轉(zhuǎn)時間=74.1667
平均帶權(quán)周轉(zhuǎn)時間=5.2425

--短作業(yè)優(yōu)先算法--
作業(yè)名 到達時間 開始時間 服務(wù)時間 結(jié)束時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
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
平均周轉(zhuǎn)時間=44.8333
平均帶權(quán)周轉(zhuǎn)時間=1.6025

--高響應(yīng)比優(yōu)先算法--
作業(yè)名 到達時間 開始時間 服務(wù)時間 結(jié)束時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間
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
平均周轉(zhuǎn)時間=48.5
平均帶權(quán)周轉(zhuǎn)時間=2.0275

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谱仪,一起剝皮案震驚了整個濱河市玻熙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疯攒,老刑警劉巖嗦随,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敬尺,居然都是意外死亡枚尼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門砂吞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姑原,“玉大人,你說我怎么就攤上這事呜舒。” “怎么了笨奠?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵袭蝗,是天一觀的道長。 經(jīng)常有香客問我般婆,道長到腥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任蔚袍,我火速辦了婚禮乡范,結(jié)果婚禮上配名,老公的妹妹穿的比我還像新娘。我一直安慰自己晋辆,他們只是感情好渠脉,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瓶佳,像睡著了一般芋膘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霸饲,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天为朋,我揣著相機與錄音,去河邊找鬼厚脉。 笑死习寸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的傻工。 我是一名探鬼主播霞溪,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼精钮!你這毒婦竟也來了威鹿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤轨香,失蹤者是張志新(化名)和其女友劉穎忽你,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臂容,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡科雳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脓杉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糟秘。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖球散,靈堂內(nèi)的尸體忽然破棺而出尿赚,到底是詐尸還是另有隱情,我是刑警寧澤蕉堰,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布凌净,位于F島的核電站,受9級特大地震影響屋讶,放射性物質(zhì)發(fā)生泄漏冰寻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一皿渗、第九天 我趴在偏房一處隱蔽的房頂上張望斩芭。 院中可真熱鬧轻腺,春花似錦、人聲如沸划乖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迁筛。三九已至煤蚌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間细卧,已是汗流浹背尉桩。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贪庙,地道東北人蜘犁。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像止邮,于是被迫代替她去往敵國和親这橙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355