用C++编写进程调度模拟程序.doc_第1页
用C++编写进程调度模拟程序.doc_第2页
用C++编写进程调度模拟程序.doc_第3页
用C++编写进程调度模拟程序.doc_第4页
用C++编写进程调度模拟程序.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统教程实验报告班 级 姓 名 学 号 指导教师 日 期 2013-5-10 西安理工大学理学院应用数学系二零一三年春季学期一、实验名称用C+编写进程调度模拟程序。二、实验目的 进程是操作系统最重要的概念之一,本实验通过对进程调度模拟程序的运行,学习运用时间片轮转法进行进程调度,加深对进程的基本调度状态以及进程调度算法的理解。三、实验内容 根据C+编写进程调度模拟程序,读懂并运行该程序代码,并且为代码添加注释。四、程序代码#include#include#include#include#includeconst int MAXCOMMANDLEN =50;/ PROCESS/class Process /进程类 friend class CPU;protected:static int init_ID; /随机进程IDint ID; /进程IDchar runTextMAXCOMMANDLEN; /进程指令数组int IP; /进程指令指针,保存进程指令执行到的具体位置 bool ISuseSource; /此进程是否使用资源,ture:使用中 false : 未使用bool ISblocked; /此进程是否被阻塞 ture:阻塞 false :未阻塞 int unitTime; /进程单位被cpu执行时间, 默认 1 int blockTime; /进程被阻塞时间public:static void RandID(); /随机生成进程IDProcess(); /进程函数的构造函数int getID(); /获取进程IDint getIP(); /获取进程IPvoid setIP(int); /设置IPvoid 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() /随机生成进程IDsrand( (unsigned)time( NULL ) ); /设置随机数种子init_ID=rand(); /产生随机数Process:Process() /构造函数 ID=init_ID+;int commandLen;IP=0;cout ;cinrunText; /输入命令if( (commandLen=strlen(runText) ) MAXCOMMANDLEN ) /退出的条件exit(0);runTextcommandLen=#; / 指令结束标志 # runTextcommandLen+1=0;ISuseSource=false;ISblocked=false;unitTime=1;blockTime=0;void Process:Runed() /执行进程cout0)cout( Source :ID);time-;if(timesetISusesource(false);int ip=pro-getIP();pro-setIP(+ip);Source:setState(true);coutendlThe process getID() relase the source!endl;pro=NULL;/ CPU/typedef struct Block /阻塞队列结构 Process *p_BlockProcess; /被阻塞的进程队列int index; /被阻塞的进程在就绪队列中的索引(位置)Block;class CPUprotected: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); /创建一个id号为379857的资源numOfprocess=num; /进程数numOfblock=0; /阻塞数allTime=0;p_Process=new ProcessnumOfprocess;pp_Process=new Process*numOfprocess;blockQueue=new BlocknumOfprocess; /阻塞队列for(int i=0;ip_BlockProcess=NULL;blockQueue-index=-1;int CPU:getAlltime() /得到进程运行的总时间return allTime;void CPU:displayPro() /显示进程的基本信息for(int i=0;inumOfprocess;i+)couttProcess ID : p_Processi.getID()endl;/输出进程的IDcout text of runned :p_Processi.getRuntext()endl;/已经运行进程指令void CPU:Run() /cpu运行进程int numPro=numOfprocess;dofor(int num=0;num numOfprocess;num+)if(!pp_Processnum) /如果该指针为空,说明该进程不在就绪队列中 continue;for(int t=0;tp_Processnum.getUnittime();t+)PC=p_Processnum.getIP();if(_IC(p_Processnum)/判断进程的状态TURE进入if(t=0)coutthe process p_Processnum.getID()runned();if( p_Source-getState() & numOfblock0 ) /如果进程运行过,现在但未运行,说明为阻塞。释放阻塞进程,调用它 releaseBlockPro();elseif(!p_Processnum.getBlockstate()numPro-;pp_Processnum=NULL;continue;break;allTime+;if(numOfblock0)blockTimeADD();/end for t.if( p_Processnum.getUnittime() )p_Processnum.setUnittime(1);cout=1 & resultRunned getState()/资源未被使用则使用资源useSource(p);coutThe process p.getID() take up the source!endl;else/资源已被使用则阻塞进程blockProcess(p);coutThe process p.getID() is blocked !endl;return false;else /$后跟的不是数字,则语法错误coutThe process p.getID() runned fail ! It has been stopped! endl;return false; return true;void CPU:blockTimeADD()for(int i=0;igetBlcoktime();blockQueuei.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() ); /阻塞进程的设置blockQueuenumOfblock.p_BlockProcess=&p;blockQueuenumOfblock.index=tempIndex;numOfblock+;int ip=p.getIP();p.setIP(-ip);p.setBlockstate(true);p.setBlocktime(1);p.setUnittime(0);pp_ProcesstempIndex=NULL;void CPU:releaseBlockPro()/释放阻塞队列的第一个进程,因为它阻塞时间最长pp_ProcessblockQueue0.index=blockQueue0.p_BlockProcess;blockQueue0.index=-1;blockQueue0.p_BlockProcess-setBlockstate(false);blockQueue0.p_BlockProcess-setUnittime( blockQueue0.p_BlockProcess-getBlcoktime() );blockQueue0.p_BlockProcess-setBlockstate(0);blockQueue0.p_BlockProcess=NULL;numOfblock-;/阻塞队列中的其他进程向前移动一个位置for(int i=0;inumOfblock;i+)blockQueuei=blockQueuei+1;/ The main progress/void main()int num;coutt*endlendl;coutt The virtual CPU the process runned endlendl;coutt*endlendl;coutinitialize the information of processes endl;cout ;trycinnum;if(num=0)throw(num);catch(int) /进程号输入错误,抛出异常coutYou input the numbers of process is error !endl;exit(1);Process:RandID(); / 随机生成第一个进程的ID,以后生成的进程ID顺序加1 CPU virtualCPU(num);coutPocesses runed by CPU endl;virtualCPU.Run();coutProcesses runned over ! endl;coutt*endlendl;coutt The time which processes runned by CPU : virtu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论