进程调度--先来先服务-时间片轮转法-优先服务调度处理器调度C或C++

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

/*标题:设计一:进程调度设计目的:进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点。设计题目:设计一个按先来先服务,算法时间片轮转法,优先数调度算法实现处理器调度的程序。*//*亲爱的同学们,大家好。欢迎访问我的百度空间,在此我向大家提供免费的资料,这是我们实习要做的。主要是因为我看到很多下载都要金币,而我自己没有金币,不爽。现在我提供免费下载,做个好人。复制到VC++时可能有些格式问题,稍微修改一下就OK了,程序本身不存在问题的。大三第一个学期实习的哦*//*先来先服务:是一种最简单的调度算法,每次调度都从后备作业或者进程当中选择一个或者多个最先进入该队列的作业或进程,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。当调用FCFS算法时,系统为它们分配处理机,让它们运行。该算法的优点是比较利于长作业(进程),而缺点是不利于短作业(进程)。算法时间片轮转法:系统将所有的就绪进程按照先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行完时间片时,计时器就会发出中断请求,调度程序就会停止该进程的执行,并把它送往就绪队列的末尾;然后再把处理机分配给就绪队列中新的队首进程,同时也分配时间片给它。这样保证就绪队列中的所有进程在一个给定的时间片当中都能够获得一个时间片的处理机执行时间。而时间片的大小最好取适中的,即略大于一次典型的交互所需时间。优先数调度算法:该方法又分成两种算法分支,分别是非抢占式优先权算法和抢占式优先权调度算法。该算法被调度时,系统将后备队列中选择若干个优先权最高的作业装入内存,开始调度时,处理机就会分配给就绪队列中优先权最高的进程。非抢占式优先权算法中,处理机一旦把处理机分配给就绪队列中优先权最高的进程后,该进程就会一直执行下去,直至完成;除非某事件发生而使该进程放弃处理机,系统才将处理机分配给另一个优先权最高的进程。而抢占式优先权算法,当系统把处理机分配给优先权最高的进程时,让它执行,而在执行期间,只要又出现另一个优先权更高的进程,那么进程调度就会立即停止当前进程的执行,重新将处理机分配给优先权最高的进程。先来先服务是使用数组,算法时间片使用指针,优先数调度使用数组。*//*进程调度的C/C++算法实现*/#includestdio.h#includestring.h#includestdlib.h/********************这是先来先服务的程序*********************************/structfcfs{//定义先来先服务结构体、参数charname[10];floatdaodatime;//到达时间floatfuwutime;//服务时间floatkaishitime;//开始时间floatwanchengtime;//完成时间floatzhouztime;//周转时间floatdaiquantime;//带权周转时间};fcfsa[100];voidinput(fcfs*p,intN)//构造一个输入进程的信息的函数,定义结构体指针{inti;for(i=0;i=N-1;i++){printf(输入第%d个进程的名字、到达时间、服务时间:\n,i+1);scanf(%s%f%f,&p[i].name,&p[i].daodatime,&p[i].fuwutime);//把输入的信息保存到结构体指针所对应的内存中}}//构造一个输出函数voidPrint(fcfs*p,floatdaodatime,floatfuwutime,floatkaishitime,floatwanchengtime,floatzhouztime,floatdaiquantime,intN){intk;printf(执行顺序:\n);printf(%s,p[0].name);for(k=1;kN;k++){printf(--%s,p[k].name);}printf(\n进程的相关信息如下:\n);printf(\n名字\t到达\t服务\t开始\t完成\t周转\t带权周转\n);for(k=0;k=N-1;k++){printf(%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n,p[k].name,p[k].daodatime,p[k].fuwutime,p[k].kaishitime,p[k].wanchengtime,p[k].zhouztime,p[k].daiquantime);}//题目中加入-.2是保留双精度的两位。一般f默认保留六位小数的。}voidsort(fcfs*p,intN)//进程根据到达时间进行排序{for(inti=0;i=N-1;i++)for(intj=0;j=i;j++)if(p[i].daodatimep[j].daodatime)//如果i的时间到达时间小于j的到达时间,就交换{fcfstemp;//在结构体中定义第三个变量进行交换temp=p[i];p[i]=p[j];p[j]=temp;}}//核心的运行阶段voiddeal(fcfs*p,floatdaodatime,floatfuwutime,floatkaishitime,floatwanchengtime,floatzhouztime,floatdaiquantime,intN){intk;for(k=0;k=N-1;k++){if(k==0)//K=0,表示第一个进程到达{p[k].kaishitime=p[k].daodatime;//那么开始时间=到达时间p[k].wanchengtime=p[k].daodatime+p[k].fuwutime;//完成时间=到达时间+服务时间}else{p[k].kaishitime=p[k-1].wanchengtime;//下一个进程的开始时间=上一个进程的完成时间p[k].wanchengtime=p[k-1].wanchengtime+p[k].fuwutime;//完成时间=上一个进程的完成时间+服务时间}}for(k=0;k=N-1;k++)//计算周转时间和带权周转时间{p[k].zhouztime=p[k].wanchengtime-p[k].daodatime;//周转时间=完成时间-到达时间p[k].daiquantime=p[k].zhouztime/p[k].fuwutime;//带权周转时间=周转时间/服务时间}}voidFCFS(fcfs*p,intN)//定义先来先服务函数{floatdaodatime=0,fuwutime=0,kaishitime=0,wanchengtime=0,zhouztime=0,daiquantime=0;//初始化变量为0sort(p,N);//声明排序函数deal(p,daodatime,fuwutime,kaishitime,wanchengtime,zhouztime,daiquantime,N);//声明运行函数Print(p,daodatime,fuwutime,kaishitime,wanchengtime,zhouztime,daiquantime,N);//声明输出函数}/***********************这是算法时间片轮转法的代码*****************************************/structshijian{//定义时间片的结构体charname;//定义进程名intdaodatime;//到达时间intfuwutime;//服务时间intshengyutime;//剩余时间char*state;//所处状态structshijian*next;};structshijian*time(){inta,i;structshijian*head,*rear,*p,*q,*t;//定义队首、队尾、P是队尾指针、Q是队首指针和执行时间head=rear=NULL;//初始化队首和队尾为空printf(请输入进程数目:);scanf(%d,&a);for(i=0;ia;i++){p=(structshijian*)malloc(sizeof(structshijian));//初始化一个空间给进程进入printf(输入第%d个进程的名字、到达时间、服务时间:\n,i+1);scanf(%s%d%d,&p-name,&p-daodatime,&p-fuwutime);p-shengyutime=p-fuwutime;p-state=就绪;if(rear==NULL)//当输入结束时,把P的数据放到队首,以便执行下一步{head=p;p-next=NULL;rear=p;}else//否则执行时间就为空,队首变成Q{t=NULL;q=head;while(q&&q-daodatimep-daodatime)//当Q和Q的到达时间小于P的到达时间时,把执行时间给Q{t=q;q=q-next;}if(q==head)//而当Q是队首时,则下一个队首变成P,以便每个进程都能够得到时间片{p-next=head;head=p;}elseif(t==rear)//当执行时间片到达队尾时(执行完时),返回给队首P{rear-next=p;p-next=NULL;rear=p;}else//否则给队首P占用执行时间,P执行完后到Q{t-next=p;p-next=q;}}}returnhead;//返回队首}voidoutput(structshijian*head)//定义输出函数{structshijian*p,*t,*r;intnum;printf(请输入时间片:);scanf(%d,&num);while(head!=NULL)//当队首不为空时,把P给队首{r=p=head;while(p!=NULL)//把执行时间给队首{t=head;p-shengyutime=p-shengyutime-num;//P的剩余时间=剩余时间-时间片p-state=运行;//状态变成运行态if(p-shengyutime0)//当P运行完,即剩余时间小于0时,仍然把它当做0处理p-shengyutime=0;printf(\n************程序开始运行*****************\n);printf(进程到达时间服务时间剩余时间当前状态\n);while(t!=NULL)//时间不为空时,输出当前进程的信息,并把时间片交给下一个进程{printf(%2c%8d%8d%14d%10s\n,t-name,t-daodatime,t-fuwutime,t-shengyutime,t-state);t=t-next;}getchar();//按住回车键观看if(p-shengyutime==0)//当队首的剩余时间为0时,先把队首改成P的下一个,然后释放内存,删除队首节点{if(p==head){head=p-next;free(p);p=head;}else//否则返回执行,把队尾的下一个指针变成P的下一个指针,队尾的位置移动到队首{r-next=p-next;p=r-next;r=p;}}else//否则把队首的位置给队尾,把队首的状态显示为“就绪”状态{r=p;p-state=就绪;p=p-next;}}}}/****************************这是优先服务调度算法的代码******

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功