生活随笔
收集整理的這篇文章主要介紹了
OS轮转调度算法RR的C++实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在分時系統中,最簡單也是較常見的是基于時間片的輪轉(round robin,RR)調度算法。該算法采取了非常公平的處理機分配方式,即讓就緒隊列中的每個進程僅運行一個時間片,如果就緒隊列上有n個進程,則每個進程每次大約可獲得1/n的處理機時間
時間片的大小對系統性能有很大的影響,時間片太小,有利于短作業,但上下文切換頻繁,增加系統開銷;時間片太長,則退化為FCFS算法,無法滿足短作業和交互式用戶的需求。
一個較為可取的時間片大小是略大于一次典型的交互所需要的時間,使大多數交互式進程能在一個時間片內完成,從而可以獲得很小的響應時間。 ——出自《計算機操作系統》,西電出版的那本,但是好像還是沒有說明時間片具體應該怎么取0.0
源代碼如下:
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXSIZE 5
int ID[MAXSIZE], COME_TIME[MAXSIZE], RUN_TIME[MAXSIZE];
struct processing
{int pid; //作業號int sequence; //順序號double come_time; //到達時double run_time; //運行時double last_run_time; //剩余運行時間double over_time; //完成時double round_time; //周轉時double avg_time; //帶權周轉時
}pc[MAXSIZE]; //作業數
queue<processing > q;
bool CmpByComeTime(processing p1, processing p2) {return p1.come_time<p2.come_time;
}
void push_in_queue() { //進程入隊列for (int i = 0; i < MAXSIZE; ++i){q.push(pc[i]);}
}
void info_to_process() {for (int i = 0; i<MAXSIZE; ++i) {pc[i].sequence = i;pc[i].pid = ID[i];pc[i].come_time = COME_TIME[i];pc[i].run_time = RUN_TIME[i];pc[i].last_run_time = pc[i].run_time;}sort(pc, pc + MAXSIZE, CmpByComeTime);push_in_queue();
}
void get_info() { //輸入進程信息for (int i = 0; i<MAXSIZE; i++) {cin >> ID[i] >> COME_TIME[i] >> RUN_TIME[i];}info_to_process();}
void print(double avg_sum_round_time, double avg_sum_avg_time) {cout << "執行順序:" << endl;for (int i = 0; i < MAXSIZE; ++i){/* code */cout << pc[i].pid << " ";}cout << endl;cout << "作業號" << '\t' << "到達時" << '\t' << "運行時" << '\t' << "完成時" << '\t' << "周轉時" << '\t' << "帶權周轉時" << '\t' << endl;for (int i = 0; i < MAXSIZE; ++i){cout << pc[i].pid << '\t' << pc[i].come_time << '\t'<< pc[i].run_time << '\t' << pc[i].over_time << '\t'<< pc[i].round_time << '\t'<< pc[i].avg_time << endl;}cout << "平均周轉時: " << avg_sum_round_time << endl<< "平均帶權周轉時: " << avg_sum_avg_time << endl << endl;
}
void get_RoundAndAvgTime() {double sum_round_time = 0;double avg_sum_round_time = 0.0;double sum_avg_time = 0.0;double avg_sum_avg_time = 0.0;for (int i = 0; i<MAXSIZE; i++) {sum_round_time += pc[i].round_time;sum_avg_time += pc[i].avg_time;}avg_sum_round_time = sum_round_time * 1.0 / MAXSIZE;avg_sum_avg_time = sum_avg_time * 1.0 / MAXSIZE;print(avg_sum_round_time, avg_sum_avg_time);
}
void calculate(int TimePeace) {int NowTime = 0;while (!q.empty()) {int NowPcNum = q.front().sequence;if (TimePeace >= pc[NowPcNum].last_run_time) {pc[NowPcNum].over_time = NowTime + pc[NowPcNum].last_run_time; //完成時間pc[NowPcNum].round_time = pc[NowPcNum].over_time - pc[NowPcNum].come_time; //周轉時 = 完成時 - 到達時pc[NowPcNum].avg_time = pc[NowPcNum].round_time / pc[NowPcNum].run_time; //帶權周轉時 = 周轉時 / 運行時NowTime += pc[NowPcNum].last_run_time;q.pop();}else {pc[NowPcNum].last_run_time -= TimePeace; //該進程剩余需要運行的時間NowTime += TimePeace;q.push(pc[NowPcNum]);q.pop();}}get_RoundAndAvgTime();
}int main(int argc, char const *argv[])
{get_info();int TimePeace;char ch;while (true) {cout << "時間片大小" << endl;cin >> TimePeace;calculate(TimePeace);cout << "continue? [y/n]" << endl;cin >> ch;if (ch == 'y') {info_to_process();continue;}else {break;}}system("pause");return 0;}
運行結果如下:
總結
以上是生活随笔為你收集整理的OS轮转调度算法RR的C++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。