




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
东莞理工学院操作系统课程设计报告学 院: 计算机学院 专 业 班 级: 13软件工程1班 学号姓名评价提交时间: 2015/9/14 指导教师评阅意见:.项目名称: 进程与线程管理功能 一、设计目的用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。二、环境条件系统: WindowsXP、VMWare、Ubuntu Linux语言:C/C+开发工具:gcc/g+、Visual C+ 6.0三、设计内容1. 项目背景计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。进程与线程管理功能基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。提高要求:(增加1项就予以加分)(1) 实现多种线程调度算法;(2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。(3) 实现多用户进程并发的虚拟内存管理功能。(4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。(5) 实现改进型Clock页面置换算法。(6) 实现Cache功能,采用FIFO替换算法。2. 扩展内容实现多种线程调度算法:时间片轮转调度算法4、 人员分工优先级调度算法:钟德新,莫友芝时间片轮转调度算法:张德华,袁马龙设计报告由小组队员共同完成。小组成员设计的代码分工如下:钟德新编写的代码:void Prinft()PCB *p;system(cls);/清屏p=run;/运行队列if(p!=NULL)p-next=NULL;cout当前正在运行的进程:endl;cout进程名称t优先数t还需要时间t已运行时间t状态:endl;while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout当前的就绪队列:endl; cout进程名称t优先数t还需要时间t已运行时间t状态:endl;p=ready;/就绪队列while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout当前已经完成的进程:endl;/终止队列cout进程名称t优先数t还需要时间t已运行时间t状态:endl; p=finish;while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext; 这个函数是优先级调度算法程序的界面函数,主要为程序运行时能够直观的显示结果void insert(PCB *p)PCB *S1,*S2;if(ready=NULL)/判断队列是否为空p-next = NULL;ready = p;/插入就绪队列elseS1 = ready;S2 = S1;while(S1!=NULL)if(S1-pri = p-pri)/判断优先级大小S2 = S1;/置换位置S1 = S1-next; elsebreak;/跳出循环if(S2-pri = p-pri)S2-next = p;p-next = S1;elsep-next = ready;ready = p;这是程序优先级排序的函数,也是优先级调度算法的核心思想函数,对程序的优先级通过指针进行排序,再将队首的程序调入运行队列,通过置换的方法,将运行队列队首即占用CPU的程序调入就绪队列,如此循环直至所有程序终止为止。莫友芝编写的代码:void priority()run = ready;ready = ready-next;run-state = 运行;while(run!=NULL) /*当运行队列不空时,有进程正在运行*/Dtime(3);/调用延时函数,延时3秒run-runtime=run-runtime+1;/运行时间+1run-needOftime=run-needOftime-1;/完成需要时间-1run-pri=run-pri-1; /*/优先级-1每运行一次优先数降低1个单位*/if(run-needOftime=0) /*如所需时间为0将其插入完成队列*/run-state = 完成;run-next = finish;finish = run;run=NULL; /*运行队列头指针为空*/if(ready!=NULL) /*如就绪队列不空*/run = ready;run-state = 运行;ready = ready-next;else if(ready!=NULL)&(run-pri pri)/就绪队列不为空,就绪队列队首优先级大于运行队列队首run-state=就绪;insert(run);/运行中的进程重新比较优先级大小run = ready;/对队列队首的进程调入CPUrun-state = 运行; ready = ready-next; Prinft(); /*输出进程PCB信息*/ 这是程序运行时的实时程序,通过循环的方法在程序等候3秒后,调用德新设计的优先级排序算法,进行排序。void CTProcessOfPri()/创建进程 PCB * Node; string c5=P1,P2,P3,P4,P5;/模拟设计5条进程srand(int)time(0);/设置随机种子for(int j = 0;j procname=cj;/为进程名赋值Node-needOftime=1+(int)(15.0*rand()/(RAND_MAX+1.0);/为进程随机分配占用CPU时间.Node-runtime = 0;/为运行时间赋值Node-state =就绪;/设置初始状态为“就绪”状态Node-pri =1+(int)(20.0*rand()/(RAND_MAX+1.0);/为进程随机分配优先数. insert(Node);/出入就行队列 随机创建5个模拟程序,为其赋上初值后,调用优先级排序函数,进行第一次排序张德华编写的程序代码: void insert(PCB *p)/时间片插入函数 if(start-next=NULL) PCB *q=start; if(p-Arrive_timeArrive_time) start=p; p-next=q; q-next=NULL; end=q; else q-next=p; p-next=NULL; end=p; else PCB *q=start; PCB *s=start-next; while(s!=NULL) if(q-Arrive_time p-Arrive_time) p-next=q; start=p; return; else if(s-Arrive_time p-Arrive_time) q-next=p; p-next=s; return; else q=q-next; s=s-next; s-next=p; end=p; 这个是时间片插入函数,也是轮转调度模拟程序的核心函数,首先对到达时间进行排序,将队首调入CPU后,运行时间片的时间后,调入就绪队列队尾,等候下一次的资源.void firstin()/将就绪队列的第一个进程放入运行队列run=start; run-State=W;/改变其状态start=start-next; 模拟占用CPU的函数void show(PCB *p)/输出函数 cout进程名t到达时间t剩余时间t状态n;/ if(run!=NULL)/如果运行指针不为空,就输出当前正在运行的进程的PCBcoutnametArrive_timettNeed_timettStatenn; 这是一个程序初始值的输出函数,验证输入的各程序的初始值是否是预期输入袁马龙编写的代码:void create()/时间片算法创建进程函数 coutN; PCB *p; int Time_piece; start=NULL;/就绪队列头指针 finish=NULL;/完成队列头指针 run=NULL;/运行队列指针coutTime_piece; for(int i=1;i=N;i+)/输入进程名字和所需时间,创建进程的PCB p=(PCB *)malloc(sizeof(PCB); cout请输入第ip-name; coutp-Need_time; coutp-Arrive_time;Cpu_time=0; p-Count=0;/计数器p-State=W;/进程的初始状态设为就绪W p-Time_piece=Time_piece;/时间片的初始值if(start!=NULL) insert(p);/若就绪队列不为空,将其插入就绪队列else/创建就绪队列的第一个PCB p-next=start; start=p;/头指针end=p;/尾指针 coutendlendlt使用时间片轮转算法输出结果:(W为就绪状态,F为终止状态)n; coutnext; run-State=W; 这是一个设置程序运行初始的条件函数,如需要运行的程序数目,程序名称,运行时间等,在调用德华设计的排序函数进行排序,调入队列中void roundrobin()/时间片算法函数int m=0; while(run!=NULL) if(run-Arrive_timeCpu_time) Cpu_time=Cpu_time+1;/每运行一次cputime加一else if(m=0) cout进程nameNeed_time=run-Need_time-1;/每运行一次needtime减一if(run-Need_time!=0) show(run); Cpu_time=Cpu_time+1;/每运行一次cputime加一run-Count=run-Count+1;/每运行一次计数器count加一if(run-Need_time=0)/若运行完后run-next=finish; finish=run;/将其插入完成队列头部run-State=F;/将其状态改为完成态F show(run); cout进程name结束nn; run=NULL;/将运行队列清空if(start!=NULL) firstin();/若就绪对列不空,将第一个进程投入运行cout进程nameCount=run-Time_piece)/如果时间片到run-Count=0;/计数器置0 if(start!=NULL)/若就绪队列不空run-State=W; insert2(run);/将进程插入到就绪队列中等待轮转firstin();/将就绪队列的第一个进程投入运行cout进程name开始nn; cout*n; 这是一个程序运行结果的输出函数,输出程序的结果内容,在什么时间段完成,什么时间段到达,以及程序的状态等信息5、 设计过程进程是进程实体的运行过程是系统进行资源分配和调度的一个独立单位。另有一种定义方法是“程序在处理器上的执行”。为了模拟的方便,本设计采用这种定义。简单地说,进程包括三种状态:运行状态、就绪状态、完成状态优先级调度算法:按照进程的优先级大小来调度,是高优先级进程得到优先的处理的调度策略,可使用非抢占或可抢占两种策略用C+模拟设计一个进程模拟类class PCB public: string procname;/进程名int pri;/进程优先数string state;/进程状态int runtime;/进程已运行CPU时间int needOftime;/还需要时间PCB *next;/指针; 来记录进程的基本信息,如进程名称,优先级,进程状态,进程运行时间,进程所需时间再设计模拟进程所需要的各种算法,运行调试结果时间片轮转调度算法: 是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一时间段,称作它的时间片,即该进程允许运行的时间. 如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾.用C语言模拟设计一个类typedef struct node char name10; /进程名int Time_piece;/时间片int Need_time; /还需要的时间int Count;/计数器char State;/进程的状态struct node *next;/链指针int Arrive_time;/到达时间 PCB;用这个类根据算法的基本思想来设计程序,模拟算法的运行情况优先级抢占式调度算法:(过程图)时间片轮转调度算法:(过程图)六、运行结果优先级抢占式:时间片轮转调度算法:七、结果分析程序的结果很好体现的进程运行的优先级处理,对于优先级高的程序,采用抢占式,分配程序CPU使用,优先级较低的进入就绪队列等待CPU资源而时间片轮转调度算法也很好的实行预期情况,程序进入CPU运行时间片长度的时间后,调入就绪队列队尾,完成则进入完成队列。队首调入CPU,占用资源,循环直到所有程序都进入就绪队列.八、设计总结1.设计基本实现了我们小组想要的功能和预测情况,虽然中间关于指针的使用我们做了许多的调试,但是我们还是做出来了。2.然后就是进程算法的调用过程和知识,发现自己对知识的遗忘程度有点大,边做边补,实验结束的会后发现自己的知识巩固了不少。对操作系统的了解也更加深入了。3.和队友合作然后团队意识有一定的提高附录:优先级抢占式调度算法:/优先级抢占式线程调度算法/#include stdlib.h #include #include #include using namespace std; int n; class PCB public: string procname;/进程名int pri;/进程优先数string state;/进程状态int runtime;/进程已运行CPU时间int needOftime;/还需要时间PCB *next;/指针; PCB *run = NULL; /运行队列头指针PCB *ready = NULL;/就绪队列头指针PCB *finish = NULL;/完成队列头指针/延时函数,模拟CPU占用时间/void Dtime(int t)/此代码块参考网上资料time_t current_time;time_t start_time;time(&start_time); dotime(& current_time);while(current_time-start_time)next=NULL;cout当前正在运行的进程:endl;cout进程名称t优先数t还需要时间t已运行时间t状态:endl;while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout当前的就绪队列:endl; cout进程名称t优先数t还需要时间t已运行时间t状态:endl;p=ready;/就绪队列while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout当前已经完成的进程:endl;/终止队列cout进程名称t优先数t还需要时间t已运行时间t状态:endl; p=finish;while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext; /按优先级大小插入就绪队列void insert(PCB *p)PCB *S1,*S2;if(ready=NULL)/判断队列是否为空p-next = NULL;ready = p;/插入就绪队列elseS1 = ready;S2 = S1;while(S1!=NULL)if(S1-pri = p-pri)/判断优先级大小S2 = S1;/置换位置S1 = S1-next; elsebreak;/跳出循环if(S2-pri = p-pri)S2-next = p;p-next = S1;elsep-next = ready;ready = p;/实时运行函数/void priority()run = ready;ready = ready-next;run-state = 运行;while(run!=NULL) /*当运行队列不空时,有进程正在运行*/Dtime(3);/调用延时函数,延时3秒run-runtime=run-runtime+1;/运行时间+1run-needOftime=run-needOftime-1;/完成需要时间-1run-pri=run-pri-1; /*/优先级-1每运行一次优先数降低1个单位*/if(run-needOftime=0) /*如所需时间为0将其插入完成队列*/run-state = 完成;run-next = finish;finish = run;run=NULL; /*运行队列头指针为空*/if(ready!=NULL) /*如就绪队列不空*/run = ready;run-state = 运行;ready = ready-next;else if(ready!=NULL)&(run-pri pri)/就绪队列不为空,就绪队列队首优先级大于运行队列队首run-state=就绪;insert(run);/运行中的进程重新比较优先级大小run = ready;/对队列队首的进程调入CPUrun-state = 运行; ready = ready-next; Prinft(); /*输出进程PCB信息*/ void CTProcessOfPri()/创建进程 PCB * Node; string c5=P1,P2,P3,P4,P5;/模拟设计5条进程srand(int)time(0);/设置随机种子for(int j = 0;j procname=cj;/为进程名赋值Node-needOftime=1+(int)(15.0*rand()/(RAND_MAX+1.0);/为进程随机分配占用CPU时间.Node-runtime = 0;/为运行时间赋值Node-state =就绪;/设置初始状态为“就绪”状态Node-pri =1+(int)(20.0*rand()/(RAND_MAX+1.0);/为进程随机分配优先数. insert(Node);/出入就行队列 void main() cout*endl; cout* 优先数调度算法*endl; cout*endl; cout按任意键开始创建进程?endl; getchar();CTProcessOfPri();/新建进程Prinft();/调用界面输出函数coutendl; cout 按任意键开始运行进程模拟调度程序?next=NULL) PCB *q=start; if(p-Arrive_timeArrive_time) start=p; p-next=q; q-next=NULL; end=q; else q-next=p; p-next=NULL; end=p; else PCB *q=start; PCB *s=start-next; while(s!=NULL) if(q-Arrive_time p-Arrive_time) p-next=q; start=p; return; else if(s-Arrive_time p-Arrive_time) q-next=p; p-next=s; return; else q=q-next; s=s-next; s-next=p; end=p; void insert2(PCB *p) end-next=p;/将新的PCB插入在当前就绪队列的尾end=p; p-next=NULL; void show(PCB *p)/输出函数 cout进程名t到达时间t剩余时间t状态n;/ if(run!=NULL)/如果运行指针不为空,就输出当前正在运行的进程的PCBcoutnametArrive_timettNeed_timettStatenn; void create()/时间片算法创建进程函数 coutN; PCB *p; int Time_piece; start=NULL;/就绪队列头指针 finish=NULL;/完成队列头指针 run=NULL;/运行队列指针coutTime_piece; for(int i=1;i=N;i+)/输入进程名字和所需时间,创建进程的PCB p=(PCB *)malloc(sizeof(PCB); cout请输入第ip-name; coutp-Need_time; coutp-Arrive_time;Cpu_time=0; p-Count=0;/计数器p-State=W;/进程的初始状态设为就绪
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度WeGene基因检测实验室共建与技术研发合同
- 2025年数据中心基础设施安装工程合同范本
- 二零二五年度网络安全专家聘用合同
- 2025年智慧城市建设IT咨询与项目规划合同
- 2025版高层住宅小区消防喷淋系统安装及后期维护服务合同
- 2025年度班组施工施工项目竣工验收合同范本
- 2025ALC隔墙板分包工程合同履行过程中的风险管理合同
- 二零二五年度220kV输变电工程安装施工与电力设备租赁合同
- 二零二五年度B101、B201系列电子产品维修与保养合同
- 二零二五年度超详细!云计算数据中心能耗优化合同
- 肺结节中医课件
- 护理核心制度考试试卷(附答案)
- 尾矿工安全培训
- 西安高新区管委会招聘笔试真题2024
- 2025年中国工商银行招聘笔试备考题库(带答案详解)
- 研发项目工时管理制度
- 浮选药剂安全管理制度
- 会阴水肿硫酸镁湿敷专题报告
- 技术异化的解放路径-洞察及研究
- 2025年连云港市中考语文试卷真题(含标准答案)
- 2025年学校校长公开选拔笔试试题及参考答案校长招聘考试笔试真题
评论
0/150
提交评论