实验二进程调度方案与实现_第1页
实验二进程调度方案与实现_第2页
实验二进程调度方案与实现_第3页
实验二进程调度方案与实现_第4页
实验二进程调度方案与实现_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

个人资料整理 仅限学习使用院 系:计算机学院实验课程: 操作系统实验工程:进程调度的设计与实现指导老师:陈红英老师开课时间:2018~2018年度第2学期专 业:网络工程班 级:10级学 生:yuth学 号:*一、实验工程名称进程调度的设计与实现二、实验目的及要求1、综合应用下列知识点设计并实现操作系统的进程调度:邻接表,布尔数组,非阻塞输入,图形用户界面GUI,进程控制块,进程状态转换,多级反馈队列进程调度算法。2、加深理解操作系统进程调度的过程。3、加深理解多级反馈队列进程调度算法。三、实验主要硬件软件环境32位PC机,VC++6个人资料整理 仅限学习使用四、实验内容及步骤1、采用一种熟悉的语言,如C、PASCAL或C++等,编制程序,最好关键代码采用C/C++,界面设计可采用其它自己喜欢的语言。2、采用多级反馈队列调度算法进行进程调度。3、每个进程对应一个 PCB。在PCB中包括进程标识符 pid、进程的状态标识status、进程优先级priority、进程的队列指针next和表示进程生命周期的数据life<在实际系统中不包括该项)。4、创建进程时即创建一个PCB,各个进程的pid都是唯一的,pid是在1到100范围内的一个整数。可以创建一个下标为1到100的布尔数组,“真”表示下标对应的进程标识号是空闲的,“假”表示下标对应的进程标识号已分配给某个进程。5、进程状态status的取值为“就绪ready”或“运行run”,刚创建时,状态为“ready”。被进程调度程序选中后变为“run”。6、进程优先级priority是0到49范围内的一个随机整数。7、进程生命周期 life是1到5范围内的一个随机整数。8、初始化时,创建一个邻接表,包含50个就绪队列,各就绪队列的进程优先级priority分别是0到49。9、为了模拟用户动态提交任务的过程,要求动态创建进程。进入进程调度循环后,每次按 ctrl+f即动态创建一个进程,然后将该 PCB插入就绪队列中。按ctrl+q退出进程调度循环。10、在进程调度循环中,每次选择优先级最大的就绪进程来执行。将其状态从就绪变为运行,通过延时一段时间来模拟该进程执行一个时间片的过程,然后优先级减半,生命周期减一。设计图形用户界面GUI,在窗口中显示该进程和其他所有进程的PCB内容。如果将该运行进程的生命周期不为0,则重新把它变为就绪状态,插入就绪队列中;否则该进程执行完成,撤消其PCB。以上为一次进程调度循环。五、实验设计<一)、需求分析1、采用一种熟悉的语言,如 C、PASCAL或C++等,编制程序,最好关键代码采用C/C++,界面设计可采用其它自己喜欢的语言。2、采用多级反馈队列调度算法进行进程调度。3、要求动态创建进程。进入进程调度循环后,每次按ctrl+f即动态创建一个进程,然后将该PCB插入就绪队列中。按ctrl+q退出进程调度循环。<二)详细设计1、总体设计方案流程图个人资料整理 仅限学习使用开始输入按键提示Y按下Ctrl+F ? 调用创建进程子函数NY按下Ctrl+R? 调用进程调度子函数NN按下Ctrl+Q?Y停止调度2、创建进程函数个人资料整理 仅限学习使用3、进程调度函数从邻接表中取一个优先级最高的进程 PCB延时一段时间,模拟进程的进行该进程的优先级减半,生命周期减一N生命周期不为0? 将进程号归还Y将该进程的PCB插入到返回对应优先级的就绪队列中4、使用的数据结构<一)、进程的PCB结构//进程队列节点(由于仅仅是模拟实验,这里无动作 >structprocess{}。//进程控制块

