


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、东莞理工学院操作系统课程设计报告学院:计算机学院专业班级:13软件工程1班学号姓名评价提交时间:2015/9/14指导教师评阅意见:进程与线程管理功能加深对进程和线程的理解,掌握对进程和线程各种项目名称一、设计目的用语言来模拟进程和线程管理系统,状态和管理的算法原理。二、环境条件系统: WindowsXP 、 VMWare 、 Ubuntu Linux语言: C/C+开发工具: gcc/g+、 Visual C+ 6.0三、设计内容1. 项目背景计算机的硬件资源有限, 为了提高内存的利用率和系统的吞吐量, 就要根据 某种算法来管理进程和线程的状态从而达到目的。进程与线程管理功能完成基于优先级的
2、抢占式线程调度功能, 完成进程虚拟 内存管理功能。进程与线程管理功能基本要求: 完成基于优先级的抢占式线程调度功能, 完成进 程虚拟内存管理功能。提高要求:(增加 1 项就予以加分)(1) 实现多种线程调度算法;(2) 通过“公共信箱”进行通信的机制,规定每一封信的大 小为 128 字节,实现两个用户进程之间通过这个 “公共信箱” 进 行通信。(3) 实现多用户进程并发的虚拟内存管理功能。(4) 实现用户进程间通信功能, 并用生产者 /消费者问题测试 进程间通信功能的正确性。(5) 实现改进型 Clock 页面置换算法。(6) 实现 Cache 功能,采用 FIFO 替换算法。2. 扩展内容实
3、现多种线程调度算法 :时间片轮转调度算法四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下:钟德新编写的代码 :void Prinft()PCB *p;system(cls);/ 清屏p=run; / 运行队列 if(p!=NULL)p-next=NULL;cout 当前正在运行的进程: endl;cout进程名称优先数还需要时间已运行时间状态:endl; while(p!=NULL) coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;
4、cout 当前的就绪队列: endl; cout 进程名称 t 优先数 t 还需要时间 t 已运行时间 t状态:e ndl;p=ready;/ 就绪队列while(p!=NULL) coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout 当前已经完成的进程: endl;/ 终止队列cout进程名称t 优先数t 还需要时间t 已运行时间t状态:endl; p=finish;while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext = NULL;read
5、y = 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;这是程序优先级排序的函数, 也是优先级调度算法的核心思想函数, 对程序的优先级通 过指针进行排序, 再将队首的程序调入运行队列, 通过置换的方法,
6、 将运行队列队首即 占用 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
7、个单位 */ 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);/ 运行中的进程重新
8、比较优先级大小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-needOftim
9、e=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
10、*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;elsePCB *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;elseq=q-next; s=s-
11、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) / 如果运行指针不为空 , 就输出当前正在运行的进程的 PC
12、B coutnametArrive_timettNeed_timettStatennJ 这是一个程序初始值的输出函数,验证输入的各程序的初始值是否是预期输入袁马龙编写的代码 :void create()/ 时间片算法创建进程函/ 就绪队列头指针/ 完成队列头指针/ 运行队列指针/ 输入进程名字和所需时间 , 创建进程的 PCB数coutN;PCB *p;int Time_piece;start=NULL;finish=NULL;run=NULL;coutTime_piece;for(int i=1;i=N;i+)p=(PCB *)malloc(sizeof(PCB);cout 请输入第 ip-
13、name;coutp-Need_time; coutp-Arrive_time;Cpu_time=0;p-Count=0;/ 计数器p-State=W;/ 进程的初始状态设为就绪 Wp-Time_piece=Time_piece; if(start!=NULL)insert(p);else/ 时间片的初始值/ 若就绪队列不为空 , 将其插入就绪队列/ 创建就绪队列的第一个 PCBp-next=start;start=p;end=p;/ 头指针/ 尾指针coutvendlvvendlvvt使用时间片轮转算法输出结果:(W为就绪状态,F为终止状态)n;coutnext;run-State=W;运行
14、时间这是一个设置程序运行初始的条件函数, 如需要运行的程序数目, 程序名称, 等,在调用德华设计的排序函数进行排序,调入队列中void roundrobin()/时间片算法函数int m=0;while(run!=NULL)if(run-Arrive_timeCpu_time)Cpu_time=Cpu_time+1;/每运行一次 cputime 加一elseif(m=0)coutnameNeed_time=run-Need_time-1;/每运行一次 needtime减一if(run-Need_time!=0)show(run);Cpu_time=Cpu_time+1;/run-Count=r
15、un-Count+1;/每运行一次 cputime 加一 每运行一次计数器 count 加一if(run-Need_time=0)/若运行完后run-next=finish;finish=run;/run-State=F;/将其插入完成队列头部将其状态改为完成态 Fshow(run);cout 进name结束nn;run=NULL;/ 将运行队列清空/ 若就绪对列不空,将第一个进程投入运行if(start!=NULL) firstin();开始cout 进 程 nameCount=run-Time_piece) run-Count=0; if(start!=NULL) run-State=W;
16、insert2(run);firstin();/ 如果时间片到/ 计数器置 0 / 若就绪队列不空/ 将进程插入到就绪队列中等待轮转/ 将就绪队列的第一个进程投入运行开始cout 进 程 namenn;cout在什么时间段完成, 什么时间段这是一个程序运行结果的输出函数, 输出程序的结果内容,到达,以及程序的状态等信息五、设计过程 进程是进程实体的运行过程是系统进行资源分配和调度的一个独立单位。另有一种定义方法是“程序 在处理器上的执行” 。为了模拟的方便,本设计采用这种定义。简单地说,进程包括三种状态:运行状态、 就绪状态、完成状态优先级调度算法 :按照进程的优先级大小来调度, 是高优先级进
17、程得到优先的处理的调度策略, 可 使用非抢占或可抢占两种策略用C+模拟设计一个进程模拟类class PCBpublic:string procname;/ 进程名int pri;/ 进程优先数string state;/ 进程状态int runtime;/进程已运行CPU寸间int needOftime;/ 还需要时间PCB *next;/ 指针;来记录进程的基本信息,如进程名称,优先级,进程状态,进程运行时间,进程所需时间每个进程被分配一时间 则 CPU 将被剥夺并 调度程序所要做的就是再设计模拟进程所需要的各种算法,运行调试结果时间片轮转调度算法 : 是一种最古老, 最简单, 最公平且使用
18、最广的算法。 段,称作它的时间片,即该进程允许运行的时间 . 如果在时间片结束时进程还在运行, 分配给另一个进程。 如果进程在时间片结束前阻塞或结束, 则 CPU 当即进行切换。 维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾 .用 C 语言模拟设计一个类 typedef struct node char name10; / 进程名int Time_piece;/时间片int Need_time; /还需要的时间int Count;/ 计数器char State;/ 进程的状态struct node *next;/链指针int Arrive_time;/到达时间PCB;用这个
19、类根据 算法的基本思想来设计程序,模拟算法的运行情况优先级抢占式调度算法: (过程图)时间片轮转调度算法:(过程图)六、运行结果优先级抢占式:” E:ntmDe bugPC8 足 reP5还需要时间11已运行时间4P2P4P3迸程壬称P1还需要时间117还需要时间0已运行时间已运行时阳2E,仪相耶PCB足xe还需要时间已运行时间优先数还需要时间已运行时间笛前已经完成的进程: 雖名称P3TMP5P2P1Press any key tu continue优先数-4还需要时间0已运行时间时间片轮转调度算法:七、结果分析程序的结果很好体现的进程运行的优先级处理,对于优先级高的程序,采用抢占式,分配程序
20、 CPU使用,优先级较低的进入就绪队列等待CPU资源而时间片轮转调度算法也很好的实行预期情况,程序进入 CPU 运行时间片长度的时间后, 调入就绪队列队尾, 完成则进入完成队列。 队首调入CPU,占用资源,循环直到所有程序都进入就绪队列 .八、设计总结1. 设计基本实现了我们小组想要的功能和预测情况, 虽然中间关于指针的使用我们做了 许多的调试,但是我们还是做出来了。2. 然后就是进程算法的调用过程和知识, 发现自己对知识的遗忘程度有点大, 边做边补, 实 验结束的会后发现自己的知识巩固了不少。对操作系统的了解也更加深入了。3. 和队友合作然后团队意识有一定的提高附录:优先级抢占式调度算法:/
21、优先级抢占式线程调度算法 /#include stdlib.h#include #include #include using namespace std;int n;class PCBpublic:string procname;/ 进程名int pri;/进程优先数string state;/ 进程状态int runtime;/ 进程已运行CPU寸间int needOftime;/ 还需要时间PCB *next;/ 指针;PCB *run = NULL; / 运行队列头指针PCB *ready = NULL;/ 就绪队列头指针PCB *finish = NULL;/ 完成队列头指针/延时函
22、数,模拟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 已运行时间 tprocnamevvttvvp-privvtvvp-needOftimevvttvvp-runtimevvttvvp-statevvendl;p=p-next;c
23、outvvendlvvendl;coutvv 当前的就绪队列: vvendl; coutvv 进程名称 vvtvv 优先数 vvtvv 还需要时间vvtvv 已运行时间 vvtvv 状态 :vvendl;p=ready;/ 就绪队列while(p!=NULL)coutvvp-procnamevvttvvp-privvtvvp-needOftimevvttvvp-runtimevvttvvp-statenext; coutendlendl;cout 当前已经完成的进程: endl;/ 终止队列cout 进程名称 t 优先数 t 还需要时间 t 已运行时间 t 态:endl;p=finish;wh
24、ile(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext;/void insert(PCB *p)PCB *S1,*S2;if(ready=NULL)p-next = NULL;ready = p;else51 = ready;52 = S1; while(S1!=NULL) if(S1-pri = p-pri)S2 = S1;S1 = S1-next; elsebreak;按优先级大小插入就绪队列/ 判断队列是否为空/ 插入就绪队列/ 判断优先级大小/ 置换位置/ 跳出循环if(S2-pri = p-pri)S2-next =
25、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;run-needOftime=run-needOftime-1;/ 运行时间 +1/ 完成需要时间 -1run-pri=run-pri-1; /*/ 优先级 -1每运行一次优先数降低 1 个
26、单位*/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 =
27、ready;程调入 CPUrun-state = 运行 ;ready = ready-next;Prinft(); /*输出进程PCB信息*/void CTProcessOfPri()/ 创建进程PCB * Node;string c5=P1,P2,P3,P4,P5;条进程srand(int)time(0);子for(int j = 0;j 5; j+)Node = new PCB;if(Node=NULL)/ 运行中的进程重/ 对队列队首的进/ 模拟设计 5/ 设置随机种/ 为进程名赋/ 为进程随机分配/ 为运行时间/ 设置初始状/ 为进程随机/ 出入就行队cout|*|procname=c
28、j;值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;getchar();CTProcessOfPri();Prinft();出函数 cout
29、endl; cout 按任意键开始运行进程模拟调度程序 ?next=NULL)PCB *q=start;if(p-Arrive_timeArrive_time)start=p;p-next=q;q-next=NULL;end=q;elseq-next=p;p-next=NULL;end=p;elsePCB *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-
30、next=p;p-next=s; return;elseq=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) / 如果运行指 针不为空 , 就输出当前正在运行的进程的 PCB coutnametArrive_timettNeed_timettStatennII.Jvoid create() / 时间片算法 创建进程函数coutN;PCB *p;int Time_piece;start=NULL; / 就绪队 列头指针finish=NULL; / 完成队列头 指针run=NULL;/ 运行队列指针coutTime_piece;for(int i=1;i=N;i+)字和所需时间 , 创建进程的 PCBp=(PCB *)malloc(sizeof(PCB);cout 请输入第 ip-name;coutp-Need_time; coutp-Arrive_time; Cpu_time=0; p-Count=0; p-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年网络安全行业SDGs目标实施策略研究报告
- 私人租车给公司合同范本
- 香港签署cepa协议书
- 特殊发热膜销售合同范本
- 签股权协议在哪签订合同
- 电厂设备装卸合同协议书
- 机关食堂供货合同协议书
- 父子房屋公证合同协议书
- 物流运输合作合同协议书
- 节电设备安装协议书模板
- 盾构安全培训课件模板
- 2025年多重耐药菌培训知识试题及答案
- 食管癌的围手术期护理
- 2025至2030中国航空球轴承行业项目调研及市场前景预测评估报告
- 2025至2030中国牙科氧化锆块行业发展趋势分析与未来投资战略咨询研究报告
- 全国省市电子表格
- 2025年成都市中考语文试题卷(含标准答案及解析)
- 2025至2030中国松茸行业市场发展分析及发展前景与投资报告
- T/GDTC 002-2021陶瓷岩板
- MZ调制器完整版本
- 2024版肺结核治疗指南
评论
0/150
提交评论