日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

OS轮转调度算法RR的C++实现

發布時間:2023/12/20 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。