程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 進程調度模擬程序

進程調度模擬程序

編輯:更多關於編程

     我們課程設計,我選擇了一個進程調度模擬,希望大家給看看,多提意見,好久沒來發帖子了。

      #include<iostream.h>

      #include<stdlib.h>

      #include<time.h>

      #include<stdio.h>

      #include<string.h> const int MAXCOMMANDLEN =50; /////////////////////////////////////////////////////////////////////////////////////

      //

      // PROCESS

      //

      /////////////////////////////////////////////////////////////////////////////////////

      class Process //進程類

      {

      friend class CPU;

      protected:

      static int init_ID; //隨機進程ID

      int ID; //進程ID

      char runText[MAXCOMMANDLEN]; //進程指令數組

      int IP; //進程指令指針,保存進程指令執行到的具體位置

      bool ISuseSource; //此進程是否使用資源,ture:使用中 false : 未使用

      bool ISblocked; //此進程是否被阻塞 ture:阻塞 false :未阻塞

      int unitTime; //進程單位被cpu執行時間, 默認 1

      int blockTime; //進程被阻塞時間

      public:

      static void RandID(); //隨機生成進程ID

      Process();

      int getID();

      int getIP();

      void setIP(int);

      void Runed(); //進程被cpu執行

      int getUnittime(); //得到進程單位執行時間

      int getBlcoktime(); //得到進程阻塞時間

      void setBlocktime(int); //設置進程阻塞時間

      void setUnittime(int); //設置進程單位執行時間

      char getResult(int); //得到進程執行結果

      char* getRuntext(); //得到進程執行的指令

      void setBlockstate(bool); //設置阻塞狀態

      bool getBlockstate();

      bool getISusesource(); //得到資源的狀態 使用 未使用

      void setISusesource(bool); //設置資源的使用狀態

      }; int Process::init_ID; void Process::RandID()

      {

      srand( (unsigned)time( NULL ) );

      init_ID=rand();

      }

      Process::Process()

      {

      ID=init_ID++;

      int commandLen;

      IP=0; cout<<"Please in put the text which process runed by CPU [#command#] :> ";

      cin>>runText;

      if( (commandLen=strlen(runText) ) > MAXCOMMANDLEN )

      exit(0);

      runText[commandLen]='#'; // 指令結束標志 '#'

      runText[commandLen+1]='';

      ISuseSource=false;

      ISblocked=false;

      unitTime=1;

      blockTime=0;

      }

      void Process::Runed()

      int Process::getID()

      {

      return ID;

      } int Process::getIP()

      {

      return IP;

      } void Process::setIP(int ip)

      bool Process::getISusesource()

      {

      return ISuseSource;

      } void Process::setISusesource(bool s)

      char* Process::getRuntext()

      {

      return runText;

      } int Process::getUnittime()

      {

      return unitTime;

      }

      int Process::getBlcoktime()

      {

      return blockTime;

      } void Process::setBlocktime(int BT)

      void Process::setUnittime(int UT)

      void Process::setBlockstate(bool state)

      bool Process::getBlockstate()

      {

      return ISblocked;

      } char Process::getResult(int k)

      {

      return runText[k];

      } /////////////////////////////////////////////////////////////////////////////////////

      //

      // SOURCE

      //

      ///////////////////////////////////////////////////////////////////////////////////// class Source //資源類

      {

      protected:

      int ID; //資源 ID

      bool state; //資源狀態 true : 未被進程占有 false : 已被占有

      int pro_ID; //使用資源的進程id

      Process *pro; //使用資源的進程指針

      int time; //進程使用資源的時間

      public:

      Source(int);

      bool getState(); //得到進程狀態

      void setState(bool); //設置進程狀態

      void setTime(int); //設置進程使用資源的時間

      void setPro(Process *); //設置使用該資源的進程

      int getID(); //得到資源id

      int getPorID(); //得到使用資源的進程id

      void setProID(int); //設置使用資源的進程id

      void runned(); //資源被cpu調用

      }; Source::Source(int id)

      void Source::setProID(int id)

      void Source::setTime(int t)

      void Source::setState(bool s)

      bool Source::getState()

      {

      return state;

      } void Source::setPro(Process *p)

      void Source::runned()

      {

      if(time>0)

      {

      cout<<"( Source :"<<ID<<")";

      time--;

      }

      if(time<=0) //進程使用完資源釋放資源,使用資源的時間到

      {

      pro->setISusesource(false);

      int ip=pro->getIP();

      pro->setIP(++ip);

      Source::setState(true);

      cout<<endl<<"The process "<<pro->getID()<<" relase the source!"<<endl;

      pro=NULL;

      }

      } /////////////////////////////////////////////////////////////////////////////////////

      //

      // CPU

      //

      ///////////////////////////////////////////////////////////////////////////////////// typedef strUCt Block //阻塞隊列結構

      {

      Process *p_BlockProcess; //被阻塞的進程隊列

      int index; //被阻塞的進程在就緒隊列中的索引(位置)

      }Block; class CPU

      {

      protected:

      Process *p_Process; //進程隊列

      Process **pp_Process; //進程就緒隊列

      Block *blockQueue ; //進程阻塞隊列

      Source *p_Source; //資源指針

      int numOfprocess; //進程數量

      int numOfblock; //被阻塞的進程數

      int PC; //程序計數器

      int allTime; //cpu運行的總時間

      public :

      CPU(int);

      void Run(); //cpu運行進程

      bool _IC(Process&); //虛擬IC,進行進程指令翻譯

      void useSource(Process&); //進程申請資源

      void blockProcess(Process&); //阻塞進程

      void releaseBlockPro(); //釋放阻塞進程

      int getAlltime(); //得到進程運行的總時間

      void displayPro(); //顯示進程的基本信息,id,指令,運行時間等

      void blockTimeADD(); //阻塞時間加1

      }; CPU::CPU(int num)

      {

      p_Source=new Source(379857);

      numOfprocess=num;

      numOfblock=0;

      allTime=0;

      p_Process=new Process[numOfprocess];

      pp_Process=new Process*[numOfprocess];

      blockQueue=new Block[numOfprocess];

      for(int i=0;i<numOfprocess;i++)

      } int CPU::getAlltime()

      {

      return allTime;

      } void CPU::displayPro()

      {

      for(int i=0;i<numOfprocess;i++)

      {

      cout<<" Process ID : "<<p_Process[i].getID()<<endl;

      cout<<" text of runned :"<<p_Process[i].getRuntext()<<endl;

      }

      } void CPU::Run()

      {

      int numPro=numOfprocess; do

      {

      for(int num=0;num < numOfprocess;num++)

      {

      if(!pp_Process[num]) //假如該指針為空,說明該進程不在就緒隊列中

      continue; for(int t=0;t<p_Process[num].getUnittime();t++)

      {

      PC=p_Process[num].getIP();

      if(_IC(p_Process[num]))

      {

      if(t==0)

      cout<<"the process ["<<p_Process[num].getID()<<"] runed : ";

      if(!p_Process[num].getISusesource())

      else

      {

      p_Source->runned();

      if( p_Source->getState() && numOfblock>0 ) //釋放阻塞進程

      }

      }

      else

      {

      if(!p_Process[num].getBlockstate())

      {

      numPro--;

      pp_Process[num]=NULL;

      continue;

      }

      break;

      }

      allTime++;

      if(numOfblock>0)

      blockTimeADD();

      }//end for t...

      if( p_Process[num].getUnittime() )

      p_Process[num].setUnittime(1);

      cout<<endl;

      }//end for num... }while(numPro);

      } bool CPU::_IC(Process &p)

      {

      //對進程中的指令進行翻譯

      char resultRunned;

      resultRunned=p.getResult(PC);

      if(resultRunned=='#')

      return false;

      else

      {

      if(resultRunned==' ) //申請資源指令

      {

      PC++;

      p.setIP(PC);

      resultRunned=p.getResult(PC);

      if( resultRunned >='1' && resultRunned <='9' )

      {

      if(p_Source->getState())

      {

      //資源未被使用則使用資源

      useSource(p);

      cout<<"The process "<<p.getID()<<" take up the source!"<<endl;

      }

      else

      {

      //資源已被使用則阻塞進程

      blockProcess(p);

      cout<<"The process "<<p.getID()<<" is blocked !"<<endl;

      return false; }

      }

      else

      {

      //' 後跟的不是數字,則語法錯誤

      cout<<"The process ["<<p.getID()<<"] runned fail ! It has been stopped! "<<endl;

      return false;

      }

      } }

      return true;

      } void CPU::blockTimeADD()

      {

      for(int i=0;i<numOfblock;i++)

      {

      int BT=blockQueue[i].p_BlockProcess->getBlcoktime();

      blockQueue[i].p_BlockProcess->setBlocktime(++BT);

      }

      } void CPU::useSource(Process& p)

      {

      p.setISusesource(true);

      p_Source->setState(false);

      p_Source->setProID(p.getID());

      p_Source->setTime(p.getResult(PC)-'0');

      p_Source->setPro(&p); } void CPU::blockProcess(Process& p)

      {

      int tempIndex=numOfprocess-( Process::init_ID-p.getID() );

      blockQueue[numOfblock].p_BlockProcess=&p;

      blockQueue[numOfblock].index=tempIndex;

      numOfblock++;

      int ip=p.getIP();

      p.setIP(--ip);

      p.setBlockstate(true);

      p.setBlocktime(1);

      p.setUnittime(0);

      pp_Process[tempIndex]=NULL; } void CPU::releaseBlockPro()

      {

      //釋放阻塞隊列的第一個進程,因為它阻塞時間最長

      pp_Process[blockQueue[0].index]=blockQueue[0].p_BlockProcess;

      blockQueue[0].index=-1;

      blockQueue[0].p_BlockProcess->setBlockstate(false);

      blockQueue[0].p_BlockProcess->setUnittime( blockQueue[0].p_BlockProcess->getBlcoktime() );

      blockQueue[0].p_BlockProcess->setBlockstate(0);

      blockQueue[0].p_BlockProcess=NULL;

      numOfblock--;

      //阻塞隊列中的其他進程向前移動一個位置

      for(int i=0;i<numOfblock;i++)

      }

      /////////////////////////////////////////////////////////////////////////////////////

      //

      // The main progress

      //

      /////////////////////////////////////////////////////////////////////////////////////

      void main()

      {

      int num;

      cout<<" ********************************************************"<<endl

      <<endl;

      cout<<" The virtual CPU the process runned "<<endl

      <<endl;

      cout<<" *******************************************************"<<endl

      <<endl;

      cout<<"initialize the information of processes "<<endl; cout<<"Please in put the number of process [#command#] > "; try

      catch(int)

      {

      cout<<"You in put the numbers of process is error !"<<endl;

      exit(1);

      } Process::RandID(); // 隨機生成第一個進程的ID,以後生成的進程ID順序加1

      CPU virtualCPU(num);

      cout<<"Pocesses runed by CPU "<<endl;

      virtualCPU.Run();

      cout<<"Processes runned over ! "<<endl;

      cout<<" ********************************************************"<<endl

      <<endl;

      cout<<" The time which processes runned by CPU : "<<virtualCPU.getAlltime()<<endl

      <<endl;

      virtualCPU.displayPro();

      cout<<" *******************************************************"<<endl

      <<endl;

      } 這裡沒有任何的API調用 只是模擬,我給進程設定了自己的語法,輸入一般的字符cpu調用時只是正常輸出,假如碰到' 表示該進程要調用系統資源後面必須跟一個數字表示占有的時間,假如資源閒置則占有資源否則阻塞,等資源釋放在占有資源。進程的調用算法我采用的是時間片輪轉算法並有所改進,當某個進程從阻塞隊列釋放後,他將把以前因為等待資源而被浪費的時間補回來。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved