1. 程式人生 > >模擬處理機進程調度-簡單循環輪轉調度算法

模擬處理機進程調度-簡單循環輪轉調度算法

using roman empty 對齊 一個 img 等待 控制 nbsp

簡單循環輪轉調度算法原理

CPU空閑時,選取就緒隊列隊首元素,賦予時間片。當該進程時間片用完時,則釋放CPU控制權,進入就緒隊列的隊尾,CPU控制權給下一個處於就緒隊列首元素,原理如下圖。

技術分享圖片

實現流程圖

技術分享圖片

進程調度源代碼

#include "stdafx.h"
#include<queue>
#include<math.h>
#include<vector>
#include<iostream>
#include <iomanip>
using namespace std;

/*進程的數據結構*/
struct PCB
{
    
int ID;//進程ID double in_time;//進程的進入時間 double res_time;//進程的響應時間 double l_time;//進程的剩余時間 }; /*進程調度函數 */ /*輸入:進程隊列prs,時間片timeslice */ /*輸出:進程狀態表 */ void ProcessScheduling(queue<PCB>prs,double timeslice) { cout
<< left; queue<PCB>ex_prs;//就緒隊列,該隊列中的進程是等待執行的 ex_prs.push(prs.front());//第一個進程首先進入就緒隊列 prs.pop();//將第一個進程退出進程隊列 double slice_start;//時間片開始時間 double slice_end = 0;//時間片結束時間 cout << "----------------------------------進程狀態表------------------------------------" << endl; cout
<<setw(15)<<"進程ID" << "|" << setw(15) << "到達時間" << "|" <<setw(15) << "總響應時間" << "|" << setw(15) << "時間片開始時間"<<"|" << setw(15) <<"時間片結束時間"<<"|"<< endl; cout << "--------------------------------------------------------------------------------" << endl; while (!prs.empty()||!ex_prs.empty()) { slice_start = slice_end;//更新時間片開始與結束時間 slice_end += timeslice;//每次增加一個時間片的時間 while (!prs.empty()) //每次執行一個進程前,將能在此進程占用cpu期間進入就緒隊列的進程加入就緒隊列 { if (prs.front().in_time > slice_end)break; ex_prs.push(prs.front()); prs.pop(); if (ex_prs.size() == 1) { slice_start = slice_end; slice_end += timeslice; } } //如果就緒隊列為空則繼續while循環 if (ex_prs.empty())continue; //如果剩余時間小於或等於時間片 if (ex_prs.front().l_time <= timeslice) { ex_prs.front().l_time = 0;//將進程的剩余時間置為0(可有可無) cout << setw(15) << ex_prs.front().ID << "|" << setw(15) << ex_prs.front().in_time << "|" << setw(15) << ex_prs.front().res_time << "|" << setw(15) << slice_start<<"|"<< setw(15) << slice_end<<"|"<< endl; ex_prs.pop(); } else { ex_prs.front().l_time -= timeslice;//將進程的剩余時間減少一個時間片 cout << setw(15) << ex_prs.front().ID << "|" << setw(15) << ex_prs.front().in_time << "|" << setw(15) << ex_prs.front().res_time << "|" << setw(15) << slice_start << "|" << setw(15) << slice_end <<"|"<< endl; //將隊首進程置於隊尾 PCB tmp_pr = ex_prs.front(); ex_prs.pop(); ex_prs.push(tmp_pr); } } cout << "--------------------------------------------------------------------------------" << endl; } int main() { queue<PCB>prs; //總響應時間 double allres_time = 0; //時間片 double timeslice = 0; PCB pr1, pr2, pr3; pr1 = { 1,0,10,10 }; pr2 = { 2,1,5,5 }; pr3 = { 3,2,5,5 }; allres_time += pr1.res_time + pr2.res_time + pr3.res_time; timeslice = allres_time / 3; prs.push(pr1); prs.push(pr2); prs.push(pr3); cout << "時間片為:" << timeslice << endl; ProcessScheduling(prs, timeslice); cout << "添加進程?(y/n):"; char i; cin >> i; while (i-y==0) { PCB pr; cout << "請輸入進程ID:"; cin >> pr.ID; cout << "請輸入進程到達時間:"; cin >> pr.in_time; cout << "請輸入進程響應時間:"; cin >> pr.res_time; cout << "請輸入進程剩余時間:"; cin >> pr.l_time; prs.push(pr); allres_time += pr.res_time; timeslice = allres_time / prs.size(); cout << "時間片為:" << timeslice << endl; ProcessScheduling(prs, timeslice); cout << "繼續添加進程?(y/n):"; cin >> i; } return 0; }

結果截圖

編譯程序

技術分享圖片

運行程序

技術分享圖片

添加一個進程

技術分享圖片

繼續添加一個進程

技術分享圖片

運行環境:Ubuntu

相關問題補充:

①C++輸出一個表格

解決方法:首先用cout<<left設置左對齊,然後用setw()設置之後的文本寬度,如: cout << setw(12) << "Miles" ,設置其後的Miles寬為12個字母。

模擬處理機進程調度-簡單循環輪轉調度算法