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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统-进程调度(HRRN和RR)

發(fā)布時(shí)間:2023/12/20 windows 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统-进程调度(HRRN和RR) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 進(jìn)程調(diào)度(HRRN和RR)
    • 問題描述
    • 實(shí)驗(yàn)環(huán)境
    • 輸入
    • 輸出
    • 測試數(shù)據(jù)
    • 實(shí)驗(yàn)設(shè)計(jì)
      • 數(shù)據(jù)結(jié)構(gòu)
      • 函數(shù)的功能、參數(shù)和輸出
      • 主要函數(shù)算法設(shè)計(jì)
      • 詳細(xì)設(shè)計(jì)
      • 流程圖
    • 實(shí)驗(yàn)結(jié)果與分析
      • 結(jié)果展示與描述
      • 結(jié)果分析
      • 總結(jié)
    • 源代碼

進(jìn)程調(diào)度(HRRN和RR)

問題描述

設(shè)計(jì)程序模擬進(jìn)程的高響應(yīng)比HRRN和時(shí)間片輪轉(zhuǎn)RR調(diào)度過程。假設(shè)有n個(gè)進(jìn)程分別在T1, … ,Tn時(shí)刻到達(dá)系統(tǒng),它們需要的服務(wù)時(shí)間分別為S1, … ,Sn。如果選擇RR算法,還需要指定時(shí)間片大小q。分別采用高響應(yīng)比HRRN和時(shí)間片RR進(jìn)程調(diào)度算法進(jìn)行調(diào)度,計(jì)算每個(gè)進(jìn)程的完成時(shí)間,周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間,并且統(tǒng)計(jì)n個(gè)進(jìn)程的平均周轉(zhuǎn)時(shí)間、平均帶權(quán)周轉(zhuǎn)時(shí)間和平均等待時(shí)間。最后,對兩個(gè)算法做出比較評價(jià)。

要求采用高響應(yīng)比HRRN和時(shí)間片RR分別調(diào)度進(jìn)程運(yùn)行,計(jì)算每個(gè)進(jìn)程的周轉(zhuǎn)時(shí)間,帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間,并且計(jì)算所有進(jìn)程的平均周轉(zhuǎn)時(shí)間,帶權(quán)平均周轉(zhuǎn)時(shí)間和平均等待時(shí)間。

實(shí)驗(yàn)環(huán)境

  • Windows 11
  • Visual Studio Code
  • gcc version 8.1.0

輸入

進(jìn)程數(shù)n,進(jìn)程編號,以及每個(gè)進(jìn)程的到達(dá)時(shí)間T1, … ,Tn和服務(wù)時(shí)間S1, … ,Sn。在屏幕上要以表的形式顯示輸入的信息。

根據(jù)顯示信息:“1-HRRN,2-RR”,選擇1或者2進(jìn)入對應(yīng)的算法過程。如果選擇2,則需要輸入時(shí)間片大小q。

輸出

  • 要求模擬整個(gè)調(diào)度過程,輸出每個(gè)時(shí)刻的進(jìn)程運(yùn)行狀態(tài)
  • 要求輸出計(jì)算出來的每個(gè)進(jìn)程的周轉(zhuǎn)時(shí)間,帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間
  • 要求輸出所有進(jìn)程的平均周轉(zhuǎn)時(shí)間,帶權(quán)平均周轉(zhuǎn)時(shí)間和平均等待時(shí)間

測試數(shù)據(jù)

Process Num.12345
Arrival Time01234
CPU Burst62598

實(shí)驗(yàn)設(shè)計(jì)

數(shù)據(jù)結(jié)構(gòu)

