操作系统进程调度实验报告.docx
- 文档编号:11782463
- 上传时间:2023-04-01
- 格式:DOCX
- 页数:21
- 大小:120.88KB
操作系统进程调度实验报告.docx
《操作系统进程调度实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统进程调度实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
操作系统进程调度实验报告
一、实验目的
无论是批处理系统、分时系统还是实时系统,用户进程数一般都大于处理机数,这将导致用户进程互相争夺处理机。
这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一进程,以使之执行。
进程调度是处理机管理的核心内容。
本实验要求采用调度算法编写和调试一个简单的进程调度程序。
通过本实验可以加深理解有关进程控制块、进程队列、阻塞队列、就绪队列等的概念。
并了解CPU分配资源的方式。
二、实验要求
调试一个进程调度程序,对程序进行注释,理解每条语句的用意,掌握CPU对进城进程分配资源的方式,以加深对进程概念及进程调度算法的理解。
三、实验内容
1.进程调度算法:
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法(将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理)。
2.进程控制块
每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:
进程ID、进程IP、进程指令(优先级数)、运行时间、阻塞时间、阻塞状况、占用资源情况等。
进程的优先数及需要的运行时间可以事先人为地指定,即输入进程的执行指令。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪 、运行和阻塞三种状态之一。
3.资源
资源包括资源ID、资源状态(是否被占用)、使用资源的进程ID、进程指针以及使用时间。
程序规定CPU资源数为1,既所有进程只能请求同一资源,如果所请求资源已被占用,则进程进入阻塞队列等待资源。
4.CPU
CPU包括执行中的进程指针、就绪队列、阻塞队列、CPU资源、进程数、阻塞进程数以及CPU运行时间。
就绪进程获得 CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
进行调度程序后打印进程所有运行的进程的进程信息,以便进行检查。
四、实验算法流程
五、实验程序清单
#include
#include
#include
#include
#include
usingnamespacestd;
constintMAXCOMMANDLEN=50;
/////////////////////////////////////////////////////////////////////////////////////
//
//PROCESS
//
/////////////////////////////////////////////////////////////////////////////////////
classProcess
{
friendclassCPU;
protected:
staticintinit_ID;
intID;
charrunText[MAXCOMMANDLEN];//进程指令
intIP;//进程IP
boolISuseSource;//进程是否占用资源
boolISblocked;//进程是否阻塞
intunitTime;//CPU执行时间
intblockTime;//进程阻塞时间
public:
staticvoidRandID();//初始化静态成员变量init_ID()
Process();//构造函数
intgetID();//获取进程ID
intgetIP();//获取进程IP
voidsetIP(int);//设置进程IP
voidRuned();//输出进程IP
intgetUnittime();//获得单位时间
intgetBlcoktime();//获得阻塞时间
voidsetBlocktime(int);//设置阻塞时间
voidsetUnittime(int);//设置单位执行时间
chargetResult(int);//获得进程执行结果
char*getRuntext();//获得进程执行指令
voidsetBlockstate(bool);//设置阻塞状态
boolgetBlockstate();//获得阻塞状态
boolgetISusesource();//获得资源转台
voidsetISusesource(bool);//设置资源状态
};
intProcess:
:
init_ID;
voidProcess:
:
RandID()
{
srand((unsigned)time(NULL));//函数调用time()函数为随机数种子初始化,使每次调用srand()函数产生变值
init_ID=rand();//自动调用srand((unsigned)time(NULL))初始化init_ID,使每次初始值都不同
}
Process:
:
Process()
{
ID=init_ID++;
intcommandLen;
IP=0;
cout<<"PleaseinputthetextwhichprocessrunedbyCPU[#command#]:
>\\";
cin>>runText;//输入命令
if((commandLen=strlen(runText))>MAXCOMMANDLEN)
exit(0);
runText[commandLen]='#';//放入runText的命令添加结束符
runText[commandLen+1]='\0';
ISuseSource=false;//设置资源未使用
ISblocked=false;//设置进程为未阻塞
unitTime=1;//设置单位时间为1
blockTime=0;//设置快时间为0
}
voidProcess:
:
Runed()
{
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;//资源状态 intpro_ID;//使用资源的进程ID Process*pro;//使用资源的进程指针 inttime;//使用资源的进程时间 public: Source(int);//构造函数 boolgetState();//获得资源状态 voidsetState(bool);//设置资源状态 voidsetTime(int);//设置运行时间 voidsetPro(Process*);//设置进程 intgetID();//获得资源ID intgetPorID();//获得进程ID voidsetProID(int);//设置进程ID voidrunned();//资源调用函数 }; Source: : Source(intid) { ID=id; pro=NULL; state=true;//资源状态为占用 } voidSource: : setProID(intid) { pro_ID=id; } voidSource: : setTime(intt) { time=t;//设置资源占用时间为t } voidSource: : setState(bools) { state=s; } boolSource: : getState() { returnstate; } voidSource: : setPro(Process*p) { pro=p; } voidSource: : runned() { if(time>0) { cout<<"(Source: "< time--; } if(time<=0) { pro->setISusesource(false);//资源占用时间为0,将当前占用资源的进程取消占用 intip=pro->getIP(); pro->setIP(++ip);//获得下一条需要占用资源的IP Source: : setState(true);//将资源设置为占用 cout< "< 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();//显示进程基本信息函数 voidblockTimeADD();//阻塞进程时间增加函数 }; CPU: : CPU(intnum) { p_Source=newSource(379857);//分配CPU资源 numOfprocess=num;//分配进程号 numOfblock=0;//进程块为0 allTime=0;//进程时间是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() { for(inti=0;i { cout<<"\tProcessID: "< //显示请求资源的进程ID cout<<"textofrunned: "< }//显示输入的指令 } voidCPU: : Run() { 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(); }//endfort... if(p_Process[num].getUnittime()) p_Process[num].setUnittime (1); cout< }//endfornum... }while(numPro); } boolCPU: : _IC(Process&p) { //进程指令翻译 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()//阻塞进程时间增加函数 { 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);//资源可用状态为false p_Source->setProID(p.getID());//设置资源被占用的进程ID 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************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 进程 调度 实验 报告