C++實現操作系統調度算法(FSFS,SJF,RR,多級反饋隊列算法)

jopen 9年前發布 | 2K 次閱讀 C/C++

#include<iostream>

include<queue>

include<list>

include<windows.h>

using namespace std;

unsigned int q_id=0; //用于隊列進程號的全局變量 unsigned int l_id=0; //用于鏈表進程號的全局變量 unsigned int stime=0; //系統時間,開始為0

struct Pro //調度進程的數據結構 { unsigned int PID; //進程標志號 unsigned int starttime; // 開始執行時間 unsigned int endtime; //結束時間 unsigned int needtime; // 預計執行時間 unsigned int runtime; //已經運行時間 unsigned int count; //計數器 };

struct node { queue<Pro> qu; //隊列 unsigned int priority; //隊列優先級,當前進程在處于哪個優先級 unsigned int capacity; //時間片 };

class diaodu //調度類 { public: diaodu() { capacity=30; //初始化時間片為30 } void create_q_pro(); //創建進程queue的函數 void create_l_pro(); //創建進程list的函數 void create_node(); //創建node隊列 void Fcfs(); //先來先服務調度算法 void Sjf(); //短作業優先調度算法 void RR(); //時間片輪轉算法 void Djfkdl(); //多級反饋隊列算法

private: queue<Pro>Queue; //隊列 list<Pro>Plist; //鏈表 list<node>ListQ; //鏈表隊列 unsigned int capacity; //時間片 };

void diaodu::create_q_pro() { Pro item; item.PID=++q_id; item.count=0; item.needtime=rand()%100+10; item.runtime=0; Queue.push(item); printf("創建進程 PID= %d: 執行所需時間 = %d\n",item.PID,item.needtime); }

void diaodu::create_l_pro() { Pro item; item.PID=++l_id; item.count=0; item.needtime=rand()%200+10; item.runtime=0; Plist.push_back(item); printf("創建進程 PID = %d: 執行所需時間 = %d\n",item.PID,item.needtime); }

void diaodu::create_node() { node nod; int i; nod.priority=1; //初始隊列最高優先級1 nod.capacity=20; //初始時間片20 for(i=0;i<10;++i) //創建一個node類型,并放入ListQ內 { Pro item; item.PID=++q_id; item.count=0; item.needtime=rand()%100+10; item.runtime=0; nod.qu.push(item); printf("創建進程 PID= %d: 執行所需時間 = %d\n",item.PID,item.needtime); printf("\n"); } ListQ.push_back(nod); }

void diaodu::Fcfs()
{ int i,rd; printf("-------先來先服務調度算法-------\n"); for(i=0;i<10;i++) { create_q_pro(); printf("\n"); } while(!Queue.empty()) { Pro *p=&Queue.front(); p->starttime=stime; printf("進程PID=%d: 執行所需時間%d 開始執行時間%d ",p->PID,p->needtime,p->starttime); Sleep(p->needtime); p->endtime=stime+p->needtime; printf("結束時間%d\n",p->endtime); printf("\n"); Queue.pop(); stime=p->endtime;

rd=rand()%10; if(rd>6) { create_q_pro(); printf("\n"); } } }

void diaodu::Sjf() { int i,rd; printf("-------短作業優先調度算法-------\n"); stime=0; for(i=0;i<10;i++) { create_l_pro(); printf("\n"); } while(!Plist.empty()) { std::list<Pro>::iterator q=Plist.begin(); for(std::list<Pro>::iterator p=Plist.begin();p!=Plist.end();++p) //找到最短預計執行時間的進程 { if(p->needtime<q->needtime) { q=p; } } q->starttime=stime; printf("進程PID=%d: 執行所需時間%d 開始執行時間%d ",q->PID,q->needtime,q->starttime);

 Sleep(q->needtime);
 q->endtime=stime+q->needtime;
 printf("結束時間%d\n",q->endtime);

printf("\n"); stime=q->endtime; Plist.erase(q); //擦除進程 rd=rand()%10; if(rd>6) { create_l_pro(); printf("\n"); } } }

void diaodu::RR() { int i,rd; stime=0; printf("-------時間片輪轉法(時間片 = %d)-------\n",capacity); for(i=0;i<10;i++) { create_q_pro(); printf("\n"); } while(!Queue.empty()) { Pro *p=&Queue.front(); p->starttime=stime; printf("進程PID=%d: 執行還需時間%d 開始執行時間%d ",p->PID,p->needtime,p->starttime); if(p->needtime>capacity) { Sleep(capacity); p->needtime-=capacity; p->runtime+=capacity; stime+=capacity; ++(p->count); printf("第 %d 次執行,已執行時間 = %d\n",p->count,p->runtime); Queue.push(Queue.front()); Queue.pop(); } else { Sleep(p->needtime); stime+=p->needtime; p->endtime=stime; p->runtime+=p->needtime; ++(p->count); printf("第 %d 次執行,已執行時間 = %d 結束時間 = %d 執行完畢\n",p->count,p->runtime,p->endtime); p->needtime=0; Queue.pop(); } printf("\n"); rd=rand()%10; if(rd>6) { create_q_pro(); printf("\n"); } } }

void diaodu::Djfkdl() { int rd,flag=0; //flag標志是否有新進程進入初級隊列 stime=0; printf("-------多級反饋隊列調度-------\n\n",capacity); create_node(); for(list<node>::iterator iter=ListQ.begin();iter!=ListQ.end();) { printf("隊列優先級 = %d 隊列時間片 = %d\n",iter->priority,iter->capacity); while(!iter->qu.empty()) { list<node>::iterator iter1=iter; Pro p=&iter->qu.front(); p->starttime=stime; printf("進程PID=%d: 執行還需時間%d 開始執行時間%d ",p->PID,p->needtime,p->starttime); if(p->needtime>iter->capacity) { Sleep(iter->capacity); p->needtime-=iter->capacity; p->runtime+=iter->capacity; stime+=iter->capacity; ++(p->count); printf("第 %d 次執行,已執行時間 = %d\n",p->count,p->runtime); if(++iter1==ListQ.end()) //如果沒有下一隊列,則創建下一隊列 { node nod; nod.qu.push(iter->qu.front()); nod.priority=iter->priority+1; nod.capacity=iter->capacity2; ListQ.push_back(nod); } else //有下一隊列,把當前進程放到下一隊列隊尾 { iter1->qu.push(iter->qu.front()); }

iter->qu.pop();

} else { Sleep(p->needtime); stime+=p->needtime; p->endtime=stime; p->runtime+=p->needtime; ++(p->count); printf("第 %d 次執行,已執行時間 = %d 結束時間 = %d 執行完畢\n",p->count,p->runtime,p->endtime); p->needtime=0; iter->qu.pop(); } printf("\n"); rd=rand()%10; if(rd>7) //有新進程進入高優先級隊列 { list<node>::iterator iter2=ListQ.begin(); Pro item; item.PID=++q_id; item.count=0; item.needtime=rand()%100+10; item.runtime=0; iter2->qu.push(item); printf("創建進程 PID= %d: 執行所需時間 = %d\n",item.PID,item.needtime); printf("\n"); if(iter2->priority<iter->priority) //若當前隊列優先級不是最高優先級 { flag=1; break; } } } if(flag==1) { iter=ListQ.begin(); } else { ++iter; } flag=0; } }

int main() { diaodu schedul; schedul.Fcfs(); //先來先服務 printf("\n\n\n"); Sleep(1000); schedul.Sjf(); //短作業優先 Sleep(1000); schedul.RR(); //時間片輪轉
Sleep(1000);*/ schedul.Djfkdl(); //多級反饋隊列 return 0; }</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!