#define MaxNum 100 // 最大進(jìn)程數(shù) double CurrentTime = 0.0; // 當(dāng)前時(shí)間 double AverageWT_HRRN = 0.0, AverageWT_RR = 0.0; // 平均等待時(shí)間 double AverageTAT_HRRN = 0.0, AverageTAT_RR = 0.0; // 平均周轉(zhuǎn)時(shí)間 double AverageWTAT_HRRN = 0.0, AverageWTAT_RR = 0.0; // 平均帶權(quán)周轉(zhuǎn)時(shí)間 int ProNum = 0; // 進(jìn)程數(shù)量 int DisplayNum = 0; // 輸出進(jìn)程信息數(shù)量 int ProIndex = 0; // 已完成的進(jìn)程數(shù)量 int TimeSlice = 0; // 時(shí)間片// 進(jìn)程結(jié)構(gòu)體 typedef struct PROCESS {int index; // 進(jìn)程序號int RunedTime; // RR算法已服務(wù)的時(shí)間int Signal; // 第一次運(yùn)行標(biāo)志位 0表示該進(jìn)程第一次運(yùn)行 否則為1int ProStatus; // 進(jìn)程狀態(tài) 0表示等待 1表示運(yùn)行 2表示完成double ServiceTime; // 服務(wù)時(shí)間double ArrivalTime; // 到達(dá)時(shí)間double StartTime; // 開始時(shí)間double FinishTime; // 結(jié)束時(shí)間double TurnArroundTime; // 周轉(zhuǎn)時(shí)間double WaitTime; // 等待時(shí)間double ResponseRatio; // 響應(yīng)比double WeightTurnArroundTime; // 帶權(quán)周轉(zhuǎn)時(shí)間 } PRO[MaxNum];

函數(shù)的功能、參數(shù)和輸出

// 輸出各進(jìn)程的到達(dá)時(shí)間和服務(wù)時(shí)間 void display_base(PRO PC, int n)// 輸出每個(gè)時(shí)刻的進(jìn)程運(yùn)行狀態(tài) void display_status(PRO PC, int n)// 輸出各進(jìn)程的周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間 void display_time(PRO PC, int n)// 輸出所有進(jìn)程的的平均周轉(zhuǎn)時(shí)間、帶權(quán)平均周轉(zhuǎn)時(shí)間和平均等待時(shí)間 void display_average()// 按到達(dá)時(shí)間排序 void SortArrival(PRO &PC, int n)// 計(jì)算各項(xiàng)時(shí)間 void CountTime(PRO &PC, int n)// HRRN算法 void HRRN(PRO &PC, int n)// RR輸出函數(shù) void PrintRR(PRO PC)// 改變就緒隊(duì)列的順序 將當(dāng)前進(jìn)程移動(dòng)到隊(duì)尾 void MovePro(PRO &PC, int index)// 刪除已完成的進(jìn)程 void RemovePro(PRO &PC, int index)// 判斷一個(gè)進(jìn)程是否完成并計(jì)算時(shí)間 int IfProEnd(PRO &PC, int index)// 指定時(shí)間片進(jìn)程運(yùn)行 int RunProcess(PRO &PC, int index)// RR算法 void RR(PRO &PC, int n)// 關(guān)于以上函數(shù)的參數(shù),PC均為進(jìn)程的結(jié)構(gòu)體數(shù)組,n均為進(jìn)程的數(shù)量,index為執(zhí)行進(jìn)程的索引

主要函數(shù)算法設(shè)計(jì)

