基于優(yōu)先級(jí)的時(shí)間片輪轉(zhuǎn)調(diào)度算法

1、假定系統(tǒng)有5個(gè)進(jìn)程,每個(gè)進(jìn)程用一個(gè)進(jìn)程控制塊PCB來(lái)代表,進(jìn)程控制塊的結(jié)構(gòu)如下圖1.1所示:

進(jìn)程名 優(yōu)先級(jí) 要求運(yùn)行時(shí)間 已運(yùn)行時(shí)間 進(jìn)程狀態(tài) 指針

其中:
進(jìn)程名:作為進(jìn)程的標(biāo)識(shí),假設(shè)五個(gè)進(jìn)程的進(jìn)程名分別為p1,p2,p3,p4,p5。
指針:進(jìn)程按順序排成循環(huán)鏈表,用指針指出下一個(gè)進(jìn)程的進(jìn)程控制塊首地址,最后一個(gè)進(jìn)程中的指針指出第一個(gè)進(jìn)程的進(jìn)程控制塊首地址。
要求運(yùn)行時(shí)間:假設(shè)進(jìn)程需要運(yùn)行的單位時(shí)間數(shù)。
已運(yùn)行時(shí)間:假設(shè)進(jìn)程已經(jīng)運(yùn)行的單位時(shí)間數(shù),初值為0。
狀態(tài):可假設(shè)有兩種狀態(tài),就緒狀態(tài)和結(jié)束狀態(tài)。進(jìn)程的初始狀態(tài)都為就緒狀態(tài)。
2、每次運(yùn)行所設(shè)計(jì)的處理器調(diào)度程序調(diào)度進(jìn)程之前,為每個(gè)進(jìn)程隨機(jī)確定它的要求運(yùn)行時(shí)間和優(yōu)先級(jí)(數(shù)值越大,優(yōu)先級(jí)越高)。
3、進(jìn)程調(diào)度依據(jù)優(yōu)先級(jí)進(jìn)行,優(yōu)先級(jí)隨著時(shí)間動(dòng)態(tài)增加,每經(jīng)過(guò)一個(gè)時(shí)間片,優(yōu)先級(jí)加1。
4、此程序是模擬處理器調(diào)度,因此,被選中的進(jìn)程并不實(shí)際啟動(dòng)運(yùn)行,而是執(zhí)行
已運(yùn)行時(shí)間+1
來(lái)模擬進(jìn)程的一次運(yùn)行,表示進(jìn)程已經(jīng)運(yùn)行過(guò)一個(gè)單位時(shí)間。
5、在所設(shè)計(jì)的程序中應(yīng)有顯示語(yǔ)句,能顯示每次被選中的進(jìn)程名以及運(yùn)行一次后進(jìn)程隊(duì)列的變化。

實(shí)驗(yàn)代碼:

#include <iostream>
#include <string>
#include <cstdlib>
#define maxNTime 10
using namespace std;
struct pcb {
    string name;
    int priority;
    int needTime;
    int runTime;
    int pstate;
    pcb * next;
};
pcb* input(int pNum) {
    pcb * head = NULL;
    pcb * p;
    for (int i = 0; i < pNum; i++) {
        p = head;
        cout << "請(qǐng)輸入" << i + 1 << "第個(gè)進(jìn)程名:";
        head = new pcb;
        cin >> head->name;
        head->priority = (rand() % pNum) + 1;
        head->needTime = (rand() % maxNTime) + 1;
        head->runTime = 0;
        head->pstate = 0;
        head->next = p;
    }
    for (p = head; p->next != NULL; p = p->next);
    p->next = head;
    return head;
}
void output(pcb* head, int pNum) {
    pcb* p = head;
    cout << "------------------------------------------------\n";
    string sta[3] = { "就緒","運(yùn)行","完成" };
    for (int i = 0; i < pNum; i++) {
        cout << p->name << "\t" << p->runTime << "\t" << p->needTime << "\t\t" << p->priority << "\t" << sta[p->pstate] << "\n";
        p = p->next;
    }
}
pcb* findHP(pcb* p, int pNum) {
    pcb * high = p;
    for (int i = 0; i < pNum; i++) {
        if (p->pstate == 1);
        else if (p->priority >= high->priority) high = p;
        p = p->next;
    }
    return high;
}
void runP(pcb* head, pcb* p, int pNum, int timePs) {
    int datTime = 0;
    datTime = (p->needTime <= timePs) ? p->needTime : timePs;
    cout << "正在運(yùn)行:" << p->name << endl;
    for (int i = 0; i < datTime; i++) {
        p->pstate = 1;
        p->runTime++;
        p->needTime--;
    }
    p->pstate = (p->needTime == 0) ? 2 : 0;
    output(head, pNum);
    p = p->next;
    for (int i = 0; i < pNum - 1; i++) {
        if (p->pstate != 1) p->priority += 1;
        p = p->next;
    }
}
bool allDone(pcb* head, int pNum) {
    pcb* p = head;
    for (int i = 0; i < pNum; i++) {
        if (p->pstate == 0) return 0;
        else p = p->next;
    }
    return 1;
}
int main() {
    int pNum, timePs;
    pcb * head, *p;
    cout << "請(qǐng)輸入進(jìn)程數(shù):";
    cin >> pNum;
    head = input(pNum);
    cout << "請(qǐng)輸入時(shí)間片:";
    cin >> timePs;
    p = head;
    cout << "進(jìn)程名\t已運(yùn)行\(zhòng)t還需時(shí)間\t優(yōu)先級(jí)\t狀態(tài)\n";
    while (!allDone(head, pNum)) {
        p = findHP(p, pNum);
        runP(head, p, pNum, timePs);
    }
    //  output(head,pNum);
    return 0;
}

