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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

多级队列调度算法可视化界面_C++实现操作系统调度算法(FSFS,SJF,RR,多级反馈队列算法)...

發布時間:2023/12/10 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多级队列调度算法可视化界面_C++实现操作系统调度算法(FSFS,SJF,RR,多级反馈队列算法)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#include

#include

#include

#include

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 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:

queueQueue; //隊列

listPlist; //鏈表

listListQ; //鏈表隊列

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::iterator q=Plist.begin();

for(std::list::iterator p=Plist.begin();p!=Plist.end();++p) //找到最短預計執行時間的進程

{

if(p->needtimeneedtime)

{

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::iterator iter=ListQ.begin();iter!=ListQ.end();)

{

printf("隊列優先級 = %d 隊列時間片 = %d\n",iter->priority,iter->capacity);

while(!iter->qu.empty())

{

list::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->capacity*2;

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::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->prioritypriority) //若當前隊列優先級不是最高優先級

{

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;

}

總結

以上是生活随笔為你收集整理的多级队列调度算法可视化界面_C++实现操作系统调度算法(FSFS,SJF,RR,多级反馈队列算法)...的全部內容,希望文章能夠幫你解決所遇到的問題。

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