操作系统课程设计报告_第1页
操作系统课程设计报告_第2页
操作系统课程设计报告_第3页
操作系统课程设计报告_第4页
操作系统课程设计报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、东莞理工学院操作系统课程设计报告学院:计算机学院专业班级:13软件工程 1班学号姓名评价提交时间:2015/9/14指导教师评阅意见:.项目名称 :进程与线程管理功能一、设计目的用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。二、环境条件系统:WindowsXP 、 VMWare 、 Ubuntu Linux语言: C/C+开发工具: gcc/g+ 、 Visual C+ 6.0三、设计内容项目背景1/14计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。进程与线程管理功能完成基于优先

2、级的抢占式线程调度功能,完成进程虚拟内存管理功能。进程与线程管理功能基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。提高要求:(增加 1 项就予以加分)(1) 实现多种线程调度算法;(2)通过“公共信箱” 进行通信的机制,规定每一封信的大小为128 字节,实现两个用户进程之间通过这个“公共信箱”进行通信。实现多用户进程并发的虚拟内存管理功能。实现用户进程间通信功能,并用生产者 /消费者问题测试进程间通信功能的正确性。实现改进型 Clock 页面置换算法。实现 Cache 功能,采用 FIFO 替换算法。2.扩展内容实现多种线程调度算法:时间片轮转调度算法四、人员分工优先

3、级调度算法:钟德新,莫友芝时间片轮转调度算法:张德华,袁马龙设计报告由小组队员共同完成。小组成员设计的代码分工如下:钟德新编写的代码: 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进程名

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

5、id 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;这是程序优先级排序的函数,也是优先级调度算法的核心思想函数,对程序的优先

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;

7、/*/ 优先级 -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)/ 就绪队列不为空,就绪队列队首优先级大于运行队列队首3/14run-state=就绪 ;insert(

8、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-n

9、eedOftime=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

10、=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;elseif(s-Arrive_time p-Arrive_time)q-next=p;p-next=s;return;elseq=q-next;s=s-next;4/14s-next=p;

11、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_timett

12、Statenn;这是一个程序初始值的输出函数,验证输入的各程序的初始值是否是预期输入袁马龙编写的代码: void 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

13、;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;/ 尾指针coutendlendlt使用时间片轮转算法输出结果:(W 为就绪状态, F 为终止状态 )n;coutnext;run-State=W;这是一个设置程序运行初始的条件函数,如需要运行的程序数目,程序名称,运行时间等,在调用德华设

14、计的排序函数进行排序,调入队列中void roundrobin() / 时间片算法函数 int m=0;5/14while(run!=NULL)if(run-Arrive_timeCpu_time)Cpu_time=Cpu_time+1;/ 每运行一次cputime 加一elseif(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;/ 每运行一次计数

15、器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;/ 计数器置 0if(start!=NULL)/ 若就绪队列不空run-State=W;insert2(run);/

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

17、 PCBpublic:string procname;/进程名int pri;/进程优先数string state;/进程状态int runtime;/进程已运行CPU时间int needOftime;/还需要时间PCB *next;/指针;来记录进程的基本信息,如进程名称,优先级,进程状态,进程运行时间,进程所需时间再设计模拟进程所需要的各种算法,运行调试结果时间片轮转调度算法: 是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一时间段,称作它的时间片,即该进程允许运行的时间. 如果在时间片结束时进程还在运行,则CPU 将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束

18、,则 CPU 当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾 .用 C 语言模拟设计一个类typedef struct node 6/14char name10; /进程名int Time_piece;/ 时间片int Need_time; /还需要的时间int Count;/ 计数器char State;/ 进程的状态struct node *next;/ 链指针int Arrive_time;/ 到达时间PCB;用这个类根据 算法的基本思想来设计程序,模拟算法的运行情况优先级抢占式调度算法: (过程图)时间片轮转调度算法 :(过程图)7/

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

20、补,实验结束的会后发现自己的知识巩固了不少。对操作系统的了解也更加深入了。和队友合作然后团队意识有一定的提高附录:优先级抢占式调度算法:11/14/优先级抢占式线程调度算法/#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;

21、/运行队列头指针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)c

22、outprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout 当前的就绪队列: endl; cout 进程名称 t 优先数 t 还需要时间 t 已运行时间 t 状态 :endl;p=ready;/就绪队列while(p!=NULL)12/14coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout 当前已经完成的进程:endl;/终 止队列cout 进程名称 t 优先数 t 还需要时间 t 已运行时间 t 状态 :endl; p=finish;while(p!=

温馨提示

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

最新文档

评论

0/150

提交评论