ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:265.43KB ,
资源ID:6677135      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6677135.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统课程设计报告资料.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统课程设计报告资料.docx

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、算法:时间片轮转调度算法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

4、当前的就绪队列: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; /插入就绪队列 else S1 = ready; S2 = S1; while(S1!=NULL) if(S1-pri = p-pri) /判断优先级大小 S2 = S1; /置换位置 S1 = S1-next; else break; /跳出循环 if(S2-pri = p-pri) S2-next = p; p-next = S1; else p-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; /运行时间+1 run-needOftime=run-needOf

7、time-1; /完成需要时间-1 run-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; /对队列队首的进程调入CPU run-state = 运行; ready = ready-next; Prinft(); /*输出进程PCB信息*/ 这是程序运行时的实时程序,通过循环的方法在程序等候3秒后,调用德新设计的优先级排序算法,进行排序。 void CTProcessOfPri()/创建进程 PCB * Node; string c5=P1,P2,P3,P4,P5; /模拟设计5条进程 srand(int)time(0); /设置随

9、机种子 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

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

11、rive_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; /

12、 if(run!=NULL) /如果运行指针不为空,就输出当前正在运行的进程的PCB coutnametArrive_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+) /输入进程名字和所需时间,创建进程

13、的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使用时间片轮转

14、算法输出结果: (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(r

15、un-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进程nam

16、eCount=run-Time_piece) /如果时间片到 run-Count=0; /计数器置0 if(start!=NULL) /若就绪队列不空 run-State=W; insert2(run); /将进程插入到就绪队列中等待轮转 firstin(); /将就绪队列的第一个进程投入运行 cout进程name开始nn; cout*n; 这是一个程序运行结果的输出函数,输出程序的结果内容,在什么时间段完成,什么时间段到达,以及程序的状态等信息5、设计过程进程是进程实体的运行过程是系统进行资源分配和调度的一个独立单位。另有一种定义方法是“程序在处理器上的执行”。为了模拟的方便,本设计采用这种

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; /进程的状态 st

19、ruct node *next; /链指针 int Arrive_time; /到达时间 PCB; 用这个类根据算法的基本思想来设计程序,模拟算法的运行情况 优先级抢占式调度算法:(过程图)时间片轮转调度算法:(过程图)六、运行结果优先级抢占式:时间片轮转调度算法:七、结果分析 程序的结果很好体现的进程运行的优先级处理,对于优先级高的程序,采用抢占式,分配程序CPU使用,优先级较低的进入就绪队列等待CPU资源 而时间片轮转调度算法也很好的实行预期情况,程序进入CPU运行时间片长度的时间后,调入就绪队列队尾,完成则进入完成队列。队首调入CPU,占用资源,循环直到所有程序都进入就绪队列.八、设计总

20、结 1.设计基本实现了我们小组想要的功能和预测情况,虽然中间关于指针的使用我们做了许多的调试,但是我们还是做出来了。2.然后就是进程算法的调用过程和知识,发现自己对知识的遗忘程度有点大,边做边补,实验结束的会后发现自己的知识巩固了不少。对操作系统的了解也更加深入了。 3.和队友合作然后团队意识有一定的提高附录:优先级抢占式调度算法:/优先级抢占式线程调度算法/#include stdlib.h #include #include #include using namespace std; int n; class PCB public: string procname;/进程名 int pri

21、;/进程优先数 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); do time(& 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;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1