1、操作系统实验报告进程调度法的实现 操作系统实验报告进程调度算法的实现 1.实验目的 进程是操作系统最重要的概念之一,本实验通过对进程调度模拟程序的运行,学习运用时间片轮转法进行进程调度,加深对进程的基本调度状态以及进程调度算法的理解。2.算法思想 进程调度算法:采用多级反馈队列调度算法。其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS原则排队等待高度。当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。4.算法 。5.程序代码 程序的主要代
2、码如下:#include#include#include#include#includeconst int MAXCOMMANDLEN =50;/ PROCESS/class Process friend class CPU; /友元类protected: static int init_ID; /静态初始ID int ID; /进程ID char runTextMAXCOMMANDLEN; /进程指令数组 int IP; /进程指令指针,保存进程指令执行到的具体位置 bool ISuseSource; /进程是否使用资源(是或者否) bool ISblocked; /进程是否被阻塞(是或者否
3、) int unitTime; /进程被cpu执行单位时间, 默认 1 int blockTime; /进程被阻塞时间 public: static void RandID(); /静态随机生成进程ID的函数 Process(); /进程类的构造函数 int getID(); /得到进程ID int getIP(); /获取进程指令指针IP void setIP(int); /设置IP void Runed(); /进程被执行 int getUnittime(); /得到进程的单位执行时间 int getBlcoktime(); /得到进程被阻塞的时间 void setBlocktime(in
4、t); /设置进程被阻塞的时间 void setUnittime(int); /设置进程的单位执行时间 char getResult(int); /得到进程被执行的结果 char* getRuntext(); /得到进程执行的指令 void setBlockstate(bool); /设置进程阻塞状态 bool getBlockstate(); /得到进程阻塞状态 bool getISusesource(); /得到资源的使用状态 void setISusesource(bool); /设置资源的使用状态;int Process:init_ID; /初始化静态变量void Process:Ra
5、ndID() /随机产生一个进程ID srand(unsigned)time(NULL); /调用srand随机生成函数 init_ID=rand(); Process:Process() /进程的构造函数 ID=init_ID+; /进程ID的初值为静态初始ID的值 int commandLen; /命令行长度 IP=0; cout ; cinrunText; /输入命令 if( (commandLen=strlen(runText) ) MAXCOMMANDLEN ) exit(0); /输入长度超出最大长度时退出,特殊情况处理 runTextcommandLen=#; /初始指令结束标志
6、 # runTextcommandLen+1=0; /字符串结束标志 ISuseSource=false; /设置资源的使用状态为未使用 ISblocked=false; /进程的初始状态-未被阻塞 unitTime=1; /进程被执行的单位时间为1 blockTime=0; /阻塞时间为0void Process:Runed() /进程被CPU执行 cout0) /时间充足继续运行输出资源信息并使时间减一 cout( Source :ID); time-; if(timesetISusesource(false); /资源的使用状态为未使用 int ip=pro-getIP(); /得到进程
7、的IP pro-setIP(+ip); /设置到下一个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; /进程队列 P
8、rocess *pp_Process; /进程就绪队列 Block *blockQueue ; /进程阻塞队列 Source *p_Source; /资源指针 int numOfprocess; /进程数量 int numOfblock; /被阻塞的进程数 int PC; /程序计数器 int allTime; /cpu运行的总时间 public : CPU(int); /cpu构造函数 void Run(); /cpu运行进程 bool _IC(Process&); /虚拟IC,进行进程指令翻译 void useSource(Process&); /进程申请资源 void blockProc
9、ess(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; /cpu运行的总时间初始化为0 p_Process=ne
10、w ProcessnumOfprocess;/进程队列申请空间pp_Process=new Process*numOfprocess;/进程就绪队列申请空间 blockQueue=new BlocknumOfprocess; /阻塞队列申请空间 for(int i=0;ip_BlockProcess=NULL; /阻塞队列的阻塞进程赋值为空 blockQueue-index=-1; /阻塞队列的索引值置为1 int CPU:getAlltime() /得到进程运行的总时间 return allTime;void CPU:displayPro() /显示进程的基本信息for(int i=0;in
11、umOfprocess;i+)/循环输出被执行的进程的信息 couttProcess ID : p_Processi.getID()endl; cout text of runned :p_Processi.getRuntext()endl; void CPU:Run() /cpu运行进程 int numPro=numOfprocess; /记录未被运行的进程个数 do for(int num=0;num numOfprocess;num+) if(!pp_Processnum) /就绪队列不空继续执行 continue; for(int t=0;tp_Processnum.getUnitti
12、me();t+) PC=p_Processnum.getIP();/得到进程Ip if(_IC(p_Processnum)/判断进程的状态TURE进入 if(t=0) /时间为0运行完输出进程信息 coutthe process p_Processnum.getID()runned(); / if( p_Source-getState() & numOfblock0 ) releaseBlockPro();/如果进程运行过,现在但未运行,说明为阻塞。释放阻塞进程,调用它 else if(!p_Processnum.getBlockstate()/该进程不在阻塞状态 numPro-; /未被运行
13、的进程个数减一 pp_Processnum=NULL; /进程就绪队列该位置赋为空值 continue; break; /跳出循环 allTime+; /运行总时间+ if(numOfblock0) /如果阻塞个数0 blockTimeADD(); /阻塞时间加1 /end for t. if( p_Processnum.getUnittime() /该进程的执行单位时间非0 p_Processnum.setUnittime(1); /设置该进程执行的单位时间为1 cout=1 & resultRunned getState()/资源未被使用则使用资源 useSource(p); coutTh
14、e 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() /阻塞时间加1 for(int i=0;iget
15、Blcoktime();/循环得到阻塞队列中每个进程的阻塞时间 blockQueuei.p_BlockProcess-setBlocktime(+BT); /每个时间+1 void CPU:useSource(Process& p) /进程申请资源 p.setISusesource(true); /运行的资源的状态设置 p_Source-setState(false); /资源状态设置为不可用 p_Source-setProID(p.getID(); /设置进程ID p_Source-setTime(p.getResult(PC)-0); /设置资源使用时间 p_Source-setPro(&
16、p); /设置使用资源的进程void CPU:blockProcess(Process& p) /阻塞进程 int tempIndex=numOfprocess-( Process:init_ID-p.getID() );/阻塞进程的设置 blockQueuenumOfblock.p_BlockProcess=&p;/将进程p加入到阻塞队列尾部 blockQueuenumOfblock.index=tempIndex; /设置新加进程阻塞队列所在位置的索引值 numOfblock+; /阻塞进程个数+1 int ip=p.getIP(); p.setIP(-ip); /设置进程的ip p.se
17、tBlockstate(true); /设置进程的组设状态为真 p.setBlocktime(1); /设置进程的块阻塞时间为1 p.setUnittime(0); /设置进程的单位执行时间为0 pp_ProcesstempIndex=NULL; /进程就绪队列tempIndex处赋为空值void CPU:releaseBlockPro() /释放阻塞队列的第一个进程,阻塞时间最长 pp_ProcessblockQueue0.index=blockQueue0.p_BlockProcess;/将阻塞进程的第一个进程赋值给就续队列的相应位置 blockQueue0.index=-1; /将阻塞队
18、列的起始位置的索引值置为-1 blockQueue0.p_BlockProcess-setBlockstate(false);/将阻塞队列的起始位置的进程阻塞状态设置为未阻塞(false) blockQueue0.p_BlockProcess-setUnittime(blockQueue0.p_BlockProcess-getBlcoktime();/得到阻塞队列首位置的进程的阻塞时间 blockQueue0.p_BlockProcess-setBlockstate(0);/ blockQueue0.p_BlockProcess=NULL; / 阻塞队列的0位置指针赋值为空 numOfblock-; /阻塞进程个数减一 for(int i=0;inumOfblock;i+) /阻塞队列中的其他进程向前移动一个位置 blockQueuei=blockQueuei+1; / The main progress/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1