| 導購 | 订阅 | 在线投稿
分享
 
 
 

進程調度模擬程序

來源:互聯網  2008-06-01 02:11:51  評論

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

#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調用時只是正常輸出,假如碰到' 表示該進程要調用系統資源後面必須跟一個數字表示占有的時間,假如資源閑置則占有資源否則阻塞,等資源釋放在占有資源。進程的調用算法我采用的是時間片輪轉算法並有所改進,當某個進程從阻塞隊列釋放後,他將把以前因爲等待資源而被浪費的時間補回來。

希望大家多提意見

我們課程設計,我選擇了一個進程調度模擬,希望大家給看看,多提意見,好久沒來發帖子了。 #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調用時只是正常輸出,假如碰到' 表示該進程要調用系統資源後面必須跟一個數字表示占有的時間,假如資源閑置則占有資源否則阻塞,等資源釋放在占有資源。進程的調用算法我采用的是時間片輪轉算法並有所改進,當某個進程從阻塞隊列釋放後,他將把以前因爲等待資源而被浪費的時間補回來。 希望大家多提意見
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有