運(yùn)行:

請(qǐng)輸入進(jìn)程數(shù):5
請(qǐng)輸入1第個(gè)進(jìn)程名:P1
請(qǐng)輸入2第個(gè)進(jìn)程名:P2
請(qǐng)輸入3第個(gè)進(jìn)程名:P3
請(qǐng)輸入4第個(gè)進(jìn)程名:P4
請(qǐng)輸入5第個(gè)進(jìn)程名:P5
請(qǐng)輸入時(shí)間片:4
進(jìn)程名  已運(yùn)行  還需時(shí)間        優(yōu)先級(jí)  狀態(tài)
正在運(yùn)行:P2
------------------------------------------------
P5      0       5               3       就緒
P4      0       9               4       就緒
P3      0       5               5       就緒
P2      1       0               5       完成
P1      0       8               2       就緒
正在運(yùn)行:P3
------------------------------------------------
P5      0       5               4       就緒
P4      0       9               5       就緒
P3      4       1               6       就緒
P2      1       0               5       完成
P1      0       8               3       就緒
正在運(yùn)行:P4
------------------------------------------------
P5      0       5               5       就緒
P4      4       5               6       就緒
P3      4       1               6       就緒
P2      1       0               6       完成
P1      0       8               4       就緒
正在運(yùn)行:P2
------------------------------------------------
P5      0       5               6       就緒
P4      4       5               6       就緒
P3      4       1               7       就緒
P2      1       0               7       完成
P1      0       8               5       就緒
正在運(yùn)行:P3
------------------------------------------------
P5      0       5               7       就緒
P4      4       5               7       就緒
P3      5       0               8       完成
P2      1       0               7       完成
P1      0       8               6       就緒
正在運(yùn)行:P4
------------------------------------------------
P5      0       5               8       就緒
P4      8       1               8       就緒
P3      5       0               8       完成
P2      1       0               8       完成
P1      0       8               7       就緒
正在運(yùn)行:P5
------------------------------------------------
P5      4       1               9       就緒
P4      8       1               8       就緒
P3      5       0               9       完成
P2      1       0               9       完成
P1      0       8               8       就緒
正在運(yùn)行:P2
------------------------------------------------
P5      4       1               9       就緒
P4      8       1               9       就緒
P3      5       0               10      完成
P2      1       0               10      完成
P1      0       8               9       就緒
正在運(yùn)行:P3
------------------------------------------------
P5      4       1               10      就緒
P4      8       1               10      就緒
P3      5       0               11      完成
P2      1       0               10      完成
P1      0       8               10      就緒
正在運(yùn)行:P4
------------------------------------------------
P5      4       1               11      就緒
P4      9       0               11      完成
P3      5       0               11      完成
P2      1       0               11      完成
P1      0       8               11      就緒
正在運(yùn)行:P5
------------------------------------------------
P5      5       0               12      完成
P4      9       0               11      完成
P3      5       0               12      完成
P2      1       0               12      完成
P1      0       8               12      就緒
正在運(yùn)行:P1
------------------------------------------------
P5      5       0               12      完成
P4      9       0               12      完成
P3      5       0               13      完成
P2      1       0               13      完成
P1      4       4               13      就緒
正在運(yùn)行:P2
------------------------------------------------
P5      5       0               13      完成
P4      9       0               13      完成
P3      5       0               14      完成
P2      1       0               14      完成
P1      4       4               13      就緒
正在運(yùn)行:P3
------------------------------------------------
P5      5       0               14      完成
P4      9       0               14      完成
P3      5       0               15      完成
P2      1       0               14      完成
P1      4       4               14      就緒
正在運(yùn)行:P4
------------------------------------------------
P5      5       0               15      完成
P4      9       0               15      完成
P3      5       0               15      完成
P2      1       0               15      完成
P1      4       4               15      就緒
正在運(yùn)行:P5
------------------------------------------------
P5      5       0               16      完成
P4      9       0               15      完成
P3      5       0               16      完成
P2      1       0               16      完成
P1      4       4               16      就緒
正在運(yùn)行:P1
------------------------------------------------
P5      5       0               16      完成
P4      9       0               16      完成
P3      5       0               17      完成
P2      1       0               17      完成
P1      8       0               17      完成
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容