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 完成