Linux操作系统课程设计报告-时间片法和优先数法_第1页
Linux操作系统课程设计报告-时间片法和优先数法_第2页
Linux操作系统课程设计报告-时间片法和优先数法_第3页
Linux操作系统课程设计报告-时间片法和优先数法_第4页
Linux操作系统课程设计报告-时间片法和优先数法_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

-.z?操作系统原理?课程设计报告姓名:吴沛儒班级:B*0907学号:9指导教师:胡静二〇一一年十二月十二日目录一、?操作系统原理?课程设计的目的与要求31、目的32、要求3二、简述课程设计内容、主要功能和实现环境31.课程设计内容3三、任务的分析、设计、实现和讨论31、任务的分析32、任务的设计与实现5五、附录11进程调度—优先数法与简单轮转法?操作系统原理?课程设计的目的与要求目的进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。本实习要求学生独立地用高级语言编写和调试一个简单的进程调度程序。调度算法可任意选择或自行设计。任务一采用简单轮转法,任务二采用优先数法等。本课题可以加深对进程调度和各种调度算法的理解。要求设计一个有n个进程并发的进程调度程序。每个进程由一个进程控制块〔PCB〕表示。进程控制块一般应该包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。调度程序应包含2种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。算法应能显示或打印各个进程的PID、状态〔运行状态R、等待状态W等〕和参数〔已运行时间等〕的变化情况,便于观察诸进程的调度过程进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。本实习要求学生独立地用高级语言编写和调试一个简单的进程调度程序。调度算法可任意选择或自行设计。任务一采用简单轮转法,任务二采用优先数法等。本课题可以加深对进程调度和各种调度算法的理解。简述课程设计内容、主要功能和实现环境课程设计内容进程调度是处理机管理的核心内容。本实验要求用C语言编写和调试一个简单的进程调度程序。选用优先数法或简单轮转法对五个进程进展调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。为了便于处理,程序进程的运行时间以时间片为单位计算。各进程的优先数或轮转时间片数、以及进程需要运行的时间片数,均由伪随机数发生器产生。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施方法。主要功能本程序可选用优先数法或简单轮转法对五个进程进展调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。为了便于处理,程序进程的运行时间以时间片为单位计算。实现环境本次课程设计结合算法的特点,采用Windows操作系统平台。开发工具为MicrosoftVisualC++6.0。任务的分析、设计、实现和讨论任务的分析本程序可选用优先数法或简单轮转法对五个进程进展调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。为了便于处理,程序进程的运行时间以时间片为单位计算。各进程的优先数或轮转时间片数、以及进程需要运行的时间片数,均由伪随机数发生器产生。下面介绍优先数法和简单轮转法两种进程调度算法:优先数法。进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者一样,就让现行进程继续进展,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。简单轮转法。进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项〔相当于优先数法的优先数记录项位置〕。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,假设相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。进程控制块构造如下:进程ID链指针优先数/轮转时间片数占用CPU时间片数进程所需时间片数进程状态进程控制块链构造如下:TAILTAILRUN1…RHEAD3…W5…W2…W其中:RUN—当前运行进程指针;HEAD—进程就绪链链首指针;TAID—进程就绪链链尾指针。任务的设计与实现算法流程图:操作过程和结果分析优先数调度算法测试数据:优先数调度算法程序运行结果截图:图1.1结果截图图1.2结果截图简单轮转调度算法测试数据:简单轮转调度算法程序运行结果截图:图2.1结果截图图2.2结果截图图2.3结果截图思考题的解答和讨论通过以上的调度算法测试数据,得出以下不同算法的不同调度性能结果:算法比较项(时间轮转法)RR(最高优先数)HRP调度方式抢占式(按时间片)非抢占式响应时间对于短进程提供良好的响应时间提供良好的响应时间开销低可能高对待进程的作法公平对待良好的均衡(进程)?操作系统?课程设计小结当我在回首这一个星期的时候,不因虚度光阴而悔恨,也不因碌碌无为而羞耻。我想,这可能是我一学期中最丰富而有意义的一个星期了。从大一开场我的理论知识就比实践知识好的多,每门课都如此,实训是我最头疼的一件事。课本上记得很牢的东西到了实际操作的时候感觉都用不上,做个实验就手忙脚乱的。所以我感觉,这个星期的课设不仅学到了在理论课上学不到的知识,更是让我对自己的实践操作有了信心。本次课程设计的题目之一是进程调度——优先数法与简单轮转法。在多任务系统中,进程调度是CPU管理的一项核心工作。根据调度模式的不同,多任务系统有两种类型,即非抢占式和抢占式。其中,优先数法是非抢占式调度策略,而简单轮转法是抢占式调度策略。进程调度算法是系统效率的关键,它确定了系统对资源,特别是对CPU资源的分配策略,因而直接决定着系统最本质的性能指标,如相应速度和吞吐量等。常用的调度算法有:先进先出法,短进程优先法,时间片轮转法〔时间片轮转法还分为可变时间片轮转法和简单循环轮转法〕,优先级调度法。简单循环轮转法中的时间片q是一个十分重要的因素,它的计算公式为q=t/n。q的选择对进程调度有很大的影响。q取的太大,轮转法就会退化成先进先出算法;而取的太小,则会导致系统开销增加,将时间浪费在进程切换上。所以q必须取值适中,使就绪队列中的所有进程都能得到同样的效劳。但我们这次的实验中暂时还没有考虑到时间片q对算法的影响,只是测试了这个调度策略的算法。这次我们的实验测试并比较了简单轮转法和优先数法这两种调度策略的性能。不同的算法有它自己不同的长处,简单轮转法虽然能够使每个进程可以以相等的速度向前进展,但对于紧急进程的处理就显然不及优先数法。可是优先数法的开销较高,而且可能对于较短而且优先级低的进程会花较长的时间等待。不过它还是具有良好的均衡性。实际应用中,经常是多种策略结合使用。如时间片轮转法中也可以适当考虑优先级因素,对于紧急的进程可以分配一个长一点的时间片,或连续运行多个时间片等。这样取长补短,合理利用各种不同算法的优势,让CPU的运行效率大大提高。人们总是在寻找更好的解决方案,让算法的性能和开销得到一个相对较好的平衡。我在寻找这样的一个解决方案时,同学对我说虽然教师没有在课上讲过这个策略,但其实书上有关于更好的调度策略。也就是多级反响队列调度。这种算法可以先用较小的时间片处理完那些用时较短的进程,而给那些用时较长的进程分配较大的时间片,以免较长的进程频繁被中断而影响处理机的效率。这也就是上面所提到的“多种策略结合使用,如时间片轮转法中也可以适当考虑优先级因素〞。温故而知新,可以为师矣。这次编程中所用到的C语言正是我们大一就学过的计算机语言。在平时的学习中和实训中我们总能用到它。这样反复的运用和考核,让我对C语言的认识更进了一步。路漫漫其修远兮,吾将上下而求索。我们对操作系统的学习还有很长的路要走,死锁只是其中的一小局部。重要的是,我在实训的这种里学到了这样的一种精神,一种知难而上,相信努力和付出能够带来好的结果的精神。这种精神比刻板的知识点更加重要,能够指引我走向更宽阔的明天。附录*include"stdio.h"*include"stdlib.h"*include"string.h"typedefstructnode{charname[10];/*进程标识符*/intprio;/*进程优先数*/intround;/*进程时间轮转时间片*/intcputime;/*进程占用CPU时间*/intneedtime;/*进程到完成还要的时间*/intcount;/*计数器*/charstate;/*进程的状态*/structnode*ne*t;/*链指针*/}PCB;PCB*finish,*ready=NULL,*tail,*run,*pfcfs,*pfcfs1;/*队列指针*/intN;/*进程数*//*将就绪队列中的第一个进程投入运行*/voidfirstin(){run=ready;/*就绪队列头指针赋值给运行头指针*/run->state='R';/*进程状态变为运行态*/ready=ready->ne*t;/*就绪对列头指针后移到下一进程*/}/*标题输出函数*/voidprt1(chara){if(toupper(a)=='P')/*优先数法*/printf("namecputimeneedtimeprioritystate\n");elseif(toupper(a)=='R')printf("namecputimeneedtimecountroundstate\n");}/*进程PCB输出*/voidprt2(chara,PCB*q){if(toupper(a)=='P')/*优先数法的输出*/printf("%-10s%-10d%-10d%-10d%c\n",q->name,q->cputime,q->needtime,q->prio,q->state);elseif(toupper(a)=='R')/*轮转法的输出*/printf("%-10s%-10d%-10d%-10d%-10d%-c\n",q->name,q->cputime,q->needtime,q->count,q->round,q->state);}/*输出函数*/voidprt(charalgo){PCB*p;prt1(algo);/*输出标题*/if(run!=NULL)/*如果运行指针不空*/prt2(algo,run);/*输出当前正在运行的PCB*/p=ready;/*输出就绪队列PCB*/while(p!=NULL){prt2(algo,p);p=p->ne*t;}p=finish;/*输出完成队列的PCB*/while(p!=NULL){prt2(algo,p);p=p->ne*t;}getchar();/*压任意键继续*/}/*优先数的插入算法*/voidinsert1(PCB*q){PCB*p1,*s,*r;intb;s=q;/*待插入的PCB指针*/p1=ready;/*就绪队列头指针*/r=p1;/*r做p1的前驱指针*/b=1;while((p1!=NULL)&&b)/*根据优先数确定插入位置*/if(p1->prio>=s->prio){r=p1;p1=p1->ne*t;}elseb=0;if(r!=p1)/*如果条件成立说明插入在r与p1之间*/{r->ne*t=s;s->ne*t=p1;}else{s->ne*t=p1;/*否则插入在就绪队列的头*/ready=s;}}/*轮转法插入函数*/voidinsert2(PCB*p2){tail->ne*t=p2;/*将新的PCB插入在当前就绪队列的尾*/tail=p2;p2->ne*t=NULL;}voidinsert3()/*先来先效劳*/{if(ready==NULL){ready=pfcfs;ready->ne*t=NULL;pfcfs1=pfcfs;}else{pfcfs1->ne*t=pfcfs;pfcfs1=pfcfs1->ne*t;}}/*优先数创立初始PCB信息*/voidcreate1(charalg){PCB*p;inti,time;charna[10];ready=NULL;/*就绪队列头指针*/finish=NULL;/*完成队列头指针*/run=NULL;/*运行队列指针*/for(i=1;i<=N;i++){p=(structnode*)malloc(sizeof(PCB));printf("请输入进程名称%d\n",i);scanf("%s",na);printf("请输入进程运行时间\n");scanf("%d",&time);strcpy(p->name,na);p->cputime=0;p->needtime=time;p->state='w';p->prio=50-time;if(ready!=NULL)/*就绪队列不空调用插入函数插入*/insert1(p);else{p->ne*t=ready;/*创立就绪队列的第一个PCB*/ready=p;}}printf("最高优先级进程调度模拟:\n");printf("************************************************\n");prt(alg);/*输出进程PCB信息*/printf("************************************************\n");run=ready;/*将就绪队列的第一个进程投入运行*/ready=ready->ne*t;run->state='R';}/*轮转法创立进程PCB*/voidcreate2(charalg){PCB*p;inti,time;charna[10];ready=NULL;finish=NULL;run=NULL;for(i=1;i<=N;i++){p=(structnode*)malloc(sizeof(PCB));printf("请输入进程名称%d\n",i);scanf("%s",na);printf("请输入进程运行时间\n");scanf("%d",&time);strcpy(p->name,na);p->cputime=0;p->needtime=time;p->count=0;/*计数器*/p->state='w';p->round=2;/*时间片*/if(ready!=NULL)insert2(p);else{p->ne*t=ready;ready=p;tail=p;}}printf("时间轮转法进程调度模拟\n");printf("************************************************\n");prt(alg);/*输出进程PCB信息*/printf("************************************************\n");run=ready;/*将就绪队列的第一个进程投入运行*/ready=ready->ne*t;run->state='R';}/*优先数调度算法*/voidpriority(charalg){while(run!=NULL)/*当运行队列不空时,有进程正在运行*/{run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->prio=run->prio-3;/*每运行一次优先数降低3个单位*/if(run->needtime==0)/*如所需时间为0将其插入完成队列*/{run->ne*t=finish;finish=run;run->state='F';/*置状态为完成态*/run=NULL;/*运行队列头指针为空*/if(ready!=NULL)/*如就绪队列不空*/firstin();/*将就绪对列的第一个进程投入运行*/}else/*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪列*/if((ready!=NULL)&&(run->prio<ready->prio)){run->state='W';insert1(run);firstin();/*将就绪队列的第一个进程投入运行*/}prt(alg);/*输出进程PCB信息*/}}/*时间片轮转法*/voidroundrun(charalg){while(run!=NULL){run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->count=run->count+1;if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/{run->ne*t=finish;finish=run;run->state='F';run=NULL;if(ready!=NULL)firstin();/*就绪对列不空,将第一个进程投入运行*/}elseif(run->coun

温馨提示

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

评论

0/150

提交评论