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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

操作系统 : 按优先数调度算法实现处理器调度(C++)

發布時間:2024/4/11 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统 : 按优先数调度算法实现处理器调度(C++) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 實驗原理
    • 算法流程
    • 數據結構
    • PSA算法思路
    • 完整代碼
    • 測試
      • 測試代碼
      • 測試數據
      • 測試結果


實驗原理

(1) 假定系統有五個進程,每一個進程用一個進程控制塊PCB來代表,進程控制塊的格式為:

其中,進程名——作為進程的標識,假設五個進程的進程名分別為P1,P2,P3,P4,P5。
指針——按優先數的大小把五個進程連成隊列,用指針指出下一個進程的進程控制塊的首地址,最后一個進程中的指針為“0”。
要求運行時間——假設進程需要運行的單位時間數。
優先數——賦予進程的優先數,調度時總是選取優先數大的進程先執行。
狀態——可假設有兩種狀態,“就緒”狀態和“結束”狀態。五個進程的初始狀態都為“就緒”,用“R”表示,當一個進程運行結束后,它的狀態為“結束”,用“E”表示。

(2) 在每次運行你所設計的處理器調度程序之前,為每個進程任意確定它的“優先數”和“要求運行時間”。

(3) 為了調度方便,把五個進程按給定的優先數從大到小連成隊列。用一單元指出隊首進程,用指針指出隊列的連接情況。


(4) 處理器調度總是選隊首進程運行。采用動態改變優先數的辦法,進程每運行一次優先數就減“1”。由于本實驗是模擬處理器調度,所以,對被選中的進程并不實際的啟動運行,而是執行:
優先數-1
要求運行時間-1
來模擬進程的一次運行。
提醒注意的是:在實際的系統中,當一個進程被選中運行時,必須恢復進程的現場,讓它占有處理器運行,直到出現等待事件或運行結束。在這里省去了這些工作。

(5) 進程運行一次后,若要求運行時間0,則再將它加入隊列(按優先數大小插入,且置隊首標志);若要求運行時間=0,則把它的狀態修改成“結束”(E),且退出隊列。

(6) 若“就緒”狀態的進程隊列不為空,則重復上面(4)和(5)的步驟,直到所有進程都成為“結束”狀態。

(7) 在所設計的程序中應有顯示或打印語句,能顯示或打印每次被選中進程的進程名以及運行一次后進程隊列的變化。

(8) 為五個進程任意確定一組“優先數”和“要求運行時間”,啟動所設計的處理器調度程序,顯示或打印逐次被選中進程的進程名以及進程控制塊的動態變化過程。


算法流程

首先了解了實驗的原理后,接下來就需要開始規劃流程。


數據結構

下面開始數據結構的選取,因為這里只需要模擬進程的操作,所以只需要用一個PCB類對象就行。
需要具備進程名、運行時間、當前狀態、優先數等屬性,同時還需要開放給外界運行的接口以及判斷是否退出的接口。

