C++實現操作系統調度算法(FSFS,SJF,RR,多級反饋隊列算法)
#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->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<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;
}
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
