先来先服务调度算法(C++实现)
算法思想:
先來先服務(wù)調(diào)度算法:
(1)假設(shè)系統(tǒng)中有5個(gè)進(jìn)程,每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊(PCB)來標(biāo)識(shí)。進(jìn)程控制塊內(nèi)容包括:進(jìn)程名,鏈接指針,到達(dá)時(shí)間,估計(jì)運(yùn)行時(shí)間,進(jìn)程狀態(tài)。
進(jìn)程名即進(jìn)程標(biāo)識(shí)。
鏈接指針:按照進(jìn)程到達(dá)系統(tǒng)的時(shí)間將處于就緒狀態(tài)的進(jìn)程連接成一個(gè)就緒隊(duì)列。指針指出下一個(gè)到達(dá)進(jìn)程的進(jìn)程控制塊地址。最后一個(gè)進(jìn)程的鏈接指針為NULL。
估計(jì)運(yùn)行時(shí)間:可由設(shè)計(jì)者任意指定一個(gè)時(shí)間值。
到達(dá)時(shí)間:進(jìn)程創(chuàng)建時(shí)的系統(tǒng)時(shí)間或由用戶指定。調(diào)度時(shí)。總是選擇到達(dá)時(shí)間最早的進(jìn)程。
進(jìn)程狀態(tài):為簡(jiǎn)單起見,這里假定進(jìn)程有兩種狀態(tài):就緒和完成。并假定進(jìn)程一創(chuàng)建就處于就緒狀態(tài),用R表示。當(dāng)一個(gè)進(jìn)程運(yùn)行結(jié)束時(shí),就將其置成完成態(tài),用C表示。
(2)設(shè)置一個(gè)隊(duì)首指針head,用來指出最先進(jìn)入系統(tǒng)地進(jìn)程。各就緒進(jìn)程通過鏈接指針連在一起。
(3)處理機(jī)調(diào)度時(shí)總是選擇對(duì)首指針指向的進(jìn)程投入運(yùn)行。由于本實(shí)驗(yàn)是模擬試驗(yàn),所以對(duì)被選中進(jìn)程并不實(shí)際啟動(dòng)運(yùn)行,而只是執(zhí)行:估計(jì)運(yùn)行時(shí)間減1。用這個(gè)操作來模擬進(jìn)程的一次運(yùn)行,而且省去進(jìn)程的現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)工作。
(4)在所設(shè)計(jì)的程序中應(yīng)有顯示或打印語句,能顯示或打印正運(yùn)行進(jìn)程的進(jìn)程名、已運(yùn)行時(shí)間、還剩時(shí)間、就緒隊(duì)列中的進(jìn)程等。所有進(jìn)程運(yùn)行完成時(shí),給出各進(jìn)程的周轉(zhuǎn)時(shí)間和平均周轉(zhuǎn)時(shí)間。
代碼:
#include<iostream> #include<string> #include<queue> using namespace std; typedef struct pcb {string pName; //進(jìn)程名float arriveTime;//到達(dá)時(shí)間float serviceTime;//服務(wù)時(shí)間float estimatedRunningtime;//估計(jì)運(yùn)行時(shí)間float startTime;//開始運(yùn)行時(shí)間float finishTime;//完成運(yùn)行時(shí)間float turnaroundTime;//周轉(zhuǎn)時(shí)間float weightedTuraroundTime;//帶權(quán)周轉(zhuǎn)時(shí)間char state;//狀態(tài)bool operator<(const pcb &a)const {return arriveTime > a.arriveTime;} }PCB;void createProcess(priority_queue<PCB> &p, int n) {//創(chuàng)建n個(gè)進(jìn)程cout << endl << endl << "創(chuàng)建進(jìn)程" << endl;PCB r;//工作結(jié)點(diǎn)for (int i = 0; i<n; i++) {cout << "請(qǐng)輸入第" << i + 1 << "個(gè)進(jìn)程的名字、到達(dá)時(shí)間、服務(wù)時(shí)間(例如: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) {//輸出所有進(jìn)程的信息PCB q;cout << "進(jìn)程名\t到達(dá)時(shí)間 服務(wù)時(shí)間 開始時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間" << 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) {//運(yùn)行進(jìn)程PCB s;float finishTimeOfPriorProcess;for (int i = 0; i<n; i++) {s = p.top();if (i == 0) {//當(dāng)前進(jìn)程是第一個(gè)進(jìn)程while (s.estimatedRunningtime != 0) {//輸出當(dāng)前運(yùn)行進(jìn)程的信息cout << "正在運(yùn)行的進(jìn)程" << endl;cout << "進(jìn)程名\t到達(dá)時(shí)間 服務(wù)時(shí)間 已運(yùn)行時(shí)間 還剩運(yùn)行時(shí)間" << endl;cout << s.pName << "\t" << s.arriveTime << "\t " << s.serviceTime << "\t ";cout << s.serviceTime - s.estimatedRunningtime << "\t " << s.estimatedRunningtime << endl;s.estimatedRunningtime--; //當(dāng)前進(jìn)程的估計(jì)運(yùn)行時(shí)間減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 {//當(dāng)前進(jìn)程不是第一個(gè)進(jìn)程while (s.estimatedRunningtime != 0) {cout << "正在運(yùn)行的進(jìn)程" << endl;cout << "進(jìn)程名\t到達(dá)時(shí)間 服務(wù)時(shí)間 已運(yùn)行時(shí)間 還剩運(yùn)行時(shí)間" << endl;cout << s.pName << "\t" << s.arriveTime << "\t " << s.serviceTime << "\t ";cout << s.serviceTime - s.estimatedRunningtime << "\t " << s.estimatedRunningtime << endl;s.estimatedRunningtime--;//當(dāng)前進(jìn)程的估計(jì)運(yùn)行時(shí)間減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 << "進(jìn)程" << s.pName << "執(zhí)行結(jié)束之后就緒隊(duì)列中的進(jìn)程" << endl;printProcess(p);}cout<< endl << endl; }int main() {priority_queue<PCB> p,q;int n;cout << "請(qǐng)輸入進(jìn)程的個(gè)數(shù):";cin >> n;createProcess(p, n);runProcess(p, q, n);cout << "所有進(jìn)程執(zhí)行結(jié)束之后的相關(guān)情況" << endl << endl;printProcess(q);getchar();getchar();return 0; }實(shí)驗(yàn)結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的先来先服务调度算法(C++实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图形学实验之显示一个飞机(C++实现)
- 下一篇: 优先级调度算法(C++实现)