C++實現操作系統調度算法(FSFS,SJF,RR,多級反饋隊列算法)


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;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com