C++实现操作系统调度算法(FSFS,SJF,RR,多级反馈队列算法)

来源:互联网 发布:java快速排序方法 编辑:程序博客网 时间:2024/06/10 15:19

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;         //系统时间,开始为0struct 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;}
0 0
原创粉丝点击