闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑鐐烘偋閻樻眹鈧線寮撮姀鐘栄囨煕鐏炲墽鐓瑙勬礀閳规垿顢欑紒鎾剁窗闂佸憡顭嗛崘锝嗙€洪悗骞垮劚濞茬娀宕戦幘鑸靛枂闁告洦鍓涢ˇ顓熺節閳封偓閸曞灚鐤佸Δ鐘靛仜濡繂顕i鈧畷鐓庮熆椤忎焦娅婇柟顔筋殜閺佹劖鎯斿┑鍫濆毈闁诲海鎳撻幉锛勬崲閸曨厽顫曢柟鐑樻尰缂嶅洭鏌曟繛鍨姢闁荤喆鍔岄—鍐Χ鎼粹€茬凹缂備緡鍠楅幐鎼佹偩閻戣棄纭€闁绘劕绉堕崰鏍箖濞嗘挸绠f繝闈涙搐椤︹晠姊洪幎鑺ユ暠闁搞劌婀卞Σ鎰板箻鐎涙ê顎撴繝娈垮枟閸╁牊绂嶅┑瀣疄闁靛ň鏅涢悙濠囨煏婵炲灝鈧绮诲顒夋富闁靛牆妫涙晶顒勬煟閺冩垵澧撮柣鎿冨墴椤㈡宕掑Δ鈧禍楣冩偡濞嗗繐顏痪鐐倐閺屾稒鎯旈敐鍡樻瘓閻庢鍣崑濠囩嵁濡偐纾兼俊顖滅帛椤忕喖姊绘担鑺ョ《闁革綇绠撻獮蹇涙晸閿燂拷婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻鐔兼⒒鐎靛壊妲紒鐐劤椤兘寮婚敐澶婄疀妞ゆ帊鐒﹂崕鎾剁磽娴e搫小闁告濞婂濠氭偄閸忓皷鎷婚柣搴ㄦ涧婢瑰﹤危椤斿墽纾藉ù锝呮惈鍟搁梺鍝ュУ閻楃姴顕f繝姘╅柍鍝勫€告禍婊堟⒑閸涘﹦绠撻悗姘嚇婵偓闁靛牆妫涢崢閬嶆⒑闂堟胆褰掑磿闁秴鐒垫い鎺嗗亾婵犫偓闁秴绠查柕蹇曞Л濡插牓鏌曡箛鏇炐㈤柤鏉跨仢閳规垿鍩ラ崱妤冧淮濡炪倖娉﹂崶顭戞閻庡箍鍎遍ˇ浼村煕閹寸姷纾奸悗锝庡亽閸庛儵鏌涙惔銏犲缂佽鲸甯為幏鐘诲箵閹烘挻顔掑┑鐘殿暜缁辨洟寮拠鑼殾闁绘梻鈷堥弫宥嗘叏濡じ鍚柡澶嬫倐濮婄粯鎷呴崫銉︾€┑鈩冦仠閸斿酣骞忕€n喖钃熼柕澶堝劤閿涙盯姊虹憴鍕妞ゆ泦鍥х闁逞屽墴閹嘲饪伴崘鐐枅閻庢鍠楅幃鍌氼嚕椤曗偓瀹曞ジ鎮㈤崫鍕辈闂傚倷鑳剁划顖毭洪弽顓炵9闁革富鍘搁崑鎾愁潩閻愵剙顏�
开发学院软件开发C++ 进程调度模拟程序 阅读