// 按到達(dá)時(shí)間排序 void SortArrival(PRO &PC, int n) {PROCESS temp;for (int i = 0; i < n; i++){int min = i;for (int j = i + 1; j < n; j++)if (PC[j].ArrivalTime < PC[min].ArrivalTime)min = j;temp = PC[i];PC[i] = PC[min];PC[min] = temp;} } // HRRN算法 void HRRN(PRO &PC, int n) {SortArrival(PC, n); // 先按到達(dá)時(shí)間排序// 類比選擇排序的思想 從第二個(gè)到達(dá)的進(jìn)程開始 遍歷當(dāng)前進(jìn)程后面的進(jìn)程 如果有響應(yīng)比比當(dāng)前最短響應(yīng)比更高的 則交換位置int End = PC[0].ArrivalTime + PC[0].ServiceTime; // 之前服務(wù)的結(jié)束時(shí)間int rmax = 1; // 當(dāng)前最高響應(yīng)比的索引PROCESS temp;for (int x = 1; x < n; x++){for (int r = x; r < n; r++){if (PC[r].ArrivalTime <= End)PC[r].ResponseRatio = (End - PC[r].ArrivalTime + PC[r].ServiceTime) / PC[r].ServiceTime;}for (int y = x + 1; y < n; y++){if (PC[y].ArrivalTime <= End && PC[y].ResponseRatio >= PC[rmax].ResponseRatio)rmax = y;}// 將當(dāng)前進(jìn)程與等待隊(duì)列中響應(yīng)比最大的進(jìn)程進(jìn)行交換temp = PC[x];PC[x] = PC[rmax];PC[rmax] = temp;End += PC[x].ServiceTime;rmax = x + 1; // 重置rmax為當(dāng)前等待隊(duì)列中的首位}CountTime(PC, n); // 計(jì)算各項(xiàng)時(shí)間display_status(PC, n); // 模擬整個(gè)調(diào)度過程,輸出每個(gè)時(shí)刻的進(jìn)程運(yùn)行狀態(tài)display_time(PC, n); // 輸出各進(jìn)程的周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間 } // 改變就緒隊(duì)列的順序 將當(dāng)前進(jìn)程移動(dòng)到隊(duì)尾 void MovePro(PRO &PC, int index) {int Num = 0;for(int s = 0;s<ProNum;s++) // 更新等待隊(duì)列的進(jìn)程數(shù)量if(PC[s].ArrivalTime<=CurrentTime)Num++;PROCESS temp = PC[index];for (int i = index; i < Num - 1; i++){PC[i] = PC[i + 1];}PC[Num - 1] = temp; } // 刪除已完成的進(jìn)程 void RemovePro(PRO &PC, int index) {MovePro(PC, index);PC[ProNum - 1].ProStatus = 2;if (ProNum == 1) // 服務(wù)全部結(jié)束{cout << endl<< "Finally Result : " << endl;PrintRR(PC);}ProIndex++;ProNum--; } // 指定時(shí)間片進(jìn)程運(yùn)行 int RunProcess(PRO &PC, int index) {for (int i = 0; i < TimeSlice; i++) // 每個(gè)單位時(shí)間循環(huán)一次{CurrentTime++;if (PC[index].Signal == 0){PC[index].StartTime = CurrentTime - 1;PC[index].Signal = 1;}PC[index].ProStatus = 1;PC[index].RunedTime++;PrintRR(PC); // 每個(gè)單位時(shí)間輸出一次結(jié)果if (IfProEnd(PC, index) == 1)return 0;}MovePro(PC, index);PC[ProNum - 1].ProStatus = 0;return 0; } // RR算法 void RR(PRO &PC, int n) {// 對全局變量進(jìn)行初始化以便實(shí)現(xiàn)循環(huán)多次使用CurrentTime = 0;ProNum = n;ProIndex = 0;TimeSlice = 0;for (int s = 0; s < n; s++) // 標(biāo)志位初始化為0{PC[s].Signal = 0;PC[s].ProStatus = 0;PC[s].RunedTime = 0;}cout << "TimeSlice = ";cin >> TimeSlice;SortArrival(PC, n); // 先按到達(dá)時(shí)間排序cout << endl;while (1){if (CurrentTime >= PC[0].ArrivalTime){RunProcess(PC, 0);}else{MovePro(PC, 0);PC[ProNum - 1].ProStatus = 0;}if (ProIndex == n)break; // 已完成的進(jìn)程數(shù)量等于總數(shù)量 則退出循環(huán)}SortArrival(PC, n); // 按到達(dá)時(shí)間排序 使輸出的結(jié)果更方便觀看for (int i = 0; i < n; i++){PC[i].FinishTime = PC[i].ArrivalTime + PC[i].TurnArroundTime;PC[i].WaitTime = PC[i].TurnArroundTime - PC[i].ServiceTime;}cout << endl<< "Process Num\t"<< "Start Time\t"<< "End Time"<< endl;for (int j = 0; j < n; j++){cout << PC[j].index << "\t\t" << PC[j].StartTime << "\t\t" << PC[j].FinishTime << endl;}display_time(PC, DisplayNum); // 輸出各進(jìn)程的周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間// 計(jì)算平均時(shí)間double sumWT = PC[0].WaitTime, sumTAT = PC[0].TurnArroundTime, sumWTAT = PC[0].WeightTurnArroundTime;for (int m = 1; m < n; m++){sumWT += PC[m].WaitTime;sumTAT += PC[m].TurnArroundTime;sumWTAT += PC[m].WeightTurnArroundTime;}AverageWT_RR = sumWT / n;AverageTAT_RR = sumTAT / n;AverageWTAT_RR = sumWTAT / n; }

詳細(xì)設(shè)計(jì)

  • 變量初始化

  • 接收用戶輸入n,T1, … ,Tn,S1, … ,Sn

  • 循環(huán)等待用戶選擇算法:1-HRRN,2-RR

  • 按照選擇算法進(jìn)行進(jìn)程調(diào)度

  • 計(jì)算進(jìn)程的開始時(shí)間、完成時(shí)間、周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間

  • 計(jì)算所有進(jìn)程的平均周轉(zhuǎn)時(shí)間、平均帶權(quán)周轉(zhuǎn)時(shí)間和平均等待時(shí)間

  • 按格式輸出調(diào)度結(jié)果

流程圖

實(shí)驗(yàn)結(jié)果與分析

結(jié)果展示與描述

中間部分省略…

  • 輸入進(jìn)程數(shù)量和各進(jìn)程的基本信息:到達(dá)時(shí)間和服務(wù)時(shí)間
  • 選擇算法 注:在選擇0之前需要將1和2都選擇過
  • 選擇1 按HRRN算法輸出各進(jìn)程的執(zhí)行順序、開始和完成時(shí)間、等待隊(duì)列、周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間
  • 選擇2 按RR算法輸出各時(shí)刻的進(jìn)程隊(duì)列、開始和完成時(shí)間、周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間
  • 選擇0 輸出本實(shí)驗(yàn)數(shù)據(jù)使用兩種算法得到的不同平均周轉(zhuǎn)時(shí)間、平均帶權(quán)周轉(zhuǎn)時(shí)間和平均等待時(shí)間
  • 實(shí)驗(yàn)結(jié)束

結(jié)果分析

  • HRRN算法通過按響應(yīng)比排序的方式得到服務(wù)順序,計(jì)算時(shí)還需要考慮當(dāng)前進(jìn)程結(jié)束時(shí)下一個(gè)進(jìn)程是否已經(jīng)到達(dá),進(jìn)行條件判斷后代入不同結(jié)果計(jì)算,最終驗(yàn)證與手動(dòng)計(jì)算結(jié)果相同
  • RR算法需要對每個(gè)單位時(shí)間都進(jìn)行計(jì)算,與先來先服務(wù)的方法相似,每個(gè)時(shí)間片后更新等待隊(duì)列,如果當(dāng)前進(jìn)程已完成則將其移出等待隊(duì)列,最終驗(yàn)證與手動(dòng)計(jì)算結(jié)果相同

