操作系统上机报告.docx
《操作系统上机报告.docx》由会员分享,可在线阅读,更多相关《操作系统上机报告.docx(17页珍藏版)》请在冰豆网上搜索。
操作系统上机报告
操作系统上机报告
——C++编写模拟进程调度程序
源程序如下:
#include
#include
#include
#include
#include
constintMAXCOMMANDLEN=50;
/////////////////////////////////////////////////////////////////////////////////////
//PROCESS
/////////////////////////////////////////////////////////////////////////////////////
classProcess//进程类
{
friendclassCPU;
protected:
staticintinit_ID;//随机进程ID
intID;//进程ID
charrunText[MAXCOMMANDLEN];//进程指令数组
intIP;//进程指令指针,保存进程指令执行到的具体位置
boolISuseSource;//此进程是否使用资源,ture:
使用中,false:
未使用
boolISblocked;//此进程是否被阻塞ture:
阻塞false:
未阻塞
intunitTime;//进程单位被cpu执行时间,默认1
intblockTime;//进程被阻塞时间
public:
staticvoidRandID();//随机生成进程ID
Process();
intgetID();
intgetIP();
voidsetIP(int);
voidRuned();//进程被cpu执行
intgetUnittime();//得到进程单位执行时间
intgetBlcoktime();//得到进程阻塞时间
voidsetBlocktime(int);//设置进程阻塞时间
voidsetUnittime(int);//设置进程单位执行时间
chargetResult(int);//得到进程执行结果
char*getRuntext();//得到进程执行的指令
voidsetBlockstate(bool);//设置阻塞状态
boolgetBlockstate();
boolgetISusesource();//得到资源的状态使用未使用
voidsetISusesource(bool);//设置资源的使用状态
};
intProcess:
:
init_ID;//随机进程ID
voidProcess:
:
RandID()//随机生成进程ID
{
srand((unsigned)time(NULL));
init_ID=rand();
}
Process:
:
Process()
{
ID=init_ID++;
intcommandLen;
IP=0;
cout<<"PleaseinputthetextwhichprocessrunedbyCPU[#command#]:
>\\";
cin>>runText;
if((commandLen=strlen(runText))>MAXCOMMANDLEN)
exit(0);
runText[commandLen]='#';//指令结束标志'#'
runText[commandLen+1]='\0';
ISuseSource=false;
ISblocked=false;
unitTime=1;
blockTime=0;
}
voidProcess:
:
Runed()//进程被cpu执行
{
cout<}
intProcess:
:
getID()
{
returnID;
}
intProcess:
:
getIP()
{
returnIP;
}
voidProcess:
:
setIP(intip)
{
IP=ip;
}
boolProcess:
:
getISusesource()//得到资源的状态使用未使用
{
returnISuseSource;
}
voidProcess:
:
setISusesource(bools)//设置资源的使用状态
{
ISuseSource=s;
}
char*Process:
:
getRuntext()//得到进程执行的指令
{
returnrunText;
}
intProcess:
:
getUnittime()//得到进程单位执行时间
{
returnunitTime;
}
intProcess:
:
getBlcoktime()//得到进程阻塞时间
{
returnblockTime;
}
voidProcess:
:
setBlocktime(intBT)//设置进程阻塞时间
{
blockTime=BT;
}
voidProcess:
:
setUnittime(intUT)//设置进程单位执行时间
{
unitTime=UT;
}
voidProcess:
:
setBlockstate(boolstate)//设置进程阻塞时间
{
ISblocked=state;
}
boolProcess:
:
getBlockstate()//得到阻塞状态
{
returnISblocked;
}
charProcess:
:
getResult(intk)//得到进程执行结果
{
returnrunText[k];
}
/////////////////////////////////////////////////////////////////////////////////////
//SOURCE
/////////////////////////////////////////////////////////////////////////////////////
classSource//资源类
{
protected:
intID;//资源ID
boolstate;//资源状态true:
未被进程占有false:
已被占有
intpro_ID;//使用资源的进程id
Process*pro;//使用资源的进程指针
inttime;//进程使用资源的时间
public:
Source(int);
boolgetState();//得到进程状态
voidsetState(bool);//设置进程状态
voidsetTime(int);//设置进程使用资源的时间
voidsetPro(Process*);//设置使用该资源的进程
intgetID();//得到资源id
intgetPorID();//得到使用资源的进程id
voidsetProID(int);//设置使用资源的进程id
voidrunned();//资源被cpu调用
};
Source:
:
Source(intid)
{
ID=id;
pro=NULL;
state=true;
}
voidSource:
:
setProID(intid)//设置使用资源的进程id
{
pro_ID=id;
}
voidSource:
:
setTime(intt)//设置进程使用资源的时间
{
time=t;
}
voidSource:
:
setState(bools)//设置进程状态
{
state=s;
}
boolSource:
:
getState()//得到进程状态
{
returnstate;
}
voidSource:
:
setPro(Process*p)//设置使用该资源的进程
{
pro=p;
}
voidSource:
:
runned()//资源被cpu调用
{
if(time>0)
{
cout<<"(Source:
"<time--;
}
if(time<=0)//进程使用完资源释放资源,使用资源的时间到
{
pro->setISusesource(false);
intip=pro->getIP();
pro->setIP(++ip);
Source:
:
setState(true);
cout<getID()<<"relasethesource!
"<pro=NULL;
}
}
/////////////////////////////////////////////////////////////////////////////////////
//CPU
/////////////////////////////////////////////////////////////////////////////////////
typedefstructBlock//阻塞队列结构
{
Process*p_BlockProcess;//被阻塞的进程队列
intindex;//被阻塞的进程在就绪队列中的索引(位置)
}Block;
classCPU
{
protected:
Process*p_Process;//进程队列
Process**pp_Process;//进程就绪队列
Block*blockQueue;//进程阻塞队列
Source*p_Source;//资源指针
intnumOfprocess;//进程数量
intnumOfblock;//被阻塞的进程数
intPC;//程序计数器
intallTime;//cpu运行的总时间
public:
CPU(int);
voidRun();//cpu运行进程
bool_IC(Process&);//虚拟IC,进行进程指令翻译
voiduseSource(Process&);//进程申请资源
voidblockProcess(Process&);//阻塞进程
voidreleaseBlockPro();//释放阻塞进程
intgetAlltime();//得到进程运行的总时间
voiddisplayPro();//显示进程的基本信息,id,指令,运行时间等
voidblockTimeADD();//阻塞时间加1
};
CPU:
:
CPU(intnum)
{
p_Source=newSource(379857);
numOfprocess=num;
numOfblock=0;
allTime=0;
p_Process=newProcess[numOfprocess];
pp_Process=newProcess*[numOfprocess];
blockQueue=newBlock[numOfprocess];
for(inti=0;i{
pp_Process[i]=&p_Process[i];
blockQueue->p_BlockProcess=NULL;
blockQueue->index=-1;
}
}
intCPU:
:
getAlltime()//得到进程运行的总时间
{
returnallTime;
}
voidCPU:
:
displayPro()//显示进程的基本信息,id,指令,运行时间等
{
for(inti=0;i{
cout<<"\tProcessID:
"<cout<<"textofrunned:
"<}
}
voidCPU:
:
Run()//cpu运行进程
{
intnumPro=numOfprocess;
do
{
for(intnum=0;num{
if(!
pp_Process[num])//如果该指针为空,说明该进程不在就绪队列中
continue;
for(intt=0;t{
PC=p_Process[num].getIP();
if(_IC(p_Process[num]))
{
if(t==0)
cout<<"theprocess["<";
if(!
p_Process[num].getISusesource())
{
p_Process[num].Runed();
}
else
{
p_Source->runned();
if(p_Source->getState()&&numOfblock>0)
{
releaseBlockPro();//释放阻塞进程
}
}
}
else
{
if(!
p_Process[num].getBlockstate())
{
numPro--;
pp_Process[num]=NULL;
continue;
}
break;
}
allTime++;
if(numOfblock>0)
blockTimeADD();//阻塞时间加1
}//endfort...
if(p_Process[num].getUnittime())
p_Process[num].setUnittime
(1);
cout<}//endfornum...
}while(numPro);
}
boolCPU:
:
_IC(Process&p)//虚拟IC,进行进程指令翻译
{
//对进程中的指令进行翻译
charresultRunned;
resultRunned=p.getResult(PC);
if(resultRunned=='#')
returnfalse;
else
{
if(resultRunned=='$')//申请资源指令
{
PC++;
p.setIP(PC);
resultRunned=p.getResult(PC);
if(resultRunned>='1'&&resultRunned<='9')
{
if(p_Source->getState())
{
//资源未被使用则使用资源
useSource(p);
cout<<"Theprocess"<
"<}
else
{
//资源已被使用则阻塞进程
blockProcess(p);
cout<<"Theprocess"<
"<returnfalse;
}
}
else//'$'后跟的不是数字,则语法错误
{
cout<<"Theprocess["<
Ithasbeenstopped!
"<returnfalse;
}
}
}
returntrue;
}
voidCPU:
:
blockTimeADD()//阻塞时间加1
{
for(inti=0;i{
intBT=blockQueue[i].p_BlockProcess->getBlcoktime();
blockQueue[i].p_BlockProcess->setBlocktime(++BT);
}
}
voidCPU:
:
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);
}
voidCPU:
:
blockProcess(Process&p)//阻塞进程
{
inttempIndex=numOfprocess-(Process:
:
init_ID-p.getID());
blockQueue[numOfblock].p_BlockProcess=&p;
blockQueue[numOfblock].index=tempIndex;
numOfblock++;
intip=p.getIP();
p.setIP(--ip);
p.setBlockstate(true);
p.setBlocktime
(1);
p.setUnittime(0);
pp_Process[tempIndex]=NULL;
}
voidCPU:
:
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(inti=0;i{
blockQueue[i]=blockQueue[i+1];//阻塞队列中的其他进程向前移动一个位置
}
}
/////////////////////////////////////////////////////////////////////////////////////
//Themainprogress
/////////////////////////////////////////////////////////////////////////////////////
voidmain()
{
intnum;
cout<<"\t********************************************************"<cout<<"\tThevirtualCPUtheprocessrunned"<cout<<"\t*******************************************************"<cout<<"initializetheinformationofprocesses"<cout<<"Pleaseinputthenumberofprocess[#command#]>\\";
try//定义异常
{
cin>>num;
if(num<=0)
throw(num);//当num<=0时抛出异常
}
catch(int)//捕获异常,并定义捕获后对异常的处理
{
cout<<"Youinputthenumbersofprocessiserror!
"<exit
(1);//异常退出程序
}
Process:
:
RandID();//随机生成第一个进程的ID,以后生成的进程ID顺序加1
CPUvirtualCPU(num);//定义一个CPU类的实体
cout<<"PocessesrunedbyCPU"<virtualCPU.Run();//cpu运行进程
cout<<"Processesrunnedover!
"<cout<<"\t********************************************************"<cout<<"\tThetimewhichprocessesrunnedbyCPU:
"<virtualCPU.displayPro();//显示进程的基本信息,id,指令,运行时间等
cout<<"\t*******************************************************"<}