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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

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

#include

#include

#include

#include

using namespace std;

unsigned int q_id=0; //用于隊(duì)列進(jìn)程號(hào)的全局變量

unsigned int l_id=0; //用于鏈表進(jìn)程號(hào)的全局變量

unsigned int stime=0; //系統(tǒng)時(shí)間,開始為0

struct Pro //調(diào)度進(jìn)程的數(shù)據(jù)結(jié)構(gòu)

{

unsigned int PID; //進(jìn)程標(biāo)志號(hào)

unsigned int starttime; // 開始執(zhí)行時(shí)間

unsigned int endtime; //結(jié)束時(shí)間

unsigned int needtime; // 預(yù)計(jì)執(zhí)行時(shí)間

unsigned int runtime; //已經(jīng)運(yùn)行時(shí)間

unsigned int count; //計(jì)數(shù)器

};

struct node

{

queue qu; //隊(duì)列

unsigned int priority; //隊(duì)列優(yōu)先級(jí),當(dāng)前進(jìn)程在處于哪個(gè)優(yōu)先級(jí)

unsigned int capacity; //時(shí)間片

};

class diaodu //調(diào)度類

{

public:

diaodu()

{

capacity=30; //初始化時(shí)間片為30

}

void create_q_pro(); //創(chuàng)建進(jìn)程queue的函數(shù)

void create_l_pro(); //創(chuàng)建進(jìn)程list的函數(shù)

void create_node(); //創(chuàng)建node隊(duì)列

void Fcfs(); //先來先服務(wù)調(diào)度算法

void Sjf(); //短作業(yè)優(yōu)先調(diào)度算法

void RR(); //時(shí)間片輪轉(zhuǎn)算法

void Djfkdl(); //多級(jí)反饋隊(duì)列算法

private:

queueQueue; //隊(duì)列

listPlist; //鏈表

listListQ; //鏈表隊(duì)列

unsigned int capacity; //時(shí)間片

};

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("創(chuàng)建進(jìn)程 PID= %d: 執(zhí)行所需時(shí)間 = %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("創(chuàng)建進(jìn)程 PID = %d: 執(zhí)行所需時(shí)間 = %d\n",item.PID,item.needtime);

}

void diaodu::create_node()

{

node nod;

int i;

nod.priority=1; //初始隊(duì)列最高優(yōu)先級(jí)1

nod.capacity=20; //初始時(shí)間片20

for(i=0;i<10;++i) //創(chuàng)建一個(gè)node類型,并放入ListQ內(nèi)

{

Pro item;

item.PID=++q_id;

item.count=0;

item.needtime=rand()%100+10;

item.runtime=0;

nod.qu.push(item);

printf("創(chuàng)建進(jìn)程 PID= %d: 執(zhí)行所需時(shí)間 = %d\n",item.PID,item.needtime);

printf("\n");

}

ListQ.push_back(nod);

}

void diaodu::Fcfs()

{

int i,rd;

printf("-------先來先服務(wù)調(diào)度算法-------\n");

for(i=0;i<10;i++)

{

create_q_pro();

printf("\n");

}

while(!Queue.empty())

{

Pro *p=&Queue.front();

p->starttime=stime;

printf("進(jìn)程PID=%d: 執(zhí)行所需時(shí)間%d 開始執(zhí)行時(shí)間%d ",p->PID,p->needtime,p->starttime);

Sleep(p->needtime);

p->endtime=stime+p->needtime;

printf("結(jié)束時(shí)間%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("-------短作業(yè)優(yōu)先調(diào)度算法-------\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) //找到最短預(yù)計(jì)執(zhí)行時(shí)間的進(jìn)程

{

if(p->needtimeneedtime)

{

q=p;

}

}

q->starttime=stime;

printf("進(jìn)程PID=%d: 執(zhí)行所需時(shí)間%d 開始執(zhí)行時(shí)間%d ",q->PID,q->needtime,q->starttime);

Sleep(q->needtime);

q->endtime=stime+q->needtime;

printf("結(jié)束時(shí)間%d\n",q->endtime);

printf("\n");

stime=q->endtime;

Plist.erase(q); //擦除進(jìn)程

rd=rand()%10;

if(rd>6)

{

create_l_pro();

printf("\n");

}

}

}

void diaodu::RR()

{

int i,rd;

stime=0;

printf("-------時(shí)間片輪轉(zhuǎn)法(時(shí)間片 = %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("進(jìn)程PID=%d: 執(zhí)行還需時(shí)間%d 開始執(zhí)行時(shí)間%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 次執(zhí)行,已執(zhí)行時(shí)間 = %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 次執(zhí)行,已執(zhí)行時(shí)間 = %d 結(jié)束時(shí)間 = %d 執(zhí)行完畢\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標(biāo)志是否有新進(jìn)程進(jìn)入初級(jí)隊(duì)列

stime=0;

printf("-------多級(jí)反饋隊(duì)列調(diào)度-------\n\n",capacity);

create_node();

for(list::iterator iter=ListQ.begin();iter!=ListQ.end();)

{

printf("隊(duì)列優(yōu)先級(jí) = %d 隊(duì)列時(shí)間片 = %d\n",iter->priority,iter->capacity);

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

{

list::iterator iter1=iter;

Pro *p=&iter->qu.front();

p->starttime=stime;

printf("進(jìn)程PID=%d: 執(zhí)行還需時(shí)間%d 開始執(zhí)行時(shí)間%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 次執(zhí)行,已執(zhí)行時(shí)間 = %d\n",p->count,p->runtime);

if(++iter1==ListQ.end()) //如果沒有下一隊(duì)列,則創(chuàng)建下一隊(duì)列

{

node nod;

nod.qu.push(iter->qu.front());

nod.priority=iter->priority+1;

nod.capacity=iter->capacity*2;

ListQ.push_back(nod);

}

else //有下一隊(duì)列,把當(dāng)前進(jìn)程放到下一隊(duì)列隊(duì)尾

{

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 次執(zhí)行,已執(zhí)行時(shí)間 = %d 結(jié)束時(shí)間 = %d 執(zhí)行完畢\n",p->count,p->runtime,p->endtime);

p->needtime=0;

iter->qu.pop();

}

printf("\n");

rd=rand()%10;

if(rd>7) //有新進(jìn)程進(jìn)入高優(yōu)先級(jí)隊(duì)列

{

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("創(chuàng)建進(jìn)程 PID= %d: 執(zhí)行所需時(shí)間 = %d\n",item.PID,item.needtime);

printf("\n");

if(iter2->prioritypriority) //若當(dāng)前隊(duì)列優(yōu)先級(jí)不是最高優(yōu)先級(jí)

{

flag=1;

break;

}

}

}

if(flag==1)

{

iter=ListQ.begin();

}

else

{

++iter;

}

flag=0;

}

}

int main()

{

diaodu schedul;

schedul.Fcfs(); //先來先服務(wù)

printf("\n\n\n");

Sleep(1000);

schedul.Sjf(); //短作業(yè)優(yōu)先

Sleep(1000);

schedul.RR(); //時(shí)間片輪轉(zhuǎn)

Sleep(1000);*/

schedul.Djfkdl(); //多級(jí)反饋隊(duì)列

return 0;

}

總結(jié)

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

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