class PCB { public:friend class List;friend void PSA(List& q);PCB(std::string processName, size_t time, size_t priority, size_t order): _processName(processName), _time(time), _priority(priority), _status('R'), _order(order){}//運行進程void Run(){std::cout << "---進程" << _processName << "正在運行---" << std::endl;//模擬運行,每運行一次優先數和剩余運行時間減一--_priority;--_time;//運行時間已滿,修改狀態為結束if (!_time){_status = 'E';}std::cout << "進程名: " << _processName << " 優先級: " << _priority << " 剩余運行時間: " << _time << " 狀態: " << _status << std::endl;std::cout << "---進程" << _processName << "運行結束---" << std::endl;std::cout << std::endl;}//判斷當前狀態是否結束bool isEnd() const{return (_status == 'E');}private:std::string _processName; //進程名size_t _time; //運行時間int _priority; //優先數char _status; //狀態size_t _order; //順序 };

同時,我采用C++ STL庫中的鏈表來實現隊列,為其重寫了push函數,讓他能夠按照優先級插入隊列

class List { public:friend void PSA(List& q);void Push(const PCB& data){auto it = _list.begin();while (it != _list.end()){//按照先后順序以及優先級大小插入到合適的位置if (data._priority > it->_priority || ((data._priority == it->_priority) && (data._order < it->_order))){_list.insert(it, data);return;}else{it++;}}//如果比前面的都小就尾插_list.push_back(data); }//輸出表中所有進程信息void Print() const{std::cout << "--------------------------------" << std::endl;for (auto it = _list.begin(); it != _list.end(); it++){std::cout << "進程名: " << it->_processName << " 優先級: " << it->_priority << " 剩余運行時間: " << it->_time << " 狀態: " << it->_status << std::endl;}std::cout << "--------------------------------" << std::endl;std::cout << std::endl;}private:std::list<PCB> _list; };

PSA算法思路

這個算法其實思路非常簡單,每次只需要取出隊首進行調度,如果調度結束后剩余運行時間為0則說明該進程運行結束,永久出隊,如果不為0則說明還沒運行完成,再次按優先級插入隊列中即可,因為上面重寫了Push函數,所以直接Push回去即可。如果隊列為空,則說明所有的進程調度完畢。

void PSA(List& q) {while (!q._list.empty()){//取出隊首運行auto cur = q._list.front();cur.Run();q._list.pop_front();//如果還沒運行完則重新放入表中if (!cur.isEnd()){q.Push(cur);}else{std::cout << "進程" << cur._processName << "運行結束, 退出" << std::endl;}q.Print();}std::cout << "************調度結束************" << std::endl; }

完整代碼

#pragma #include <string> #include <iostream> #include <list> class List; class PCB { public:friend class List;friend void PSA(List& q);PCB(std::string processName, size_t time, size_t priority, size_t order): _processName(processName), _time(time), _priority(priority), _status('R'), _order(order){}//運行進程void Run(){std::cout << "---進程" << _processName << "正在運行---" << std::endl;--_priority;--_time;if (!_time){_status = 'E';}std::cout << "進程名: " << _processName << " 優先級: " << _priority << " 剩余運行時間: " << _time << " 狀態: " << _status << std::endl;std::cout << "---進程" << _processName << "運行結束---" << std::endl;std::cout << std::endl;}//判斷當前狀態是否結束bool isEnd() const{return (_status == 'E');}private:std::string _processName; //進程名size_t _time; //運行時間int _priority; //優先數char _status; //狀態size_t _order; //順序 };class List { public:friend void PSA(List& q);void Push(const PCB& data){auto it = _list.begin();while (it != _list.end()){//按照先后順序以及優先級大小插入到合適的位置if (data._priority > it->_priority || ((data._priority == it->_priority) && (data._order < it->_order))){_list.insert(it, data);return;}else{it++;}}//如果比前面的都小就尾插_list.push_back(data); }//輸出表中所有進程信息void Print() const{std::cout << "--------------------------------" << std::endl;for (auto it = _list.begin(); it != _list.end(); it++){std::cout << "進程名: " << it->_processName << " 優先級: " << it->_priority << " 剩余運行時間: " << it->_time << " 狀態: " << it->_status << std::endl;}std::cout << "--------------------------------" << std::endl;std::cout << std::endl;}private:std::list<PCB> _list; };void PSA(List& q) {while (!q._list.empty()){//取出隊首運行auto cur = q._list.front();cur.Run();q._list.pop_front();//如果還沒運行完則重新放入表中if (!cur.isEnd()){q.Push(cur);}else{std::cout << "進程" << cur._processName << "運行結束, 退出" << std::endl;}q.Print();}std::cout << "************調度結束************" << std::endl; }

測試

測試代碼

#include"PSA.hpp" #include<vector> using namespace std;void test() {List List;size_t pcbNum;cout << "請輸入進程的數量:" << endl;cin >> pcbNum;vector<string> processName(pcbNum);vector<size_t> time(pcbNum);vector<int> priority(pcbNum);cout << "請輸入所有進程的名字:" << endl;for (size_t i = 0; i < pcbNum; i++){cin >> processName[i];}for (size_t i = 0; i < pcbNum; i++){cout << "請輸入進程" << processName[i] << "的運行時間" << endl;cin >> time[i];cout << "請輸入進程" << processName[i] << "的優先級" << endl;cin >> priority[i];PCB p(processName[i], time[i], priority[i], i);List.Push(p);}List.Print();PSA(List); }int main() {test(); }

測試數據


這里直接用實驗要求中的數據,五個進程,P1、P2、P3、P4、P5。
P1的要求運行時間為2,優先數為1。
P2的要求運行時間為3,優先數為5。
P3的要求運行時間為1,優先數為3。
P4的要求運行時間為2,優先數為4。
P5的要求運行時間為4,優先數為2。

測試結果



總結

以上是生活随笔為你收集整理的操作系统 : 按优先数调度算法实现处理器调度(C++)的全部內容,希望文章能夠幫你解決所遇到的問題。

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