收藏 分销(赏)

新版操作系统课程设计报告样本.doc

上传人:天**** 文档编号:4431583 上传时间:2024-09-22 格式:DOC 页数:45 大小:2.07MB
下载 相关 举报
新版操作系统课程设计报告样本.doc_第1页
第1页 / 共45页
新版操作系统课程设计报告样本.doc_第2页
第2页 / 共45页
新版操作系统课程设计报告样本.doc_第3页
第3页 / 共45页
新版操作系统课程设计报告样本.doc_第4页
第4页 / 共45页
新版操作系统课程设计报告样本.doc_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。东莞理工学院操作系统课程设计报告学 院: 计算机学院 专 业 班 级: 13软件工程1班 学号姓名评价提交时间: /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)

3、实现Cache功能, 采用FIFO替换算法。2. 扩展内容实现多种线程调度算法:时间片轮转调度算法四、 人员分工优先级调度算法: 钟德新, 莫友芝时间片轮转调度算法: 张德华, 袁马龙设计报告由小组队员共同完成。小组成员设计的代码分工如下: 钟德新编写的代码: 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)coutprocnamettpritneedOftimettrun

4、timettstatenext;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

5、; 这个函数是优先级调度算法程序的界面函数, 主要为程序运行时能够直观的显示结果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 =

6、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-nee

7、dOftime-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)/就绪队列不为空, 就绪队列队首优先级大于运

8、行队列队首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 pr

9、ocname=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(s

10、tart-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

11、; 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)/如果运行指针不为空,就输出当前

12、正在运行的进程的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); co

13、ut请输入第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;

14、 这是一个设置程序运行初始的条件函数, 如需要运行的程序数目, 程序名称, 运行时间等, 在调用德华设计的排序函数进行排序, 调入队列中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;/

15、每运行一次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!=NUL

16、L)/若就绪队列不空run-State=W; insert2(run);/将进程插入到就绪队列中等待轮转firstin();/将就绪队列的第一个进程投入运行cout进程name开始nn; cout*n; 这是一个程序运行结果的输出函数, 输出程序的结果内容, 在什么时间段完成, 什么时间段到达, 以及程序的状态等信息五、 设计过程进程是进程实体的运行过程是系统进行资源分配和调度的一个独立单位。另有一种定义方法是”程序在处理器上的执行”。为了模拟的方便, 本设计采用这种定义。简单地说, 进程包括三种状态: 运行状态、 就绪状态、 完成状态优先级调度算法: 按照进程的优先级大小来调度, 是高优先级

17、进程得到优先的处理的调度策略, 可使用非抢占或可抢占两种策略用C+模拟设计一个进程模拟类class PCB public: string procname;/进程名int pri;/进程优先数string state;/进程状态int runtime;/进程已运行CPU时间int needOftime;/还需要时间PCB *next;/指针; 来记录进程的基本信息, 如进程名称, 优先级, 进程状态, 进程运行时间, 进程所需时间再设计模拟进程所需要的各种算法, 运行调试结果时间片轮转调度算法: 是一种最古老, 最简单, 最公平且使用最广的算法。每个进程被分配一时间段, 称作它的时间片, 即该

18、进程允许运行的时间. 如果在时间片结束时进程还在运行, 则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;用这个类根据算法的基本思

19、想来设计程序, 模拟算法的运行情况优先级抢占式调度算法: ( 过程图) 时间片轮转调度算法:( 过程图) 六、 运行结果优先级抢占式: 时间片轮转调度算法:七、 结果分析程序的结果很好体现的进程运行的优先级处理, 对于优先级高的程序, 采用抢占式, 分配程序CPU使用, 优先级较低的进入就绪队列等待CPU资源而时间片轮转调度算法也很好的实行预期情况, 程序进入CPU运行时间片长度的时间后, 调入就绪队列队尾, 完成则进入完成队列。队首调入CPU, 占用资源, 循环直到所有程序都进入就绪队列.八、 设计总结1.设计基本实现了我们小组想要的功能和预测情况, 虽然中间关于指针的使用我们做了许多的调试

20、, 可是我们还是做出来了。2.然后就是进程算法的调用过程和知识, 发现自己对知识的遗忘程度有点大, 边做边补, 实验结束的会后发现自己的知识巩固了不少。对操作系统的了解也更加深入了。3.和队友合作然后团队意识有一定的提高附录: 优先级抢占式调度算法: /优先级抢占式线程调度算法/#include stdlib.h #include #include #include using namespace std; int n; class PCB public: string procname;/进程名int pri;/进程优先数string state;/进程状态int runtime;/进程已运

21、行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当前正在运行的进程:

22、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已

23、运行时间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

24、 = 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每运行一次优先数

25、降低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 = re

26、ady;/对队列队首的进程调入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;/为运行时

27、间赋值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-Ar

28、rive_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

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服