课程名称操作系统计算机科学与技术分院信1001—2班组学号实验者姓名实验日期2013年4月11日评分教师签名实验一进程调度模拟算法一、实验目的通过进程调度实验,了解了优先数算法和时间片轮转算法的具体实施办法,体会了优先数算法和时间片轮转算法进程调度的过程,掌握了有关进程控制快、进程队列等概念,提高了编程技巧和对算法的理解和掌握。二、实验要求进程调度是处理机管理的核心内容,本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念。三、实验过程1.准备分别用两种调度算法对伍个进程进行调度。每个进程可有三种状态;执行状态(RUN)、就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。进程控制块结构如下:NAME——进程标示符PRIO/ROUND——进程优先数/进程每次轮转的时间片数(设为常数2)CPUTIME——进程累计占用CPU的时间片数NEEDTIME——进程到完成还需要的时间片数STATE——进程状态NEXT——链指针进程的就绪态和等待态均为链表结构,共有四个指针如下:RUN——当前运行进程指针READY——就需队列头指针TAIL——就需队列尾指针FINISH——完成队列头指针运行和显示程序开始运行后,首先提示:请用户选择算法,输入进程名和相应的NEEDTIME值。每次显示结果均为如下5个字段:namecputimeneedtimeprioritystate注:1.在state字段中,"R"代表执行态,"W"代表就绪(等待)态,"F"代表完成态。2.应先显示"R"态的,再显示"W"态的,再显示"F"态的。3.在"W"态中,以优先数高低或轮转顺序排队;在"F"态中,以完成先后顺序排队。2.主要流程和源代码实验一源代码#include#include#include#includetypedefstructnode{charname[10];intprio;intround;intcputime;intneedtime;intcount;charstate;structnode*next;}PCB;PCB*finish,*ready,*tail,*run;intN;voidfirstin(void);voidprint1(chara);voidprint2(charchose,PCB*p);voidprint(charchose);voidinsert_prio(PCB*q);voidprior_init(charchose);voidpriority(charchose);voidinsert_rr(PCB*q);voidroundrun_init(charchose);voidroundrun(charchose);voidmain()//主函数{charchose='';while((chose!='q')&&(chose!='Q')){fflush(stdin);printf("选择进程优先级算法请输入P,选择循环轮转算法请输入R,退出请输入Q\n");printf("请输入你的选择:");scanf("%c",&chose);if((chose!='q')&&(chose!='Q')){system("cls");if((chose=='P')||(chose=='p')){prior_init(chose);priority(chose);system("cls");}elseif((chose=='r')||(chose=='R')){roundrun_init(chose);roundrun(chose);system("cls");}}}printf("谢谢使用!\n");}voidfirstin(void){if(ready!=NULL){run=ready;ready=ready->next;run->state='R';run->next=NULL;}else{run=NULL;}}voidprint1(chara){if(toupper(a)=='P'){printf("namecputimeneedtimeprioritystate\n");}else{printf("namecputimeneedtimecountroundstate\n");}}voidprint2(charchose,PCB*p){if(toupper(chose)=='P'){printf("%s\t%d\t%d\t%d\t%c\n",p->name,p->cputime,p->needtime,p->prio,p->state);}else{printf("%s\t%d\t%d\t%d\t%d\t%c\n",p->name,p->cputime,p->needtime,p->count,p->round,p->state);}}voidprint(charchose){PCB*p;print1(chose);if(run!=NULL){print2(chose,run);}p=ready;while(p!=NULL){print2(chose,p);p=p->next;}p=finish;while(p!=NULL){print2(chose,p);p=p->next;}}voidinsert_prio(PCB*q){PCB*p,*s,*r;s=q;p=ready;r=p;if(s->prio>ready->prio)//{s->next=ready;ready=s;}else{while(p){if(p->prio>=s->prio){r=p;p=p->next;}elsebreak;}s->next=p;r->next=s;}}voidprior_init(charchose){PCB*p;inti,time;charna[10];ready=NULL;finish=NULL;run=NULL;printf("输入进程的个数N:\n");scanf("%d",&N);for(i=0;i