进程调度模拟程序

 2008-03-08 21:40:57 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑娑⑺囬悽绋挎瀬闁瑰墽绮崑鎰版煙缂佹ê绗ч柍褜鍓﹂崣鍐潖閸濆嫅褔宕惰娴犲ジ姊虹拠鑼闁煎綊绠栭幃楣冩倻閽樺鎽曢梺闈涱檧婵″洭宕㈤悽鍛娾拺閻熸瑥瀚烽崯蹇涙煕閻樺磭澧甸柕鍡楀€圭缓浠嬪川婵犲嫬骞堥梺纭呭閹活亞妲愰弴鐔哄ⅰ闂傚倷绶氬ḿ褍煤閵堝洠鍋撳顐㈠祮闁绘侗鍣i獮鎺懳旈埀顒傜不閿濆棛绡€闂傚牊绋戦弳娆徝瑰⿰鍫㈢暫闁哄矉缍佹慨鈧柍鎯版硾濠€杈ㄧ珶閺囩喓绡€婵﹩鍘鹃崢鐢告⒑缂佹ê濮﹂柛鎾村哺閹ɑ娼忛妸銈囩畾闂佸湱绮敮鐐存櫠濞戞氨纾肩紓浣贯缚濞插鈧娲栧畷顒冪亙闂佸憡鍔曢崯鐘诲礈濠靛牊宕叉繛鎴炨缚閺嗗棗鈹戦悩杈厡闁轰焦鐗滅槐鎾存媴娴犲鎽甸梺鍦嚀濞层倝鎮鹃悜钘夌闁规惌鍘介崓鐢告⒑閻熸澘鎮侀柣鎺炵畵閹骞栨担鍏夋嫽婵炶揪绲块崕銈夊吹閳ь剟姊洪幖鐐测偓鏍偋閻樿崵宓侀煫鍥ㄧ⊕閺呮悂鏌ㄩ悤鍌涘濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻戦妵鍕箻閸楃偟浠肩紓浣哄閸ㄥ爼寮诲☉銏犵疀闂傚牊绋掗悘鍫ユ倵閻熺増鍟炵紒璇插暣婵$敻宕熼姘鳖啋闁诲酣娼ч幗婊堟偩婵傚憡鈷戠痪顓炴媼濞兼劖绻涢懠顒€鏋庢い顐㈢箳缁辨帒螣閼测晜鍤岄梻渚€鈧偛鑻晶顔肩暆閿濆牆鍔垫い锔界叀閹繝濡舵径瀣帾闂佸壊鍋呯换鍐磻椤忓懐绠剧€瑰壊鍠曠花濠氬箚閻斿吋鈷戦悗鍦У閵嗗啴鏌ら崘鑼煟鐎规洘绻堥弫鍐焵椤掑嫧鈧棃宕橀鍢壯囨煕閳╁喚娈橀柣鐔稿姍濮婃椽鎮℃惔鈩冩瘣闂佺粯鐗曢妶绋跨暦閻戞ḿ绡€闁搞儜鍐ㄧギ闂備線娼ф蹇曟閺囥垹鍌ㄦい蹇撶墛閳锋垿鏌熼懖鈺佷粶闁告梹顨婇弻锟犲川椤旈敮濮囩紓浣稿€圭敮鐔妓囩€靛摜纾奸弶鍫涘妼缁楁碍绻涢悡搴g闁糕斁鍓濋幏鍛存煥鐎e灚缍楅梻鍌氬€峰ù鍥ь浖閵娾晜鍊块柨鏇炲€哥粻鏌ユ煕閵夘喖澧柡瀣╃窔閺岀喖宕滆鐢盯鏌¢崨顔藉€愰柡灞诲姂閹倝宕掑☉姗嗕紦闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛銈呭閺屻倝宕妷锔芥瘎婵炲濮靛銊ф閹捐纾兼繛鍡樺笒閸橈紕绱撴笟鍥ф珮闁搞劌鐖兼俊鎾礃椤旂厧绐涢梺鍝勵槹閸ㄥ綊宕㈠ú顏呭€垫鐐茬仢閸旀碍銇勯敂璇茬仸鐎规洩绻濋獮搴ㄦ嚍閵壯冨妇闂傚⿴鍋勫ú锕€煤閺嶃劎澧¢梻鍌欐祰椤曆呪偓鍨浮瀹曟粓鎮㈡總澶嬬稁闂佹儳绻愬﹢杈╁閸忛棿绻嗘い鏍ㄧ閹牊銇勯銏㈢劯婵﹨娅i幏鐘绘嚑椤掑偆鍞规繝娈垮枟鑿ч柛鏃€鍨垮畷娲焵椤掍降浜滈柟鍝勭Ф椤︼箓鏌涢妶搴″⒋闁哄本鐩獮妯兼崉閻戞ḿ鈧顪冮妶搴′簻缂佺粯鍔楅崣鍛渻閵堝懐绠伴悗姘煎墴閹顢橀悜鍡樺瘜闂侀潧鐗嗗Λ娆戠矆閳ь剟姊洪悷鏉挎毐闂佸府绲介悾宄扳堪閸曨偒鍤ら柣搴㈢⊕鑿ら柟閿嬫そ濮婄粯绗熼崶褌绨介梺绋款儐閻╊垶骞婇悢纰辨晬婵炴垶鐟﹂悵宄邦渻閵堝棙鐓ュ褏鏅竟鏇㈡偂鎼搭喚鍞甸柣鐘烘鐏忋劑宕濋悢铏圭<濠㈣泛瀛╅鐘绘煃瑜滈崜姘额敊閺嶎厼绐楅柡宥庡幐閳ь剨绠撻弻銊р偓锝傛櫇缁犳艾鈹戦鐣岀畵闁活厼鐗嗗嵄闁绘垼濮ら埛鎴犵磼鐎n偒鍎ラ柛搴㈠姍閺岀喖鎮烽悧鍫熸倷闁捐崵鍋ら弻娑㈠箛閳轰礁唯濠碘剝褰冮悧濠勬崲濞戙垹骞㈡俊銈呭暟椤斿鈹戦悙鑼闁挎洏鍨归~蹇曠磼濡顎撴俊鐐差儏缁ㄨ偐鎲伴崱娆戠=闁稿本姘ㄨⅵ闂佺ǹ顑嗛幐鑽ゆ崲濞戞埃鍋撳☉娆嬬細闁活厹鍊濋弻娑㈠箻鐠虹儤鐏堥悗瑙勬礃濡炰粙宕洪埀顒併亜閹哄秹妾峰ù婊勭矒閺岀喖鎮滃Ο铏逛淮闂侀€炲苯澧紓宥咃工椤曪綁骞庣粵瀣櫌闂佸憡娲﹂崜娑㈠储闁秵鐓熼幖鎼灣缁夐潧霉濠婂懎鍘撮柣鎿冨墴椤㈡宕掑Δ鈧禍楣冩偡濞嗗繐顏痪鎯ь煼閺屾稑螖閳ь剟宕崸妤婃晪闁挎繂顦壕褰掓煟閺囨氨鍔嶉棄瀣⒒閸屾瑧顦﹂柟纰卞亜铻為悗闈涙憸娑撳秹鏌熼幑鎰靛殭闁藉啰鍠栭弻鏇熺箾閻愵剚鐝曢梺绋款儏濡繈寮诲☉姘勃闁告挆鈧Σ鍫濐渻閵堝懘鐛滈柟鍑ゆ嫹
核心提示: 我们课程设计,我选择了一个进程调度模拟,进程调度模拟程序,希望大家给看看,多提意见,进程的调用算法我采用的是时间片轮转算法并有所改进,当某个进程从阻塞队列释放后,好久没来发帖子了,#include<iostream.h>#include<stdlib.h>#include<time.h&
  我们课程设计,我选择了一个进程调度模拟,希望大家给看看,多提意见,好久没来发帖子了。
#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 input 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 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调用时只是正常输出,假如碰到' 表示该进程要调用系统资源后面必须跟一个数字表示占有的时间,假如资源闲置则占有资源否则阻塞,等资源释放在占有资源。进程的调用算法我采用的是时间片轮转算法并有所改进,当某个进程从阻塞队列释放后,他将把以前因为等待资源而被浪费的时间补回来。
希望大家多提意见

Tags:进程 调度 模拟

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接