算法思想:
先來先服務調度算法:
(1)假設系統中有5個進程,每個進程有一個進程控制塊(PCB)來標識。進程控制塊內容包括:進程名,鏈接指針,到達時間,估計運行時間,進程狀態。
進程名即進程標識。
鏈接指針:按照進程到達系統的時間將處於就緒狀態的進程連接成一個就緒隊列。指針指出下一個到達進程的進程控制塊地址。最後一個進程的鏈接指針爲NULL。
估計運行時間:可由設計者任意指定一個時間值。
到達時間:進程創建時的系統時間或由用戶指定。調度時。總是選擇到達時間最早的進程。
進程狀態:爲簡單起見,這裏假定進程有兩種狀態:就緒和完成。並假定進程一創建就處於就緒狀態,用R表示。當一個進程運行結束時,就將其置成完成態,用C表示。
(2)設置一個隊首指針head,用來指出最先進入系統地進程。各就緒進程通過鏈接指針連在一起。
(3)處理機調度時總是選擇對首指針指向的進程投入運行。由於本實驗是模擬試驗,所以對被選中進程並不實際啓動運行,而只是執行:估計運行時間減1。用這個操作來模擬進程的一次運行,而且省去進程的現場保護和現場恢復工作。
(4)在所設計的程序中應有顯示或打印語句,能顯示或打印正運行進程的進程名、已運行時間、還剩時間、就緒隊列中的進程等。所有進程運行完成時,給出各進程的週轉時間和平均週轉時間。
代碼:
#include<iostream>
#include<string>
#include<queue>
using namespace std;
typedef struct pcb {
string pName; //進程名
float arriveTime;//到達時間
float serviceTime;//服務時間
float estimatedRunningtime;//估計運行時間
float startTime;//開始運行時間
float finishTime;//完成運行時間
float turnaroundTime;//週轉時間
float weightedTuraroundTime;//帶權週轉時間
char state;//狀態
bool operator<(const pcb &a)const {
return arriveTime > a.arriveTime;
}
}PCB;
void createProcess(priority_queue<PCB> &p, int n) {//創建n個進程
cout << endl << endl << "創建進程" << endl;
PCB r;//工作結點
for (int i = 0; i<n; i++) {
cout << "請輸入第" << i + 1 << "個進程的名字、到達時間、服務時間(例如:A 12 8):";
cin >> r.pName;
cin >> r.arriveTime;
cin >> r.serviceTime;
r.startTime = 0;
r.finishTime = 0;
r.estimatedRunningtime = r.serviceTime;
r.turnaroundTime = 0;
r.weightedTuraroundTime = 0;
p.push(r);
}
}
void printProcess(priority_queue<PCB> p) {//輸出所有進程的信息
PCB q;
cout << "進程名\t到達時間 服務時間 開始時間 完成時間 週轉時間 帶權週轉時間" << endl;
while (p.size() != 0) {
q = p.top();
cout << q.pName << "\t" << q.arriveTime << "\t " << q.serviceTime << "\t ";
cout << q.startTime << "\t " << q.finishTime << "\t " << q.turnaroundTime << "\t " << q.weightedTuraroundTime << endl;
p.pop();
}
cout << endl << endl;
}
void runProcess(priority_queue<PCB> &p, priority_queue<PCB> &q, int n) {//運行進程
PCB s;
float finishTimeOfPriorProcess;
for (int i = 0; i<n; i++) {
s = p.top();
if (i == 0) {//當前進程是第一個進程
while (s.estimatedRunningtime != 0) {//輸出當前運行進程的信息
cout << "正在運行的進程" << endl;
cout << "進程名\t到達時間 服務時間 已運行時間 還剩運行時間" << endl;
cout << s.pName << "\t" << s.arriveTime << "\t " << s.serviceTime << "\t ";
cout << s.serviceTime - s.estimatedRunningtime << "\t " << s.estimatedRunningtime << endl;
s.estimatedRunningtime--; //當前進程的估計運行時間減1
}
s.startTime = s.arriveTime;
s.finishTime = s.startTime + s.serviceTime;
s.turnaroundTime = s.finishTime - s.arriveTime;
s.weightedTuraroundTime = float(s.turnaroundTime*1.0 / s.serviceTime);
s.state = 'C';
finishTimeOfPriorProcess = s.finishTime;
}
else {//當前進程不是第一個進程
while (s.estimatedRunningtime != 0) {
cout << "正在運行的進程" << endl;
cout << "進程名\t到達時間 服務時間 已運行時間 還剩運行時間" << endl;
cout << s.pName << "\t" << s.arriveTime << "\t " << s.serviceTime << "\t ";
cout << s.serviceTime - s.estimatedRunningtime << "\t " << s.estimatedRunningtime << endl;
s.estimatedRunningtime--;//當前進程的估計運行時間減1
}
s.startTime = finishTimeOfPriorProcess>s.arriveTime ? finishTimeOfPriorProcess : s.arriveTime;
s.finishTime = s.startTime + s.serviceTime;
s.turnaroundTime = s.finishTime - s.arriveTime;
s.weightedTuraroundTime = float(s.turnaroundTime*1.0 / s.serviceTime);
s.state = 'C';
finishTimeOfPriorProcess = s.finishTime;
}
q.push(s);
p.pop();
cout << "進程" << s.pName << "執行結束之後就緒隊列中的進程" << endl;
printProcess(p);
}
cout<< endl << endl;
}
int main() {
priority_queue<PCB> p,q;
int n;
cout << "請輸入進程的個數:";
cin >> n;
createProcess(p, n);
runProcess(p, q, n);
cout << "所有進程執行結束之後的相關情況" << endl << endl;
printProcess(q);
getchar();
getchar();
return 0;
}
實驗結果: