进程调度模拟程序

2016-02-19 21:35 13 1 收藏

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - 编程语言 】

   我们课程设计,我选择了一个进程调度模拟,希望大家给看看,多提意见,好久没来发帖子了。
  #includeiostream.h
  #includestdlib.h
  #includetime.h
  #includestdio.h
  #includestring.hconst 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 input the text which process runed by CPU [#command#] : ";
   cinrunText;
   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(time0)
   {
    cout"( Source :"ID")";
  
     time--;
   }
   if(time=0)          //进程使用完资源释放资源,使用资源的时间到
   {
    pro-setISusesource(false);
    int ip=pro-getIP();
    pro-setIP(++ip);
    Source::setState(true);
    coutendl"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;inumOfprocess;i++)
    
  }int CPU::getAlltime()
  {
   return allTime;
  }void CPU::displayPro()
  {
   for(int i=0;inumOfprocess;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;tp_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() && numOfblock0 )     //释放阻塞进程
         
       }
      }
      else
      {
       if(!p_Process[num].getBlockstate())
       {
        numPro--;
           pp_Process[num]=NULL;
        continue; 
       }
       break;
      }
      allTime++;
      if(numOfblock0)
       blockTimeADD();
     }//end for t...
     if( p_Process[num].getUnittime() )
      p_Process[num].setUnittime(1);
     coutendl;
    }//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;inumOfblock;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;inumOfblock;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 input the number of process [#command#] "; try
   
   catch(int)
   {
    cout"You input 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调用时只是正常输出,假如碰到' 表示该进程要调用系统资源后面必须跟一个数字表示占有的时间,假如资源闲置则占有资源否则阻塞,等资源释放在占有资源。进程的调用算法我采用的是时间片轮转算法并有所改进,当某个进程从阻塞队列释放后,他将把以前因为等待资源而被浪费的时间补回来。
  希望大家多提意见

来源:http://www.tulaoshi.com/n/20160219/1626600.html

延伸阅读
标签: 电脑入门
在Windows系统中,利用软件借助系统底层命令快速关闭无响应程序。 使用Windows的朋友一定遇到过,电脑中的程序在运行的过程中,因为种种原因经常没有响应,就需要到进程列表中将无响应的程序关闭。但是在众多进程中快速找到无响应的进程不是一件容易的事情,需要花费半天的时间才能够找到。如果你一直为这个事而困惑的话,可以试试一款名字为P...
本程序通过调用kernel32.dll中的几个API 函数,搜索并列出系统中除本进程外的所有进程的ID、对应的文件说明符、优先级、CPU占有率、线程数、相关进程信息等有关信息,并可中止所选进程。 本程序运行时会在系统托盘区加入图标,不会出现在按Ctrl+Alt+Del出现的任务列表中,也不会在任务栏上显示任务按钮,在不活动或最小化时会自动隐...
假如只要判定EXE的名字(不需要判定路径),可以省略EnumProcess,因为 pe32.szExeFile 里就已经有EXE的名字了,因为没有路径,所以才又使用了 函数EnumProcess来取得完整的路径。这样就简洁一些了。 BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam) {     DWord dwID;   &nb...
Director 8 相对于 director 7 有很多增量型的改动,其中对于 lingo 程序员来说,最引人注目的就是增加了相关的 image lingo 指令。有了它,我们可以做很多以前用 director 7 所无法做到的效果,例如你可以自己编写一些 transition 过渡效果,还有你还可以编写类似于 photoshop 的滤镜效果。这也进一步体现出 director 相对于 Flash 的优势...
标签: windows 操作系统
是否有“杀”不掉的进程?是否觉得某个进程有病毒木马的嫌疑?在我们用Windows自带的任务管理器的时候,有些系统进程与一些其他进程(可能为病毒木马)是没有办法直接使用“结束任务”来杀掉这些进程的!如下图: 这个时候我们可以使用一个绿色免费的小工具来帮助我们把这些“顽固”的进程“杀”掉。这个小工具就是进程杀手(procki...

经验教程

883

收藏

85
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部