多级队列调度算法可视化界面_C++实现操作系统调度算法(FSFS,SJF,RR,多级反馈队列算法)...
#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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从古至今,为何白银相比黄金越来越不值钱?
- 下一篇: Qt: QTableView如何获取(行