PCBstructPCB{intpid。

//进程标识符stringstatus。

//进程的状态标识,取值为“就绪

ready

”或“运行run”intpriority。process*next。

//进程优先级,0到49范围内的一个随机整数。//进程的队列指针个人资料整理 仅限学习使用intlife。 //进程生命周期,1到5范围内的一个随机整数。voidoperator=(PCBp>//运算符=重载{pid=p.pid。status=p.status。priority=p.priority。next=p.next。life=p.life。}}。//就绪队列节点structreadyque{PCBpc。structreadyque*next。voidoperator=(readyquer> //运算符=重载{pc=r.pc。next=r.next。}}。<二)、进程调度类 threadmanager成员:classthreadmanager{private:boolpidarray[101]。 //“真”表示下标对应的进程标识号是空闲的,“假”表示下标对应的进程标识号已分配给某个进程。structreadyqueadj[50]。//邻接表public:threadmanager(>。

//构造函数voidrun(>。boolnewpro(>。

//运行进程调度程序<对外的接口)//新建一个进程的函数voidManage_Draw(>。 //进程调度并将进程调度的情况显示在屏幕上voidDrawpro(intpriority>。 //画出优先级比正在运行进程优先级低的其他进程个人资料整理 仅限学习使用}。六、主要功能模块<一)、构造函数threadmanager::threadmanager(>{inti。//初始化邻接表for(i=0。i<50。i++>adj[i].next=NULL。“真”表示下标对应的进程标识号(1~100>是空闲的,“假”表示下标对应的进程标识号已分配给某个进程。for(i=0。i<101。i++>pidarray[i]=true。 //刚开始每个进程标识号都是空闲的。}<二)、运行进程调度程序。功能:监听各个按键并作出相应动作voidthreadmanager::run(>{intc。srand((unsigned>time(NULL>>。//srand(>函数产生一个以当前时间开始的随机种子while(1>{// cout<<"请输入要进行的操作: Ctrl+f(新建进程> Ctrl+r(开始调度>Ctrl+q(停止调度>"<<endl。cout<<"Pleaseinputthekeyyouwanttodo"<<endl。cout<<" Ctrl+f(new thread>, Ctrl+r(start manager>Ctrl+q(stopmanager>"<<endl。//检查当前是否键盘输入,若有则返回一个非

0值,否则返回

0if(!_kbhit(>>{c=_getch(>。

//_getch返回的是键的

asciiswitch(c>{case0x6://Ctrl+f(新建进程>srand((unsigned>time(NULL>>。//srand(>函数产生一个以当前时间开始的随机种子个人资料整理 仅限学习使用newpro(>。break。case0x12://Ctrl+r(开始调度>Manage_Draw(>。break。case0x11://Ctrl+q(停止调度>。}}}}//进程调度并将进程调度的情况显示在屏幕上voidthreadmanager::Manage_Draw(>{readyque*rq=NULL,*tmpr=NULL 。inti,j=0。cout<<"优先级标识符状态标识生命周期"<<endl。cout<<" prioritypid statuslife"<<endl。j=1。for(i=49。i>=0。i-->//找优先级最大的进程来执行{if(adj[i].next!=NULL>// 当对应的就绪队列不为空时{rq=adj[i].next。 //从就绪队列取出一个进程执行。adj[i].next=rq->next。rq->pc.status="run"。Sleep(1500>。 //通过延时一段时间来模拟该进程执行一个时间片的过程.//画优先级cout<<" **"<<rq->pc.priority<<"**" 。//画一次进程的调度情况//1、画正在运行进程的 PCB//设置下一个输出文本的字体颜色:绿色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE>,FOREGROUND_INTENSITY|FOREGROUND_GREEN>。个人资料整理 仅限学习使用cout<<"--->**"<<rq->pc.pid<<"**"<<rq->pc.status<<"**"<<rq->pc.life<<"**"。//2、画优先级与正在运行进程相同的其他进程的 PCB(如果有的话>设置下面输出文本的字体颜色:白色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE>,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE>。tmpr=adj[i].next。while(tmpr!=NULL>//当对应的就绪队列不为空时{cout<<"--->**"<<tmpr->pc.pid<<"**"<<tmpr->pc.status<<"**"<<tmpr->pc.life<<"**"。tmpr=tmpr->next。j++。if(j%3==0>cout<<endl<<" "。}cout<<endl。//3、画出优先级比正在运行进程优先级低的其他进程Drawpro(i>。(rq->pc.priority>/=2。 //优先级减半(rq->pc.life>-=1。 //生命周期减一//如果该运行进程的生命周期不为0,则重新把它变为就绪状态,插入就绪队列中if(rq->pc.life>0>{rq->pc.status="ready"。rq->next=adj[rq->pc.priority].next。adj[rq->pc.priority].next=rq。}else //否则将其进程号归还。pidarray[i]=true。break。//一次进程调度循环结束。}//endofif}//endofforcout<<"onetimemanagerhavefinish!"<<endl<<endl。个人资料整理 仅限学习使用}//画出优先级比正在运行进程优先级低的其他进程voidthreadmanager::Drawpro(intpriority> //priority记录正在运行进程的优先级{readyque*rq=NULL。intj。for(inti=priority-1。i>=0。i-->{rq=adj[i].next。if(rq!=NULL>{//画优先级cout<<" **"<<i<<"**" 。j=0。while(rq!=NULL>//当对应的就绪队列不为空时{cout<<"--->**"<<rq->pc.pid<<"**"<<rq->pc.status<<"**"<<rq->pc.life<<"**" 。rq=rq->next。j++。if(j%3==0>cout<<endl<<" "。}cout<<endl。}}}//新建一个进程的函数boolthreadmanager::newpro(>{structreadyque*t=NULL。srand((unsigned>time(NULL>>。//srand(>函数产生一个以当前时间开始的随机种子for(inti=1。i<101。i++>{if(pidarray[i]==true>//找一个空的进程号{个人资料整理 仅限学习使用t=newreadyque。t->pc.pid=i。pidarray[i]=false。//宣布该进程号已被使用。t->pc.status="ready"。t->pc.priority=rand(>%50。//随机产生优先级

<随机域为0~49)。t->pc.next=NULL。t->pc.life=rand(>%5+1。 //随机产生生命周期 <随机域为1~5)。t->next=adj[t->pc.priority].next。adj[t->pc.priority].next=t。//将新建的进程的PCB插入就绪队列returntrue。//创建进程成功}}returnfalse。//找不到空的进程号,创建进程失败}七、实验结果及分析<一)、新建进程连续15次按下Ctrl+F键后新建15个进程:个人资料整理 仅限学习使用<二)、开始调度每按一次Ctrl+R将进行一次进程调度:个人资料整理 仅限学习使用<三)、在一次进程调度完成后按下 Ctrl+F将新建一个进程:个人资料整理 仅限学习使用从上

温馨提示

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

评论

0/150

提交评论