分享
 
 
 

进程调度模拟程序

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

我们课程设计,我选择了一个进程调度模拟,希望大家给看看,多提意见,好久没来发帖子了。

#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调用时只是正常输出,假如碰到' 表示该进程要调用系统资源后面必须跟一个数字表示占有的时间,假如资源闲置则占有资源否则阻塞,等资源释放在占有资源。进程的调用算法我采用的是时间片轮转算法并有所改进,当某个进程从阻塞队列释放后,他将把以前因为等待资源而被浪费的时间补回来。

希望大家多提意见

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有