国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

操作系統(tǒng)有關(guān)進(jìn)程調(diào)度算法(含先來先服務(wù),短作業(yè)優(yōu)先,優(yōu)先級調(diào)度算法和時(shí)間片輪轉(zhuǎn)調(diào)度算法)

這篇具有很好參考價(jià)值的文章主要介紹了操作系統(tǒng)有關(guān)進(jìn)程調(diào)度算法(含先來先服務(wù),短作業(yè)優(yōu)先,優(yōu)先級調(diào)度算法和時(shí)間片輪轉(zhuǎn)調(diào)度算法)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言:

本文采用的進(jìn)程調(diào)度算法有:先來先服務(wù),短作業(yè)優(yōu)先,優(yōu)先級調(diào)度算法和時(shí)間片輪轉(zhuǎn)調(diào)度算法。

針對這四種算法,我采用的是建立數(shù)組結(jié)構(gòu)體,如:

struct job {
    char name[10];      //作業(yè)的名字
    int starttime;      //作業(yè)到達(dá)系統(tǒng)時(shí)間
    int needtime;       //作業(yè)服務(wù)時(shí)間
    int runtime;        //作業(yè)周轉(zhuǎn)時(shí)間
    int endtime;        //作業(yè)結(jié)束時(shí)間
    double dqzz_time;    //帶權(quán)周轉(zhuǎn)時(shí)間
};

一,先來先服務(wù)算法:

1,算法思想:

先來先服務(wù)(FCFS)調(diào)度算法是一種最簡單的調(diào)度算法,該算法既可用于作業(yè)調(diào)度,也可用于進(jìn)程調(diào)度。采用FCFS算法,每次從后備隊(duì)列中選擇一個(gè)或多個(gè)最先進(jìn)入該隊(duì)列的作業(yè),將他們調(diào)入內(nèi)存,為他們分配資源,創(chuàng)建進(jìn)程,然后放入就緒隊(duì)列。在進(jìn)程調(diào)度中采用FCFS算法時(shí),則每次調(diào)度是從就緒隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程,為之分配處理機(jī),使之投入運(yùn)行。該進(jìn)程一直運(yùn)行到完成或發(fā)生某事件而阻塞后才放棄處理機(jī)。

2,算法實(shí)例:

首先,先對運(yùn)行函數(shù)進(jìn)行聲明:

void FCFS(struct job jobs[50], int n);//先來先服務(wù)算法

其中n為進(jìn)程個(gè)數(shù)。

其次,按照進(jìn)程到達(dá)時(shí)間進(jìn)行排序:

for (i = 0; i < n; i++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面 
    {
        for (j = i; j < n; j++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面 
        {
            if (jobs[j].starttime < jobs[i].starttime)
            {   //把到達(dá)時(shí)間早的賦值到t_time
                t_time = jobs[j].starttime;
                jobs[j].starttime = jobs[i].starttime;
                jobs[i].starttime = t_time;
                //把到達(dá)時(shí)間早的賦值到t_time
                t_time = jobs[j].needtime;
                jobs[j].needtime = jobs[i].needtime;
                jobs[i].needtime = t_time;
                strcpy(t_name, jobs[j].name);//這里用strcpy函數(shù)是由于name變量為字符串類型,不能用=賦值
                strcpy(jobs[j].name, jobs[i].name);
                strcpy(jobs[i].name, t_name);//利用t_name數(shù)組進(jìn)行交換排序
            }
        }
    }

二,短作業(yè)優(yōu)先算法

1,算法思想:

短作業(yè)優(yōu)先(SJF, Shortest Job First)又稱為“短進(jìn)程優(yōu)先”SPN(Shortest Process Next);是對FCFS算法的改進(jìn),其目標(biāo)是減少平均周轉(zhuǎn)時(shí)間。

短作業(yè)優(yōu)先調(diào)度算法基于這樣一種思想:

運(yùn)行時(shí)間短的優(yōu)先調(diào)度;

如果運(yùn)行時(shí)間相同則調(diào)度最先發(fā)起請求的進(jìn)程。

等待時(shí)間:一個(gè)進(jìn)程從發(fā)起請求到開始執(zhí)行的時(shí)間間隔。

現(xiàn)在有n個(gè)進(jìn)程請求cpu,每個(gè)進(jìn)程用一個(gè)二元組表示:(p,q),p代表該進(jìn)程發(fā)起請求的時(shí)間,p代表需要占用cpu的時(shí)間。

請計(jì)算n個(gè)進(jìn)程的平均等待時(shí)間。

2,算法實(shí)例:

首先,先對運(yùn)行函數(shù)進(jìn)行聲明:

void SJF(struct job jobs[50], int n);//短作業(yè)優(yōu)先算法

其中n為進(jìn)程個(gè)數(shù)。

其次,按照最短運(yùn)行時(shí)間排序:

for (i = 1; i < n; i++)
    {
        for (j = i; j < n; j++)
        {
            //按最短運(yùn)行時(shí)間排序
            //關(guān)于jobs[i - 1].endtime > jobs[j].starttime如果到達(dá)時(shí)間太遲于上一輪的結(jié)束時(shí)間,會(huì)造成浪費(fèi)時(shí)間資源用以等待
            if (jobs[i - 1].endtime > jobs[j].starttime && jobs[j].needtime < jobs[i].needtime)
            {
                t_time = jobs[i].starttime;
                jobs[i].starttime = jobs[j].starttime;
                jobs[j].starttime = t_time;
                //把短的賦值到臨時(shí)變量t_time中
                t_time = jobs[i].needtime;
                jobs[i].needtime = jobs[j].needtime;
                jobs[j].needtime = t_time;
                strcpy(t_name, jobs[i].name);   //將第二個(gè)參數(shù)的值復(fù)制給第一個(gè)參數(shù),返回第一個(gè)參數(shù)
                strcpy(jobs[i].name, jobs[j].name);
                strcpy(jobs[j].name, t_name);
            }                 //按最短運(yùn)行時(shí)間排序
        }
        if (jobs[i].starttime > jobs[i - 1].endtime)
        {       //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程已運(yùn)行完畢
            jobs[i].endtime = jobs[i].starttime + jobs[i].needtime;//結(jié)束時(shí)間=到達(dá)時(shí)間+服務(wù)時(shí)間
            jobs[i].runtime = jobs[i].needtime;//周轉(zhuǎn)時(shí)間=服務(wù)時(shí)間
        }
        else
        {
            jobs[i].endtime = jobs[i - 1].endtime + jobs[i].needtime;//結(jié)束時(shí)間=上一個(gè)的結(jié)束時(shí)間+服務(wù)時(shí)間
            jobs[i].runtime = jobs[i].endtime - jobs[i].starttime;//周轉(zhuǎn)時(shí)間=結(jié)束時(shí)間-到達(dá)時(shí)間
        }
        jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;
    }

三,優(yōu)先級調(diào)度算法

1,算法思想:

優(yōu)先級調(diào)度的含義

當(dāng)該算法用于作業(yè)調(diào)度時(shí),系統(tǒng)從后備作業(yè)隊(duì)列中選擇若干個(gè)優(yōu)先級最高的,且系統(tǒng)能滿足資源要求的作業(yè)裝入內(nèi)存運(yùn)行。

當(dāng)該算法用于進(jìn)程調(diào)度時(shí),將把處理機(jī)分配給就緒進(jìn)程隊(duì)列中優(yōu)先級最高的進(jìn)程。

調(diào)度算法的兩種方式

優(yōu)先級調(diào)度算法細(xì)分成如下兩種方式:

非搶占式優(yōu)先級算法

在這種調(diào)度方式下,系統(tǒng)一旦把處理機(jī)分配給就緒隊(duì)列中優(yōu)先級最高的進(jìn)程后,該進(jìn)程就能一直執(zhí)行下去,直至完成;或因等待某事件的發(fā)生使該進(jìn)程不得不放棄處理機(jī)時(shí),系統(tǒng)才能將處理機(jī)分配給另一個(gè)優(yōu)先級高的就緒進(jìn)程。

搶占式優(yōu)先級調(diào)度算法

在這種調(diào)度方式下,進(jìn)程調(diào)度程序把處理機(jī)分配給當(dāng)時(shí)優(yōu)先級最高的就緒進(jìn)程,使之執(zhí)行。一旦出現(xiàn)了另一個(gè)優(yōu)先級更高的就緒進(jìn)程時(shí),進(jìn)程調(diào)度程序就停止正在執(zhí)行的進(jìn)程,將處理機(jī)分配給新出現(xiàn)的優(yōu)先級最高的就緒進(jìn)程。

優(yōu)先級的類型

進(jìn)程的優(yōu)先級可采用靜態(tài)優(yōu)先級和動(dòng)態(tài)優(yōu)先級兩種,優(yōu)先級可由用戶自定或由系統(tǒng)確定。

2,算法實(shí)例:

首先,先對運(yùn)行函數(shù)進(jìn)行聲明:

void HRRN(struct job jobs[50],int n);//優(yōu)先調(diào)度算法

其中n為進(jìn)程個(gè)數(shù)。

其次,設(shè)計(jì)優(yōu)先級:

double hrrn[10];//動(dòng)態(tài)優(yōu)先級

然后,按照優(yōu)先級進(jìn)行比較并排序:

for (i = 1; i < n; i++) 
    {
        for (j = i; j < n; j++) 
        {
            //優(yōu)先級=(等待時(shí)間+要求服務(wù)時(shí)間)/ 要求服務(wù)時(shí)間
            hrrn[j] = static_cast<double>(jobs[i - 1].endtime - jobs[j].starttime + jobs[j].needtime) / jobs[j].needtime;
        }//這是此時(shí)第i個(gè)進(jìn)程結(jié)束后的所有進(jìn)程的優(yōu)先級
        for (int t = i + 1; t < n; t++) {
            if (hrrn[t] > hrrn[i]) {
                t_time = jobs[t].starttime;
                jobs[t].starttime = jobs[i].starttime;
                jobs[i].starttime = t_time;
                //把短的賦值到臨時(shí)變量t_time中
                t_time = jobs[t].needtime;
                jobs[t].needtime = jobs[i].needtime;
                jobs[i].needtime = t_time;
                strcpy(t_name, jobs[t].name);
                strcpy(jobs[t].name, jobs[i].name);
                strcpy(jobs[i].name, t_name);
            }//按優(yōu)先級進(jìn)行比較并排序
        }
        jobs[i].endtime = jobs[i - 1].endtime + jobs[i].needtime;//第i個(gè)進(jìn)程的結(jié)束時(shí)間=上一個(gè)的結(jié)束時(shí)間+服務(wù)時(shí)間
    }

四,時(shí)間片輪轉(zhuǎn)調(diào)度算法

1,算法思想:

時(shí)間片輪轉(zhuǎn)調(diào)度是一種最古老,最簡單,最公平且使用最廣的算法。每個(gè)進(jìn)程被分配一個(gè)時(shí)間段,稱作它的時(shí)間片,即該進(jìn)程允許運(yùn)行的時(shí)間。如果在時(shí)間片結(jié)束時(shí)進(jìn)程還在運(yùn)行,則CPU將被剝奪并分配給另一個(gè)進(jìn)程。如果進(jìn)程在時(shí)間片結(jié)束前阻塞或結(jié)束,則CPU當(dāng)即進(jìn)行切換。調(diào)度程序所要做的就是維護(hù)一張就緒進(jìn)程列表,當(dāng)進(jìn)程用完它的時(shí)間片后,它被移到隊(duì)列的末尾。

2,算法實(shí)例:

首先,先對運(yùn)行函數(shù)進(jìn)行聲明:

void RR(struct job jobs[50],int n);//時(shí)間片輪轉(zhuǎn)算法

其中n為進(jìn)程個(gè)數(shù)。

其次,以scanf函數(shù)從鍵盤得到一個(gè)時(shí)間片長度:

printf("請輸入時(shí)間片的大小:");
    scanf("%d",&t);

?這里由于我用以運(yùn)行結(jié)果顯示方便,因此直接用周轉(zhuǎn)時(shí)間和帶權(quán)周轉(zhuǎn)時(shí)間的結(jié)果表示:

for (i = 0; i < n; i++) {
        s += jobs[i].needtime;//s是用來確認(rèn)所有進(jìn)程全部結(jié)束
        f[i] = jobs[i].needtime;//f[i]用以存儲(chǔ)單個(gè)進(jìn)程剩余所需運(yùn)行時(shí)間
    }
    do {
        for (i = 0; i < n; i++) {
            if (f[i]) {         //若f[i] == 0,則說明本進(jìn)程的運(yùn)行已全部結(jié)束
                //如果本進(jìn)程剩余時(shí)間比時(shí)間片大,則總運(yùn)行時(shí)間加一個(gè)時(shí)間片,本進(jìn)程剩余運(yùn)行時(shí)間減一個(gè)時(shí)間片,并將s減一個(gè)時(shí)間片
                if (f[i] > t) { 
                    time += t;
                    f[i] -= t;
                    s -= t;
                }
                //如果本進(jìn)程剩余時(shí)間比時(shí)間片小,則總運(yùn)行時(shí)間加一個(gè)時(shí)間片,s減一個(gè)本進(jìn)程剩余運(yùn)行時(shí)間,并將本進(jìn)程剩余運(yùn)行時(shí)間歸零
                else {
                    time += t;
                    jobs[i].endtime = time;
                    s -= f[i];
                    f[i] = 0;
                }
            }
        }
    } while (s);
    for (i = 0; i < n; i++) {
        jobs[i].runtime = jobs[i].endtime - jobs[i].starttime;//周轉(zhuǎn)時(shí)間 = 結(jié)束時(shí)間 - 到達(dá)時(shí)間
        jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;//帶權(quán)周轉(zhuǎn)時(shí)間=周轉(zhuǎn)時(shí)間/服務(wù)時(shí)間
    }

其中time為總運(yùn)行時(shí)間。

五,對每個(gè)進(jìn)程的最終結(jié)果進(jìn)行輸出

聲明:

void print(struct job jobs[50], int n);

代碼如下:

void print(struct job jobs[50], int n)
{
    int i;
    double avertime;
    double dqzz_avertime;
    int sum_runtime = 0;
    double  sum_time = 0.00;
    printf("作業(yè)名  到達(dá)時(shí)間 運(yùn)行時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間\n");
    for (i = 0; i < n; i++)
    {
        printf("%s        %2d        %2d        %2d        %2d        %.2f\n", jobs[i].name, jobs[i].starttime, jobs[i].needtime, jobs[i].endtime, jobs[i].runtime, jobs[i].dqzz_time);
        sum_runtime = sum_runtime + jobs[i].runtime;
        sum_time = sum_time + jobs[i].dqzz_time;
    }
    avertime = sum_runtime * 1.0 / n;
    dqzz_avertime = sum_time * 1.000 / n;
    printf("平均周轉(zhuǎn)時(shí)間:%.2f \n", avertime);
    printf("平均帶權(quán)周轉(zhuǎn)時(shí)間:%.3f \n", dqzz_avertime);
    printf("\n");
}

六,運(yùn)行結(jié)果

1,先來先服務(wù)算法:

第1關(guān):先來先服務(wù)調(diào)度算法,visual studio,c語言,算法

2,短作業(yè)優(yōu)先算法:

第1關(guān):先來先服務(wù)調(diào)度算法,visual studio,c語言,算法?

3,優(yōu)先級調(diào)度算法:

第1關(guān):先來先服務(wù)調(diào)度算法,visual studio,c語言,算法?

4,時(shí)間片輪轉(zhuǎn)算法:

第1關(guān):先來先服務(wù)調(diào)度算法,visual studio,c語言,算法

七,總結(jié)

每個(gè)算法都有自己的優(yōu)缺點(diǎn),我個(gè)人的話,則更傾向于優(yōu)先級調(diào)度算法,既考慮到了長進(jìn)程的等待時(shí)間,也考慮到了短作業(yè)稍稍優(yōu)先的模式。

全部運(yùn)行代碼如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
struct job {
    char name[10];      //作業(yè)的名字
    int starttime;      //作業(yè)到達(dá)系統(tǒng)時(shí)間
    int needtime;       //作業(yè)服務(wù)時(shí)間
    int runtime;        //作業(yè)周轉(zhuǎn)時(shí)間
    int endtime;        //作業(yè)結(jié)束時(shí)間
    double dqzz_time;    //帶權(quán)周轉(zhuǎn)時(shí)間
};
void FCFS(struct job jobs[50], int n);//先來先服務(wù)算法
void SJF(struct job jobs[50], int n);//短作業(yè)優(yōu)先算法
void HRRN(struct job jobs[50],int n);//優(yōu)先調(diào)度算法
void RR(struct job jobs[50],int n);//時(shí)間片輪轉(zhuǎn)算法
void print(struct job jobs[50], int n);
int main() {
    struct job jobs[50];
    int n, i; //n個(gè)作業(yè)
    int flag;
    printf("請選擇調(diào)度算法,1:先來先服務(wù) 2:短作業(yè)優(yōu)先 3:優(yōu)先調(diào)度算法 4:時(shí)間輪轉(zhuǎn)調(diào)度算法");
    scanf("%d", &flag);
    printf("請輸入作業(yè)個(gè)數(shù):");
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        printf("請輸入第%d個(gè)作業(yè)的作業(yè)名:\n",i + 1);
        scanf("%s", jobs[i].name); //作業(yè)名
        printf("請輸入第%d個(gè)作業(yè)的到達(dá)時(shí)間:\n",i + 1);
        scanf("%d", &jobs[i].starttime);//到達(dá)時(shí)間
        printf("請輸入第%d個(gè)作業(yè)的服務(wù)時(shí)間:\n",i + 1);
        scanf("%d", &jobs[i].needtime);//運(yùn)行(服務(wù)時(shí)間)時(shí)間
    }
    printf("\n");
    switch (flag){
    case 1:
        FCFS(jobs, n);
        printf("先來先服務(wù)(FCFS)算法運(yùn)行結(jié)果:\n");
        print(jobs, n);
        break;
    case 2:
        SJF(jobs, n);
        printf("短作業(yè)優(yōu)先(SJF)算法運(yùn)行結(jié)果:\n");
        print(jobs, n);
        break;
    case 3:
        HRRN(jobs, n);
        printf("優(yōu)先調(diào)度算法(HRRN)算法運(yùn)行結(jié)果:\n");
        print(jobs, n);
        break;
    case 4:
        RR(jobs, n);
        printf("時(shí)間輪轉(zhuǎn)調(diào)度算法(RR)算法運(yùn)行結(jié)果:\n");
        print(jobs, n);
        break;
    }
}
void FCFS(struct job jobs[50], int n){
    int i = 0, j = 0;
    char t_name[10];//用于交換的臨時(shí)變量
    int t_time;//用于交換的臨時(shí)變量
    for (i = 0; i < n; i++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面 
    {
        for (j = i; j < n; j++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面 
        {
            if (jobs[j].starttime < jobs[i].starttime)
            {   //把到達(dá)時(shí)間早的賦值到t_time
                t_time = jobs[j].starttime;
                jobs[j].starttime = jobs[i].starttime;
                jobs[i].starttime = t_time;
                //把到達(dá)時(shí)間早的賦值到t_time
                t_time = jobs[j].needtime;
                jobs[j].needtime = jobs[i].needtime;
                jobs[i].needtime = t_time;
                strcpy(t_name, jobs[j].name);//這里用strcpy函數(shù)是由于name變量為字符串類型,不能用=賦值
                strcpy(jobs[j].name, jobs[i].name);
                strcpy(jobs[i].name, t_name);//利用t_name數(shù)組進(jìn)行交換排序
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        if (i == 0)
        {   //第一個(gè)進(jìn)程
            jobs[i].runtime = jobs[i].needtime;     //周轉(zhuǎn)時(shí)間=服務(wù)時(shí)間
            jobs[i].endtime = jobs[i].starttime + jobs[i].needtime;    //結(jié)束時(shí)間=到達(dá)時(shí)間+服務(wù)時(shí)間    
        }
        else if (jobs[i].starttime > jobs[i - 1].endtime)
        {   //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程已運(yùn)行完畢
            jobs[i].runtime = jobs[i].needtime;
            jobs[i].endtime = jobs[i].starttime + jobs[i].needtime;
        }
        else
        {   //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程未運(yùn)行完畢
            jobs[i].runtime = jobs[i].needtime + jobs[i - 1].endtime - jobs[i].starttime;
            //周轉(zhuǎn)時(shí)間 = 服務(wù)時(shí)間 + 前一個(gè)的結(jié)束時(shí)間 - 到達(dá)時(shí)間(結(jié)束時(shí)間 = 服務(wù)時(shí)間 + 前一個(gè)的結(jié)束時(shí)間)
            jobs[i].endtime = jobs[i].starttime + jobs[i].runtime;  //結(jié)束時(shí)間 = 到達(dá)時(shí)間 + 周轉(zhuǎn)時(shí)間
        }
        jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;//帶權(quán)周轉(zhuǎn)時(shí)間=周轉(zhuǎn)時(shí)間/服務(wù)時(shí)間
    }
}
void SJF(struct job jobs[50], int n)
{
    int i = 0, j = 0;
    char t_name[10];//用于交換的臨時(shí)變量
    int t_time;//用于交換的臨時(shí)變量
    for (i = 0; i < n; i++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面 
    {
        for (j = i; j < n; j++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面 
        {
            if (jobs[j].starttime < jobs[i].starttime)
            {   //把到達(dá)時(shí)間早的賦值到t_time
                t_time = jobs[j].starttime;
                jobs[j].starttime = jobs[i].starttime;
                jobs[i].starttime = t_time;
                //把到達(dá)時(shí)間早的賦值到t_time
                t_time = jobs[j].needtime;
                jobs[j].needtime = jobs[i].needtime;
                jobs[i].needtime = t_time;
                strcpy(t_name, jobs[j].name);//這里用strcpy函數(shù)是由于name變量為字符串類型,不能用=賦值
                strcpy(jobs[j].name, jobs[i].name);
                strcpy(jobs[i].name, t_name);//利用t_name數(shù)組進(jìn)行交換排序
            }
        }
    }
    jobs[0].endtime = jobs[0].starttime + jobs[0].needtime;//結(jié)束時(shí)間=到達(dá)時(shí)間+服務(wù)時(shí)間
    jobs[0].runtime = jobs[0].needtime;//周轉(zhuǎn)時(shí)間=服務(wù)時(shí)間
    jobs[0].dqzz_time = jobs[0].runtime * 1.0 / jobs[0].needtime;//帶權(quán)周轉(zhuǎn)時(shí)間=周轉(zhuǎn)時(shí)間/服務(wù)時(shí)間
    for (i = 1; i < n; i++)
    {
        for (j = i; j < n; j++)
        {
            //按最短運(yùn)行時(shí)間排序
            //關(guān)于jobs[i - 1].endtime > jobs[j].starttime如果到達(dá)時(shí)間太遲于上一輪的結(jié)束時(shí)間,會(huì)造成浪費(fèi)時(shí)間資源用以等待
            if (jobs[i - 1].endtime > jobs[j].starttime && jobs[j].needtime < jobs[i].needtime)
            {
                t_time = jobs[i].starttime;
                jobs[i].starttime = jobs[j].starttime;
                jobs[j].starttime = t_time;
                //把短的賦值到臨時(shí)變量t_time中
                t_time = jobs[i].needtime;
                jobs[i].needtime = jobs[j].needtime;
                jobs[j].needtime = t_time;
                strcpy(t_name, jobs[i].name);   //將第二個(gè)參數(shù)的值復(fù)制給第一個(gè)參數(shù),返回第一個(gè)參數(shù)
                strcpy(jobs[i].name, jobs[j].name);
                strcpy(jobs[j].name, t_name);
            }                 //按最短運(yùn)行時(shí)間排序
        }
        if (jobs[i].starttime > jobs[i - 1].endtime)
        {       //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程已運(yùn)行完畢
            jobs[i].endtime = jobs[i].starttime + jobs[i].needtime;//結(jié)束時(shí)間=到達(dá)時(shí)間+服務(wù)時(shí)間
            jobs[i].runtime = jobs[i].needtime;//周轉(zhuǎn)時(shí)間=服務(wù)時(shí)間
        }
        else
        {
            jobs[i].endtime = jobs[i - 1].endtime + jobs[i].needtime;//結(jié)束時(shí)間=上一個(gè)的結(jié)束時(shí)間+服務(wù)時(shí)間
            jobs[i].runtime = jobs[i].endtime - jobs[i].starttime;//周轉(zhuǎn)時(shí)間=結(jié)束時(shí)間-到達(dá)時(shí)間
        }
        jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;
    }
}
void HRRN(struct job jobs[50], int n) {
    int i = 0, j = 0;
    double hrrn[10];//動(dòng)態(tài)優(yōu)先級
    char t_name[10];//用于交換的臨時(shí)變量
    int t_time;//用于交換的臨時(shí)變量
    for (i = 0; i < n; i++) {
        if (jobs[i].starttime == 0) {
            t_time = jobs[0].starttime;
            jobs[0].starttime = jobs[i].starttime;
            jobs[i].starttime = t_time;
            //把第一個(gè)到達(dá)的放入臨時(shí)變量t_time中
            t_time = jobs[0].needtime;
            jobs[0].needtime = jobs[i].needtime;
            jobs[i].needtime = t_time;
            strcpy(t_name, jobs[0].name);   
            strcpy(jobs[0].name, jobs[i].name);
            strcpy(jobs[i].name, t_name);
        }
    }
    hrrn[0] = 1;//第一個(gè)運(yùn)行的進(jìn)程不需要等待,優(yōu)先級=1
    jobs[0].endtime = jobs[0].needtime;//第一個(gè)進(jìn)程的結(jié)束時(shí)間即其服務(wù)時(shí)間
    for (i = 1; i < n; i++) 
    {
        for (j = i; j < n; j++) 
        {
            //優(yōu)先級=(等待時(shí)間+要求服務(wù)時(shí)間)/ 要求服務(wù)時(shí)間
            hrrn[j] = static_cast<double>(jobs[i - 1].endtime - jobs[j].starttime + jobs[j].needtime) / jobs[j].needtime;
        }//這是此時(shí)第i個(gè)進(jìn)程結(jié)束后的所有進(jìn)程的優(yōu)先級
        for (int t = i + 1; t < n; t++) {
            if (hrrn[t] > hrrn[i]) {
                t_time = jobs[t].starttime;
                jobs[t].starttime = jobs[i].starttime;
                jobs[i].starttime = t_time;
                //把短的賦值到臨時(shí)變量t_time中
                t_time = jobs[t].needtime;
                jobs[t].needtime = jobs[i].needtime;
                jobs[i].needtime = t_time;
                strcpy(t_name, jobs[t].name);
                strcpy(jobs[t].name, jobs[i].name);
                strcpy(jobs[i].name, t_name);
            }//按優(yōu)先級進(jìn)行比較并排序
        }
        jobs[i].endtime = jobs[i - 1].endtime + jobs[i].needtime;//第i個(gè)進(jìn)程的結(jié)束時(shí)間=上一個(gè)的結(jié)束時(shí)間+服務(wù)時(shí)間
    }
    for (i = 0; i < n; i++)
    {
        if (i == 0)
        {   //第一個(gè)進(jìn)程
            jobs[i].runtime = jobs[i].needtime;     //周轉(zhuǎn)時(shí)間=服務(wù)時(shí)間
            jobs[i].endtime = jobs[i].starttime + jobs[i].needtime;    //結(jié)束時(shí)間=到達(dá)時(shí)間+服務(wù)時(shí)間    
        }
        else if (jobs[i].starttime > jobs[i - 1].endtime)
        {   //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程已運(yùn)行完畢
            jobs[i].runtime = jobs[i].needtime;
            jobs[i].endtime = jobs[i].starttime + jobs[i].needtime;
        }
        else
        {   //第i個(gè)進(jìn)程到達(dá)系統(tǒng)時(shí),第i-1個(gè)進(jìn)程未運(yùn)行完畢
            jobs[i].runtime = jobs[i].needtime + jobs[i - 1].endtime - jobs[i].starttime;
            //周轉(zhuǎn)時(shí)間 = 服務(wù)時(shí)間 + 前一個(gè)的結(jié)束時(shí)間 - 到達(dá)時(shí)間(結(jié)束時(shí)間 = 服務(wù)時(shí)間 + 前一個(gè)的結(jié)束時(shí)間)
            jobs[i].endtime = jobs[i].starttime + jobs[i].runtime;  //結(jié)束時(shí)間 = 到達(dá)時(shí)間 + 周轉(zhuǎn)時(shí)間
        }
        jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;//帶權(quán)周轉(zhuǎn)時(shí)間=周轉(zhuǎn)時(shí)間/服務(wù)時(shí)間
    }
}
void RR(struct job jobs[50], int n) {
    int t, s = 0, time = 0;
    int f[1000];
    printf("請輸入時(shí)間片的大?。?);
    scanf("%d",&t);
    int i = 0, j = 0;
    for (i = 0; i < 1000; i++) {
        f[i] = 0;
    }
    char t_name[10];//用于交換的臨時(shí)變量
    int t_time;//用于交換的臨時(shí)變量
    for (i = 0; i < n; i++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面 
    {
        for (j = i; j < n; j++) //按作業(yè)到達(dá)系統(tǒng)時(shí)間進(jìn)行排序,最早到達(dá)的排在最前面 
        {
            if (jobs[j].starttime < jobs[i].starttime)
            {   //把到達(dá)時(shí)間早的賦值到t_time
                t_time = jobs[j].starttime;
                jobs[j].starttime = jobs[i].starttime;
                jobs[i].starttime = t_time;
                //把到達(dá)時(shí)間早的賦值到t_time
                t_time = jobs[j].needtime;
                jobs[j].needtime = jobs[i].needtime;
                jobs[i].needtime = t_time;
                strcpy(t_name, jobs[j].name);//這里用strcpy函數(shù)是由于name變量為字符串類型,不能用=賦值
                strcpy(jobs[j].name, jobs[i].name);
                strcpy(jobs[i].name, t_name);//利用t_name數(shù)組進(jìn)行交換排序
            }
        }
    }
    for (i = 0; i < n; i++) {
        s += jobs[i].needtime;//s是用來確認(rèn)所有進(jìn)程全部結(jié)束
        f[i] = jobs[i].needtime;//f[i]用以存儲(chǔ)單個(gè)進(jìn)程剩余所需運(yùn)行時(shí)間
    }
    do {
        for (i = 0; i < n; i++) {
            if (f[i]) {         //若f[i] == 0,則說明本進(jìn)程的運(yùn)行已全部結(jié)束
                //如果本進(jìn)程剩余時(shí)間比時(shí)間片大,則總運(yùn)行時(shí)間加一個(gè)時(shí)間片,本進(jìn)程剩余運(yùn)行時(shí)間減一個(gè)時(shí)間片,并將s減一個(gè)時(shí)間片
                if (f[i] > t) { 
                    time += t;
                    f[i] -= t;
                    s -= t;
                }
                //如果本進(jìn)程剩余時(shí)間比時(shí)間片小,則總運(yùn)行時(shí)間加一個(gè)時(shí)間片,s減一個(gè)本進(jìn)程剩余運(yùn)行時(shí)間,并將本進(jìn)程剩余運(yùn)行時(shí)間歸零
                else {
                    time += t;
                    jobs[i].endtime = time;
                    s -= f[i];
                    f[i] = 0;
                }
            }
        }
    } while (s);
    for (i = 0; i < n; i++) {
        jobs[i].runtime = jobs[i].endtime - jobs[i].starttime;//周轉(zhuǎn)時(shí)間 = 結(jié)束時(shí)間 - 到達(dá)時(shí)間
        jobs[i].dqzz_time = jobs[i].runtime * 1.0 / jobs[i].needtime;//帶權(quán)周轉(zhuǎn)時(shí)間=周轉(zhuǎn)時(shí)間/服務(wù)時(shí)間
    }
}
void print(struct job jobs[50], int n)
{
    int i;
    double avertime;
    double dqzz_avertime;
    int sum_runtime = 0;
    double  sum_time = 0.00;
    printf("作業(yè)名  到達(dá)時(shí)間 運(yùn)行時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間\n");
    for (i = 0; i < n; i++)
    {
        printf("%s        %2d        %2d        %2d        %2d        %.2f\n", jobs[i].name, jobs[i].starttime, jobs[i].needtime, jobs[i].endtime, jobs[i].runtime, jobs[i].dqzz_time);
        sum_runtime = sum_runtime + jobs[i].runtime;
        sum_time = sum_time + jobs[i].dqzz_time;
    }
    avertime = sum_runtime * 1.0 / n;
    dqzz_avertime = sum_time * 1.000 / n;
    printf("平均周轉(zhuǎn)時(shí)間:%.2f \n", avertime);
    printf("平均帶權(quán)周轉(zhuǎn)時(shí)間:%.3f \n", dqzz_avertime);
    printf("\n");
}

(本文僅供學(xué)習(xí)時(shí)參考,如有錯(cuò)誤,純屬作者技術(shù)不到位,不足之處請多指教,謝謝)文章來源地址http://www.zghlxwxcb.cn/news/detail-773731.html

到了這里,關(guān)于操作系統(tǒng)有關(guān)進(jìn)程調(diào)度算法(含先來先服務(wù),短作業(yè)優(yōu)先,優(yōu)先級調(diào)度算法和時(shí)間片輪轉(zhuǎn)調(diào)度算法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 「 操作系統(tǒng) 」聊聊進(jìn)程調(diào)度算法

    「 操作系統(tǒng) 」聊聊進(jìn)程調(diào)度算法

    圖文并茂!談?wù)勥M(jìn)程調(diào)度那些算法 Cone 進(jìn)程調(diào)度/頁面置換/磁盤調(diào)度算法 xiaolinCoding 圖解經(jīng)典的進(jìn)程調(diào)度算法 飛天小牛肉 進(jìn)程調(diào)度算法是操作系統(tǒng)中非常重要的一部分,它決定了操作系統(tǒng)中各個(gè)進(jìn)程的執(zhí)行順序和時(shí)間片。在單核CPU下,任何時(shí)刻都只可能有一個(gè)程序在執(zhí)行,比

    2024年02月04日
    瀏覽(28)
  • 【操作系統(tǒng)之進(jìn)程調(diào)度算法習(xí)題】

    【操作系統(tǒng)之進(jìn)程調(diào)度算法習(xí)題】

    在一個(gè)具有三道作業(yè)的批處理系統(tǒng)中,作業(yè)調(diào)度采用先來先服務(wù)(FCFS) 調(diào)度算法,進(jìn)程調(diào)度采用 短作業(yè)優(yōu)先調(diào)度算法?,F(xiàn)有如下所示的作業(yè)序列, 注意 1.具有三道作業(yè)的批處理系統(tǒng)指的是內(nèi)存最多能有3個(gè)作業(yè); 2.表格樣式是考試時(shí)候的格式,練習(xí)時(shí)候也按這個(gè)格式練習(xí)各作業(yè)的周

    2024年02月11日
    瀏覽(21)
  • 操作系統(tǒng)實(shí)驗(yàn)—進(jìn)程調(diào)度算法(java)

    操作系統(tǒng)實(shí)驗(yàn)—進(jìn)程調(diào)度算法(java)

    目錄 文章目錄 前言 一、實(shí)驗(yàn)原理 二、實(shí)驗(yàn)步驟 1.創(chuàng)建PCB類 2.創(chuàng)建創(chuàng)建類 3.設(shè)計(jì)主窗口類 4.調(diào)度界面函數(shù) 5.算法類及其調(diào)度算法通用函數(shù) 6.進(jìn)程調(diào)度算法函數(shù) 總結(jié) 操作系統(tǒng)實(shí)驗(yàn)1:進(jìn)程調(diào)度算法,步驟3、4在一個(gè)類中,步驟5、6在一個(gè)類中。 (1)先到先服務(wù)調(diào)度算法:按照進(jìn)程提

    2024年02月04日
    瀏覽(16)
  • 【操作系統(tǒng)】期末速成之計(jì)算題:進(jìn)程調(diào)度算法

    【操作系統(tǒng)】期末速成之計(jì)算題:進(jìn)程調(diào)度算法

    先來先服務(wù)是非搶占式的算法 一個(gè)?? 例題:各進(jìn)程到達(dá)就緒隊(duì)列的時(shí)間、需要的運(yùn)行時(shí)間如下表所示。使用先來先服務(wù)調(diào)度算法,計(jì)算各進(jìn)程的等待時(shí)間、平均等待時(shí)間、周轉(zhuǎn)時(shí)間、平均周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間、平均帶權(quán)周轉(zhuǎn)時(shí)間。 進(jìn)程 到達(dá)時(shí)間 運(yùn)行時(shí)間 P1 0 7 P2 2 4

    2024年02月11日
    瀏覽(19)
  • 操作系統(tǒng)進(jìn)程調(diào)度算法(c語言模擬實(shí)現(xiàn))

    操作系統(tǒng)進(jìn)程調(diào)度算法(c語言模擬實(shí)現(xiàn))

    ????????前言: 本文旨在分享如何使用c語言對操作系統(tǒng)中的部分進(jìn)程調(diào)度算法進(jìn)行模擬實(shí)現(xiàn),以及算法描述的講解, 完整代碼放在文章末尾,歡迎大家自行拷貝調(diào)用 目錄 常見的調(diào)度算法 數(shù)據(jù)結(jié)構(gòu) 先來先服務(wù)調(diào)度算法 算法模擬思路: 算法模擬:? 最短作業(yè)優(yōu)先調(diào)度算法

    2024年02月06日
    瀏覽(27)
  • 用代碼模擬操作系統(tǒng)進(jìn)程調(diào)度算法(Python)

    用代碼模擬操作系統(tǒng)進(jìn)程調(diào)度算法(Python)

    ?引言 近日,在學(xué)習(xí)完操作系統(tǒng)的進(jìn)程調(diào)度部分后,我萌生了一個(gè)有趣的想法:通過編寫代碼來模擬進(jìn)程調(diào)度算法,以加深自己對這一知識(shí)點(diǎn)的理解。于是,我花了一整天的時(shí)間投入到了這個(gè)突發(fā)奇想的實(shí)踐中。 ?背景 進(jìn)程調(diào)度是操作系統(tǒng)中的重要概念,它決定了如何合理地

    2024年02月06日
    瀏覽(23)
  • 計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程調(diào)度模擬算法

    進(jìn)程調(diào)度是處理機(jī)管理的核心內(nèi)容。本實(shí)驗(yàn)要求用高級語言編寫模擬進(jìn)程調(diào)度程序,以 便加深理解有關(guān)進(jìn)程控制快、進(jìn)程隊(duì)列等概念,并體會(huì)和了解優(yōu)先數(shù)算法和時(shí)間片輪轉(zhuǎn)算法 的具體實(shí)施辦法。 1.設(shè)計(jì)進(jìn)程控制塊 PCB 的結(jié)構(gòu),通常應(yīng)包括如下信息: 進(jìn)程名、進(jìn)程優(yōu)先數(shù)(

    2024年02月05日
    瀏覽(89)
  • 操作系統(tǒng)進(jìn)程調(diào)度算法的模擬實(shí)現(xiàn)(c語言版本)

    操作系統(tǒng)進(jìn)程調(diào)度算法的模擬實(shí)現(xiàn)(c語言版本)

    ????????前言: 本文旨在分享如何使用c語言對操作系統(tǒng)中的部分進(jìn)程調(diào)度算法進(jìn)行模擬實(shí)現(xiàn),以及算法描述的講解, 完整代碼放在文章末尾,歡迎大家自行拷貝調(diào)用 目錄 常見的調(diào)度算法 數(shù)據(jù)結(jié)構(gòu) 先來先服務(wù)調(diào)度算法 算法模擬思路: 算法模擬:? 最短作業(yè)優(yōu)先調(diào)度算法

    2024年02月06日
    瀏覽(16)
  • 【操作系統(tǒng)】c語言--進(jìn)程調(diào)度算法(FCFS和SPN)

    【操作系統(tǒng)】c語言--進(jìn)程調(diào)度算法(FCFS和SPN)

    創(chuàng)作不易,本篇文章如果幫助到了你,還請點(diǎn)贊 關(guān)注支持一下???)!! 主頁專欄有更多知識(shí),如有疑問歡迎大家指正討論,共同進(jìn)步! ??c++系列專欄:C/C++零基礎(chǔ)到精通 ?? 給大家跳段街舞感謝支持!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? c語言內(nèi)容??:

    2024年02月12日
    瀏覽(17)
  • 操作系統(tǒng)進(jìn)程線程(一)—進(jìn)程線程協(xié)程區(qū)別、多進(jìn)程多線程、進(jìn)程調(diào)度算法、進(jìn)程線程通信

    操作系統(tǒng)進(jìn)程線程(一)—進(jìn)程線程協(xié)程區(qū)別、多進(jìn)程多線程、進(jìn)程調(diào)度算法、進(jìn)程線程通信

    定義上 進(jìn)程: 資源分配和擁有 的基本單位,是調(diào)度的基本單位。 運(yùn)行一個(gè)可執(zhí)行程序會(huì)創(chuàng)建一個(gè)或者多個(gè)進(jìn)程;進(jìn)程就是運(yùn)行起來的程序 線程:程序 執(zhí)行 基本單位,輕量級進(jìn)程。 每個(gè)進(jìn)程中都有唯一的主線程 ,主線程和進(jìn)程是相互依賴的關(guān)系。 協(xié)程: 用戶態(tài) 的輕量級

    2024年02月01日
    瀏覽(96)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包