總結(jié)

  • 本次實(shí)驗(yàn)將較長的的代碼都打包成函數(shù),在主函數(shù)中直接進(jìn)行調(diào)用,并使用函數(shù)嵌套,使代碼簡潔、清晰。
  • 在數(shù)據(jù)結(jié)構(gòu)方面,因?yàn)閷﹃?duì)列的使用還不是很熟悉,所以我在實(shí)現(xiàn)算法的過程中,使用了結(jié)構(gòu)體數(shù)組,考慮到計(jì)算過程會出現(xiàn)整數(shù)與小數(shù)的混合運(yùn)算,我將除進(jìn)程序號外的所有數(shù)據(jù)都設(shè)為double型,便不會在結(jié)果中出現(xiàn)小數(shù)部分被舍棄的問題。
  • 對于HRRN算法的排序,我直接對等待隊(duì)列進(jìn)行排序,避免使用復(fù)雜的算法,使用變量End判定進(jìn)程是否處在等待隊(duì)列,將所有進(jìn)程都排好序之后直接調(diào)用CountTime函數(shù)進(jìn)行計(jì)算,使算法更簡單明了,便于學(xué)習(xí)和理解。
  • 對于RR算法,每個(gè)單位時(shí)間都會進(jìn)行循環(huán),在時(shí)間片結(jié)束后對各進(jìn)程的狀態(tài)以及等待隊(duì)列的進(jìn)程數(shù)量進(jìn)行更新,確保進(jìn)程的執(zhí)行順序不出錯(cuò),因?yàn)榇怂惴ㄝ^為復(fù)雜,部分結(jié)果的輸出便沒有另寫函數(shù),而是直接在算法函數(shù)中實(shí)現(xiàn),避免代碼過于復(fù)雜,且不易出錯(cuò)。
  • 在主函數(shù)中,使用while循環(huán),實(shí)現(xiàn)算法選擇的功能,若選擇0則輸出所有進(jìn)程的平均周轉(zhuǎn)時(shí)間,帶權(quán)平均周轉(zhuǎn)時(shí)間和平均等待時(shí)間并且退出循環(huán)。

源代碼

