多级队列调度算法
目錄
- 1.題目
- 2.程序設計
- 3.測試結果
- 4.源碼
1.題目
多級隊列調度算法
設RQ(就緒隊列)分為RQ1和RQ2,RQ1采用輪轉法,時間q=7.RQ1>RQ2,RQ2采用短進程優先調度算法。測試數據如下:RQ1: P1-P5, RQ2: P6-P10
進程 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10
運行時間 16 11 14 13 15 21 18 10 7 14
已等待時間 6 5 4 3 2 1 2 3 4 5
實現描述:
2.程序設計
- 首先在頭文件里面包含list.h,使得程序可以使用鏈表的各個操作函數。然后就是設立一個進程信息結構體,其中包括進程名字、須運行時間、開始運行時間等進程信息,接著就是利用list RQ1和list RQ2聲明兩個就緒隊列RQ1和RQ2,并設置系統時間和輪轉法的時間片。接著就是RQ1和RQ2的初始化,由于兩者基本一樣,所以只介紹RQ1的:首先初始化已知的進程信息,然后利用for循環以及RQ1.push_back(project1)依次將所有屬于該隊列的進程信息輸入至鏈表,并cout部分進程信息。
- 然后就是輪轉法的定義:首先調用函數CreateRQ1()創建隊列,初始化時鐘之后當RQ1不空時,PCB* p=&RQ1.front();//指向第一個元素,先輸出進程部分信息,當進程執行時間大于時間片時,調整系統時間、程序還需時間、程序已執行時間以及執行次數,而執行次數主要目的是用來設立進程最初開始執行時間(p->count)++;if (p->count == 1){p->first_starttime = p->starttime;},然后再輸出執行次數以及已執行時間,由于該進程還未執行完成,所以利用RQ1.push_back(RQ1.front());RQ1.pop_front()首先將其插入至隊列尾部,然后再刪除頭結點;若進程所需時間小與等于時間片,則進行各個進程信息的更新之后直接利用RQ1.pop_front();//刪除頭結點,至此,輪轉法算法結束。
- 接下來就是短進程優先算法:同樣的先創建隊列,當!RQ2.empty()時,std::
list::iterator q=RQ2.begin();//迭代器iterator提供一種訪問對象容器中的元素,返回第一個元素的迭代器,然后利用循環for (std::list::iterator p = RQ2.begin();p != RQ2.end();++p) 找到最短預計執行時間的進程,找到之后再對進程的部分信息更新,然后由于該進程已執行完,所以直接利用RQ2.erase(q)從隊列刪除結點q,短進程優先算法結束。 - 程序最后在main函數里面直接依次調用RR();//輪轉法、SPPSM();//短進程優先調度法即可,整個程序結束。
3.測試結果
4.源碼
/*操作系統實驗一 多級隊列調度算法 設RQ(就緒隊列)分為Q1 > RQ2,RQ2采用短進程優先調度算法。 測試數據如下:RQRQ1和RQ2,RQ1采用輪轉法,時間q = 7. R1: P1 - P5, RQ2 : P6 - P10 進程 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 運行時間 16 11 14 13 15 21 18 10 7 14 已等待時間 6 5 4 3 2 1 2 3 4 5 */#include<iostream> #include<list>//包含雙向鏈表的各個操作函數 using namespace std;struct PCB//進程信息 {int name; //進程名字int needtime; //須運行時間int starttime; //開始運行時間int endtime; //結束時間int first_starttime;//第一次開始運行時間(用來計算周轉時間)int runtime; //已經運行時間int waittime; //已等待時間int count; //運行次數 };list<PCB> RQ1; list<PCB> RQ2; int clock; //系統時間 int capacity = 7;//時間片void CreateRQ1()//創建隊列RQ1(以隊列為結構創建) {int name1[5] = { 1,2,3,4,5 };int needtime1[5] = { 16,11,14,13,15 };int waittime1[5] = { 6,5,4,3,2 };for (int i = 0;i < 5;i++){PCB project1;project1.name = name1[i];project1.waittime = waittime1[i];project1.needtime = needtime1[i];project1.runtime = 0;project1.count = 0;project1.endtime = 0;project1.first_starttime = 0;project1.starttime = 0;RQ1.push_back(project1);//放進鏈表cout << "創建進程 : p"<<project1.name<<"\t"<<"執行所需時間 : "<<project1.needtime<<endl;} }void CreateRQ2()//創建隊列RQ2(以鏈表為結構創建) {int name2[5] = { 6,7,8,9,10 };int needtime2[5] = { 21,18,10,7,14 };int waittime2[5] = { 1,2,3,4,5 };for (int i = 0;i < 5;i++){PCB project2;project2.name = name2[i];project2.waittime = waittime2[i];project2.needtime = needtime2[i];project2.runtime = 0;project2.count = 0;project2.endtime = 0;project2.first_starttime = 0;project2.starttime = 0;RQ2.push_back(project2);cout << "創建進程 : p" << project2.name << "\t" << "執行所需時間 : " << project2.needtime << endl;} }void RR()//輪轉法(round-robin) {cout << "***********輪轉法***********"<<endl;CreateRQ1();clock = 0;while (!RQ1.empty()){PCB* p = &RQ1.front();//指向第一個元素p->starttime = clock;cout << "進程 : p" << p->name << "\t" << "執行還需時間 : "<< p->needtime << "\t" << "開始執行時間 : " << p->starttime <<"\t";if (p->needtime > capacity){clock += capacity;p->needtime -= capacity;p->runtime += capacity;(p->count)++;if (p->count == 1){p->first_starttime = p->starttime;}cout << "執行次數 :" << p->count << "\t" << "已執行時間 : " << p->runtime << endl;RQ1.push_back(RQ1.front());//首先插入頭結點到尾部RQ1.pop_front(); //然后把頭結點刪除}else{p->runtime += p->needtime;clock += p->needtime;p->endtime = clock;(p->count)++;cout << "執行次數 : " << p->count << "\t" << "已執行時間 : " << p->runtime<< "\t" << "結束時間 : " << p->endtime <<"\t"<< "周轉時間 : " << p->endtime - p->first_starttime <<"\t"<< "執行完畢" <<endl;p->needtime = 0;RQ1.pop_front();//刪除頭結點}}cout << endl; }void SPPSM()//短進程優先調度法(short process priority scheduling method) {cout << "*******短進程優先調度法*******"<<endl;CreateRQ2();clock = 0;while (!RQ2.empty()){std::list<PCB>::iterator q = RQ2.begin();//迭代器iterator提供一種訪問對象容器中的元素,返回第一個元素的迭代器for (std::list<PCB>::iterator p = RQ2.begin();p != RQ2.end();++p){ //找到最短預計執行時間的進程if (p->needtime < q->needtime){q = p;}}q->starttime = clock;q->endtime = clock + q->needtime;clock = q->endtime;cout<< "進程 : p" << q->name << "\t" << "執行所需時間 : " << q->needtime << "\t"<< "開始執行時間 : " << q->starttime << "\t" << "結束時間 : " << q->endtime <<"\t"<<"周轉時間 : "<< q->endtime - q->starttime<<endl;RQ2.erase(q);//刪除節點q} }int main(void) {RR();//輪轉法SPPSM();//短進程優先調度法return 0; }總結
- 上一篇: 数字孪生开发公司 数字孪生开发团队 智慧
- 下一篇: 网易权力与纷争手游今日上线,权力与纷争安