按时间片轮转调度算法(C++实现)
生活随笔
收集整理的這篇文章主要介紹了
按时间片轮转调度算法(C++实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法思想:
按時間片輪轉調度算法:
(1)假設系統中有5個進程,每個進程有一個進程控制塊(PCB)來標識。進程控制塊內容包括:進程名,鏈接指針,到達時間,估計運行時間,進程狀態。
進程名即進程標識。
鏈接指針:按照進程到達系統的時間將處于就緒狀態的進程連接成一個就緒隊列。指針指出下一個到達進程的進程控制塊地址。最后一個進程的鏈接指針為NULL。
(2)為每個進程任意確定一個到達時間和要求運行時間。
(3)設置一個隊首指針head,用來指出最先進入系統的進程。各就緒進程通過鏈接指針連在一起構成一個循環隊列。
(4)處理機調度時開始選擇隊首指針指向的進程投入運行。由于本實驗是模擬試驗,所以對被選中進程并不實際啟動運行,而只是執行:估計運行時間減1。用這個操作來模擬進程的一次運行,而且省去進程的現場保護和現場恢復工作。
(5)進程運行一次后,以后的調度則將當前指針依次下移一個位置,指向下一個進程。同時還應判斷該進程的剩余的運行時間是否為0,若不為0,則等待下一輪的運行;若該進程的剩余時間為0,則把它的狀態改為完成態(C),并撤出就緒隊列。
(6)若就緒隊列非空,則重復上述的(4)和(5),直到所有進程為完成態。
(7)在所設計的程序中應有顯示或打印語句,能顯示或打印正運行進程的進程名、已運行時間、還剩時間、就緒隊列中的進程等。
代碼:
#include<iostream> #include<string> using namespace std; typedef struct pcb {string pName;//進程名struct pcb *next;//指向下一個進程float arriveTime;//到達時間float serviceTime;//服務時間float estimatedRunningtime;//估計運行時間float startTime;//開始時間float finishTime;//完成時間float turnaroundTime;//周轉時間float weightedTuraroundTime;//帶權周轉時間char state;//進程的狀態 }PCB;void createProcess(PCB *p, int n) {//創建n個進程,帶頭結點cout << endl << endl << "創建進程" << endl;PCB *q = p;//工作指針的前一個結點指針PCB *r = new PCB;//工作指針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;r->state = 'R';q->next = r;q = r;r->next = new PCB;r = r->next;}r->next = NULL;q->next = NULL;q = NULL;delete q;delete r;cout << endl << endl; }void sortOfArriveTime(PCB *p, int n) {//按到達時間對進程排序PCB *t = new PCB;PCB *q = new PCB;PCB *m = new PCB;for (int i = 0; i<n - 1; i++) {//冒泡循環q = p->next;//q指向鏈表中的第一個進程for (int j = 0; j<n - i - 1; j++) {m = q->next;if (q->arriveTime>m->arriveTime) {//結點信息進行交換t->pName = q->pName;t->arriveTime = q->arriveTime;t->serviceTime = q->serviceTime;t->estimatedRunningtime = q->estimatedRunningtime;q->pName = m->pName;q->arriveTime = m->arriveTime;q->serviceTime = m->serviceTime;q->estimatedRunningtime = m->estimatedRunningtime;m->pName = t->pName;m->arriveTime = t->arriveTime;m->serviceTime = t->serviceTime;m->estimatedRunningtime = t->estimatedRunningtime;}q = q->next;}}t = NULL;m = NULL;q = NULL;delete t;delete m;delete q; }void runProcess(PCB *p, int n) {//運行進程PCB *q = new PCB;PCB *m = new PCB;PCB *s = new PCB;int a = n;sortOfArriveTime(p, n);q = p;m = p->next;int currentTime = 0;//當前時間int i = 0;int number = 0;while (true) {currentTime++;if (i == 0 && m->arriveTime>currentTime)//首次運行進程continue;number = 0;while (m&&m->state == 'C' || m&&m->arriveTime>currentTime) {//尋找應該訪問的進程number++;q = m;m = m->next;if (m == NULL) {q = p;m = p->next;}if (number>n)break;}if (number>n)//所有進程都不能進行訪問continue;cout << "正在運行的進程" << endl;cout << "當前時間:" << currentTime << endl;cout << "進程名\t到達時間 服務時間 已運行時間 還剩運行時間" << endl;//輸出當前正在運行的進程cout << m->pName << "\t" << m->arriveTime << "\t " << m->serviceTime << "\t ";cout << m->serviceTime - m->estimatedRunningtime << "\t " << m->estimatedRunningtime << endl;m->estimatedRunningtime--;m->finishTime = currentTime + 1;if (m->estimatedRunningtime == 0)m->state = 'C';cout << "進程" << m->pName << "執行一次之后就緒隊列中的進程" << endl;cout << "進程名\t到達時間 服務時間 已運行時間 還剩運行時間" << endl;s = p->next;while (s) {//輸出就緒隊列if (s->estimatedRunningtime != 0) {cout << s->pName << "\t" << s->arriveTime << "\t " << s->serviceTime << "\t ";cout << s->serviceTime - s->estimatedRunningtime << "\t " << s->estimatedRunningtime << endl;}s = s->next;}cout << endl << endl << endl;q = m;m = m->next;//q、m指針后移if (m == NULL) {//回到鏈表頭部q = p;m = p->next;}s = p->next;while (s&&s->state == 'C')s = s->next;if (s == NULL)//若所有進程已完成,則退出循環break;i++;}q = p;m = p->next;for (int i = 0; i<n; i++) {//計算開始時間、周轉時間、帶權周轉時間if (i == 0) {m->startTime = m->arriveTime;m->turnaroundTime = m->finishTime - m->arriveTime;m->weightedTuraroundTime = m->turnaroundTime*1.0 / m->serviceTime;}else {m->startTime = q->startTime + 1>m->arriveTime ? q->startTime + 1 : m->arriveTime;m->turnaroundTime = m->finishTime - m->arriveTime;m->weightedTuraroundTime = m->turnaroundTime*1.0 / m->serviceTime;}m = m->next;}q = NULL;m = NULL;s = NULL;delete q;delete m;delete s;cout << endl; }void printProcess(PCB *p) {//輸出所有進程的信息PCB *q = p->next;cout << endl << "所有進程運行完成后進程的相關信息" << endl;cout << "進程名\t到達時間 服務時間 開始時間 完成時間 周轉時間 帶權周轉時間" << endl;while (q) {cout << q->pName << "\t" << q->arriveTime << "\t " << q->serviceTime << "\t ";cout << q->startTime << "\t " << q->finishTime << "\t " << q->turnaroundTime << "\t " << q->weightedTuraroundTime << endl;q = q->next;}cout << endl << endl; }int main() {PCB *p = new PCB;int n;cout << "請輸入進程的個數:";cin >> n;createProcess(p, n);runProcess(p, n);printProcess(p);getchar();getchar();return 0; }實驗結果:
總結
以上是生活随笔為你收集整理的按时间片轮转调度算法(C++实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优先级调度算法(C++实现)
- 下一篇: 利用银行家算法避免死锁(C++实现)