#include <iostream>#define MaxNum 100 // 最大進(jìn)程數(shù) double CurrentTime = 0.0; // 當(dāng)前時(shí)間 double AverageWT_HRRN = 0.0, AverageWT_RR = 0.0; // 平均等待時(shí)間 double AverageTAT_HRRN = 0.0, AverageTAT_RR = 0.0; // 平均周轉(zhuǎn)時(shí)間 double AverageWTAT_HRRN = 0.0, AverageWTAT_RR = 0.0; // 平均帶權(quán)周轉(zhuǎn)時(shí)間 int ProNum = 0; // 進(jìn)程數(shù)量 int DisplayNum = 0; // 輸出進(jìn)程信息數(shù)量 int ProIndex = 0; // 已完成的進(jìn)程數(shù)量 int TimeSlice = 0; // 時(shí)間片 using namespace std;// 進(jìn)程結(jié)構(gòu)體 typedef struct PROCESS {int index; // 進(jìn)程序號int RunedTime; // RR算法已服務(wù)的時(shí)間int Signal; // 第一次運(yùn)行標(biāo)志位 0表示該進(jìn)程第一次運(yùn)行 否則為1int ProStatus; // 進(jìn)程狀態(tài) 0表示等待 1表示運(yùn)行 2表示完成double ServiceTime; // 服務(wù)時(shí)間double ArrivalTime; // 到達(dá)時(shí)間double StartTime; // 開始時(shí)間double FinishTime; // 結(jié)束時(shí)間double TurnArroundTime; // 周轉(zhuǎn)時(shí)間double WaitTime; // 等待時(shí)間double ResponseRatio; // 響應(yīng)比double WeightTurnArroundTime; // 帶權(quán)周轉(zhuǎn)時(shí)間 } PRO[MaxNum];// 輸出各進(jìn)程的到達(dá)時(shí)間和服務(wù)時(shí)間 void display_base(PRO PC, int n) {cout << endl;cout << "Process Num\t"<< "Arrival Time\t"<< "CPU Burst" << endl;for (int t = 0; t < n; t++)cout << PC[t].index << "\t\t" << PC[t].ArrivalTime << "\t\t" << PC[t].ServiceTime << endl; }// 模擬整個(gè)調(diào)度過程 輸出每個(gè)時(shí)刻的進(jìn)程運(yùn)行狀態(tài) void display_status(PRO PC, int n) {cout << endl;cout << "Process Num\t"<< "Start Time\t"<< "End Time\t"<< "Ready Queue" << endl;for (int t = 0; t < n; t++) // 循環(huán)輸出每個(gè)進(jìn)程的服務(wù)時(shí)間內(nèi) 處在等待隊(duì)列的進(jìn)程 即到達(dá)時(shí)間在當(dāng)前進(jìn)程開始和結(jié)束時(shí)間之間的進(jìn)程{cout << PC[t].index << "\t\t" << PC[t].StartTime << "\t\t" << PC[t].FinishTime << "\t\t";for (int q = t + 1; q < n; q++){if (PC[q].ArrivalTime <= PC[t].FinishTime)cout << PC[q].index << " ";}cout << endl;} }// 輸出各進(jìn)程的周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間 void display_time(PRO PC, int n) {cout << endl;cout << "Process Num\t"<< "Turnaround Time\t"<< "Weighted Turnaround Time\t"<< "Waiting Time" << endl;for (int t = 0; t < n; t++)cout << PC[t].index << "\t\t" << PC[t].TurnArroundTime << "\t\t" << PC[t].WeightTurnArroundTime << "\t\t\t\t" << PC[t].WaitTime << endl; }// 輸出所有進(jìn)程的的平均周轉(zhuǎn)時(shí)間、帶權(quán)平均周轉(zhuǎn)時(shí)間和平均等待時(shí)間 void display_average() {cout << endl;cout << "Algorithm\t"<< "Average TAT\t"<< "Average WTAT\t"<< "Average WT" << endl;cout << "HRRN\t\t" << AverageTAT_HRRN << "\t\t" << AverageWTAT_HRRN << "\t\t" << AverageWT_HRRN << endl;cout << "RR\t\t" << AverageTAT_RR << "\t\t" << AverageWTAT_RR << "\t\t" << AverageWT_RR << endl; }// 按到達(dá)時(shí)間排序 void SortArrival(PRO &PC, int n) {PROCESS temp;for (int i = 0; i < n; i++){int min = i;for (int j = i + 1; j < n; j++)if (PC[j].ArrivalTime < PC[min].ArrivalTime)min = j;temp = PC[i];PC[i] = PC[min];PC[min] = temp;} }// 計(jì)算各項(xiàng)時(shí)間 void CountTime(PRO &PC, int n) {PC[0].StartTime = PC[0].ArrivalTime;PC[0].FinishTime = PC[0].ArrivalTime + PC[0].ServiceTime;PC[0].TurnArroundTime = PC[0].FinishTime - PC[0].ArrivalTime;PC[0].WaitTime = 0;PC[0].WeightTurnArroundTime = PC[0].TurnArroundTime / PC[0].ServiceTime;double sumWT = PC[0].WaitTime, sumTAT = PC[0].TurnArroundTime, sumWTAT = PC[0].WeightTurnArroundTime;for (int m = 1; m < n; m++){if (PC[m].ArrivalTime >= PC[m - 1].FinishTime){PC[m].StartTime = PC[m].ArrivalTime;PC[m].WaitTime = 0;}else{PC[m].StartTime = PC[m - 1].FinishTime;PC[m].WaitTime = PC[m - 1].FinishTime - PC[m].ArrivalTime;}PC[m].FinishTime = PC[m].StartTime + PC[m].ServiceTime;PC[m].TurnArroundTime = PC[m].FinishTime - PC[m].ArrivalTime;PC[m].WeightTurnArroundTime = PC[m].TurnArroundTime / PC[m].ServiceTime;sumWT += PC[m].WaitTime;sumTAT += PC[m].TurnArroundTime;sumWTAT += PC[m].WeightTurnArroundTime;}AverageWT_HRRN = sumWT / n;AverageTAT_HRRN = sumTAT / n;AverageWTAT_HRRN = sumWTAT / n; }// HRRN算法 void HRRN(PRO &PC, int n) {SortArrival(PC, n); // 先按到達(dá)時(shí)間排序// 類比選擇排序的思想 從第二個(gè)到達(dá)的進(jìn)程開始 遍歷當(dāng)前進(jìn)程后面的進(jìn)程 如果有響應(yīng)比比當(dāng)前最短響應(yīng)比更高的 則交換位置int End = PC[0].ArrivalTime + PC[0].ServiceTime; // 之前服務(wù)的結(jié)束時(shí)間int rmax = 1; // 當(dāng)前最高響應(yīng)比的索引PROCESS temp;for (int x = 1; x < n; x++){for (int r = x; r < n; r++){if (PC[r].ArrivalTime <= End)PC[r].ResponseRatio = (End - PC[r].ArrivalTime + PC[r].ServiceTime) / PC[r].ServiceTime;}for (int y = x + 1; y < n; y++){if (PC[y].ArrivalTime <= End && PC[y].ResponseRatio >= PC[rmax].ResponseRatio)rmax = y;}// 將當(dāng)前進(jìn)程與等待隊(duì)列中響應(yīng)比最大的進(jìn)程進(jìn)行交換temp = PC[x];PC[x] = PC[rmax];PC[rmax] = temp;End += PC[x].ServiceTime;rmax = x + 1; // 重置rmax為當(dāng)前等待隊(duì)列中的首位}CountTime(PC, n); // 計(jì)算各項(xiàng)時(shí)間display_status(PC, n); // 模擬整個(gè)調(diào)度過程,輸出每個(gè)時(shí)刻的進(jìn)程運(yùn)行狀態(tài)display_time(PC, n); // 輸出各進(jìn)程的周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間 }// RR輸出函數(shù) void PrintRR(PRO PC) {cout << endl<< "Current Time : " << CurrentTime << endl;cout << "Process Num\t"<< "Start Time\t"<< "Runed Time\t"<< "Process Status" << endl;for (int t = 0; t < DisplayNum; t++) // 循環(huán)輸出每個(gè)進(jìn)程的服務(wù)時(shí)間內(nèi) 處在等待隊(duì)列的進(jìn)程 即到達(dá)時(shí)間在當(dāng)前進(jìn)程開始和結(jié)束時(shí)間之間的進(jìn)程cout << PC[t].index << "\t\t" << PC[t].StartTime << "\t\t" << PC[t].RunedTime << "\t\t" << PC[t].ProStatus << endl; }// 改變就緒隊(duì)列的順序 將當(dāng)前進(jìn)程移動(dòng)到隊(duì)尾 void MovePro(PRO &PC, int index) {int Num = 0;for(int s = 0;s<ProNum;s++) // 更新等待隊(duì)列的進(jìn)程數(shù)量if(PC[s].ArrivalTime<=CurrentTime)Num++;PROCESS temp = PC[index];for (int i = index; i < Num - 1; i++){PC[i] = PC[i + 1];}PC[Num - 1] = temp; }// 刪除已完成的進(jìn)程 void RemovePro(PRO &PC, int index) {MovePro(PC, index);PC[ProNum - 1].ProStatus = 2;if (ProNum == 1) // 服務(wù)全部結(jié)束{cout << endl<< "Finally Result : " << endl;PrintRR(PC);}ProIndex++;ProNum--; }// 判斷一個(gè)進(jìn)程是否完成并計(jì)算時(shí)間 int IfProEnd(PRO &PC, int index) {if (PC[index].ServiceTime == PC[index].RunedTime){PC[index].FinishTime = CurrentTime;PC[index].TurnArroundTime = PC[index].FinishTime - PC[index].ArrivalTime;PC[index].WeightTurnArroundTime = PC[index].TurnArroundTime / PC[index].ServiceTime;RemovePro(PC, index);return 1;}return -1; }// 指定時(shí)間片進(jìn)程運(yùn)行 int RunProcess(PRO &PC, int index) {for (int i = 0; i < TimeSlice; i++) // 每個(gè)單位時(shí)間循環(huán)一次{CurrentTime++;if (PC[index].Signal == 0){PC[index].StartTime = CurrentTime - 1;PC[index].Signal = 1;}PC[index].ProStatus = 1;PC[index].RunedTime++;PrintRR(PC); // 每個(gè)單位時(shí)間輸出一次結(jié)果if (IfProEnd(PC, index) == 1)return 0;}MovePro(PC, index);PC[ProNum - 1].ProStatus = 0;return 0; }// RR算法 void RR(PRO &PC, int n) {// 對全局變量進(jìn)行初始化以便實(shí)現(xiàn)循環(huán)多次使用CurrentTime = 0;ProNum = n;ProIndex = 0;TimeSlice = 0;for (int s = 0; s < n; s++) // 標(biāo)志位初始化為0{PC[s].Signal = 0;PC[s].ProStatus = 0;PC[s].RunedTime = 0;}cout << "TimeSlice = ";cin >> TimeSlice;SortArrival(PC, n); // 先按到達(dá)時(shí)間排序cout << endl;while (1){if (CurrentTime >= PC[0].ArrivalTime){RunProcess(PC, 0);}else{MovePro(PC, 0);PC[ProNum - 1].ProStatus = 0;}if (ProIndex == n)break; // 已完成的進(jìn)程數(shù)量等于總數(shù)量 則退出循環(huán)}SortArrival(PC, n); // 按到達(dá)時(shí)間排序 使輸出的結(jié)果更方便觀看for (int i = 0; i < n; i++){PC[i].FinishTime = PC[i].ArrivalTime + PC[i].TurnArroundTime;PC[i].WaitTime = PC[i].TurnArroundTime - PC[i].ServiceTime;}cout << endl<< "Process Num\t"<< "Start Time\t"<< "End Time"<< endl;for (int j = 0; j < n; j++){cout << PC[j].index << "\t\t" << PC[j].StartTime << "\t\t" << PC[j].FinishTime << endl;}display_time(PC, DisplayNum); // 輸出各進(jìn)程的周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間和等待時(shí)間// 計(jì)算平均時(shí)間double sumWT = PC[0].WaitTime, sumTAT = PC[0].TurnArroundTime, sumWTAT = PC[0].WeightTurnArroundTime;for (int m = 1; m < n; m++){sumWT += PC[m].WaitTime;sumTAT += PC[m].TurnArroundTime;sumWTAT += PC[m].WeightTurnArroundTime;}AverageWT_RR = sumWT / n;AverageTAT_RR = sumTAT / n;AverageWTAT_RR = sumWTAT / n; }int main() {PRO pc;int n;cout << "請輸入進(jìn)程的數(shù)量:";cin >> n;DisplayNum = n;ProNum = n;cout << "請輸入每個(gè)進(jìn)程的到達(dá)時(shí)間和服務(wù)時(shí)間:" << endl;for (int i = 0; i < n; i++){pc[i].index = i + 1;cin >> pc[i].ArrivalTime >> pc[i].ServiceTime;}display_base(pc, n);int choice;cout << endl<< "輸入0-輸出平均時(shí)間并退出程序 輸入1-HRRN 輸入2-RR" << endl<< "請選擇要執(zhí)行的操作:";cin >> choice;while (choice != 0){if (choice == 1)HRRN(pc, n);if (choice == 2)RR(pc, n);cout << endl<< "請輸入接下來要執(zhí)行的操作:";cin >> choice;}display_average();cout << endl;system("pause");return 0; }

總結(jié)

以上是生活随笔為你收集整理的操作系统-进程调度(HRRN和RR)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。