您好,欢迎访问三七文档
沈阳工程学院学生实验报告(课程名称:操作系统)实验题目:进程调度班级计算机学号姓名地点F608指导教师实验日期:2017年4月11日批阅教师(签字):成绩:1一、实验目的进程调度问题是OS的核心内容。本实验要求用高级语言编写和调试一个程序来模拟进程调度算法。通过本实验可以加深理解有关调度技术、进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。二、实验环境硬件环境:IntelPentiumProcessor1.8G,512M内存,windows操作系统。软件环境:vc++6.0或TurboC。三、实验内容与要求实验原理:⑴进程调度算法是指处理机的分配策略。优先数调度算法是指对每个进程确定一个优先数,进程调度总是让具有最高优先数的进程先使用处理机。如果进程具有相同的优先数,再按先来先服务的次序分配处理机。在本实例中采用动态优先数算法。时间片轮转算法是指就绪进程按就绪的先后次序排成队列,每次总是选择就绪队列中的第一个进程占用处理机,但规定只能使用一个“时间片”。⑵系统中的进程可以用进程控制块PCB来表示,PCB的结构定义如表5-8所示:表5-8PCB结构进程标识符charname运行时间intcputime进程优先数intprio完成进程还需要的时间intneedtime链指针structpcb*next已经运行的时间⑶在进程调度时进程会交替的出现在运行、就绪和完成三种状态。可以定义三个链表来存放三种状态的进程。当进程运行时就把进程放入到运行链表中;当进程处于就绪状态时就将进程放入到就绪链表中;当进程运行完毕时就将进程放入到完成链表中。由于同一时刻运行的进程只能有一个,所以运行链表只能有一个结点。在实例程序中为了使程序更简洁忽略了进程的等待状态,仅运行了优先数调度算法,由于篇幅有限,仅显示部分结果,对于时间片轮转调度算法,请读者自行运行。⑷主要变量及函数说明如表5-9所示:2表5-9主要变量及函数说明structpcb进程控制块结构RUN、READY、FINSH运行、就绪、完成对列voidPRINTLINK(intt)显示三个队列,t为运行的次数PCB*CPCBLINK()建立就绪队列voidJXDLPX()将队列按优先级排序voidYXS()优先数调度算法voidSJP()时间片轮转算法实验要求:设计一段程序来模拟优先级调度算法和时间片轮转算法。要求可以指定进程的数量、各进程需要CPU的时间和各进程的优先级。四、实验过程及结果分析的1.优先级调度算法:流程图:3实验过程:452.时间片轮转算法流程图:6789代码:#includestdio.h#includeconio.h#includestring.h#includestdlib.htypedefstructpcb{charname[20];intcputime;intprio;intneedtime;structpcb*next;/*链指针*/}PCB;PCB*RUN,*READY,*RTAIL,*FINSH,*FTAIL;10voidPRINTLINK(intt){PCB*p;printf(CPU运行次数:___%d___\n,t);printf(______________________\n);printf(进程名\t运行状态\t运行次数\t还需要运行次数\n);if(RUN!=NULL){printf(%s\t运行\t%d\t%d\n,RUN-name,RUN-cputime,RUN-needtime);}elseprintf(*运行状态为空\n);p=READY;if(p!=NULL){while(p!=NULL){printf(%s\t就绪\t%d\t%d\n,p-name,p-cputime,p-needtime);p=p-next;}}elseprintf(*就绪队列为空\n);p=FINSH;if(p!=NULL)11{while(p!=NULL){printf(%s\t完成\t%d\t%d\n,p-name,p-cputime,p-needtime);p=p-next;}}elseprintf(*完成队列为空\n);getchar();}PCB*CPCBLINK()/*建立就绪队列*/{printf(现在建立就绪队列ing\n\n);inti,n,nt,pr;PCB*p,*q,*head;n=0;while(1){printf(请输入进程的个数:);scanf(%d,&n);printf(\n);if(n=1&&n=100)break;else12printf(输入有误。请重新输入!\n);getchar();}head=(structpcb*)malloc(sizeof(structpcb));printf(输入第1个进程的名称:);scanf(%s,head-name);while(1){printf(需要的运行时间:);scanf(%d,&nt);if(nt0)break;else{printf(输入无效,重新输入!\n);getchar();}}head-needtime=nt;printf(优先数:);scanf(%d,&pr);head-prio=pr;head-cputime=0;head-next=NULL;q=head;13for(i=1;in;i++){printf(\n);p=(structpcb*)malloc(sizeof(structpcb));printf(输入第%d进程的名称:,i+1);scanf(%s,p-name);printf(需要的运行时间:);scanf(%d,&nt);p-needtime=nt;printf(优先数:);scanf(%d,&pr);p-prio=pr;p-cputime=0;/*进程已获得的运行时间*/p-next=NULL;q-next=p;q=p;}RTAIL=q;returnhead;}voidJXDLPX()/*就绪队列按优先级从大到小排序*/{PCB*p,*q,*t;chars[10];intL=0,ct,pr,nt;14p=READY;t=(structpcb*)malloc(sizeof(structpcb));while(p-next!=NULL){L=0;q=p-next;t=p;while(q!=NULL){if(t-prioq-prio){t=q;L=1;}q=q-next;}if(L==1){strcpy(s,t-name);ct=t-cputime;pr=t-prio;nt=t-needtime;q=p-next;while(strcmp(q-name,s)!=0)q=q-next;15strcpy(q-name,p-name);q-cputime=p-cputime;q-prio=p-prio;q-needtime=p-needtime;strcpy(p-name,s);p-cputime=ct;p-prio=pr;p-needtime=nt;}p=p-next;}}voidyouxian(){PCB*p;inta=0,nt,ct,pr;printf(优先级调度算法\n);READY=CPCBLINK();p=(structpcb*)malloc(sizeof(structpcb));while(READY!=NULL){JXDLPX();p=READY;READY=READY-next;p-next=NULL;16pr=p-prio;pr=pr-3;p-prio=pr;nt=p-needtime;nt=nt-1;p-needtime=nt;ct=p-cputime;ct=ct+1;p-cputime=ct;RUN=p;PRINTLINK(a);/*输出3个队列*/if(RUN-needtime=0)/*若运行结束进入完成队列*/{if(FINSH==NULL)/*第1次进入完成队列*/{FINSH=p;FTAIL=p;}else{FTAIL-next=p;FTAIL=FTAIL-next;}RUN=NULL;}17else{if(READY==NULL){READY=p;RTAIL=p;}else{RTAIL-next=p;RTAIL=p;}RUN=NULL;}a++;}}voidshijp(){PCB*p;printf(您选择的是:时间片轮转调度算法\n);intt=0,nt,ct;READY=CPCBLINK();/*建立就绪队列*/p=(structpcb*)malloc(sizeof(structpcb));while(READY!=NULL)18{p=READY;READY=READY-next;p-next=NULL;nt=p-needtime;nt=nt-2;if(nt0)nt=0;p-needtime=nt;ct=p-cputime;ct=ct+2;p-cputime=ct;RUN=p;PRINTLINK(t);/*输出3个队列*/if(RUN-needtime=0)/*若运行结束进入完成队列*/{if(FINSH==NULL)/*第1次进入完成队列*/{FINSH=p;FTAIL=p;}else{FTAIL-next=p;FTAIL=FTAIL-next;19}RUN=NULL;}else/*若运行没结束进入就绪队列*/{if(READY==NULL)/*当就绪队列为空*/{READY=p;RTAIL=p;}else{RTAIL-next=p;RTAIL=p;}RUN=NULL;}t++;}}/*主程序*/intmain(){intN;RUN=(structpcb*)malloc(sizeof(structpcb));20while(1){RUN=NULL;READY=NULL;RTAIL=NULL;FINSH=NULL;FTAIL=NULL;printf(\t---------------------------\n);printf(\t进程调度算法\n);printf(\t---------------------------\n);printf(1:优先级调度算法\n);printf(\t---------------------------\n);printf(2:时间片轮转算法\n);printf(\t---------------------------\n);printf(3:退出\n);printf(\t---------------------------\n);printf(\n);printf(请选择:);scanf(%d,&N);if(N==1)youxian();elseif(N==2)shijp();elseif(N==3){getch();21break;}else{printf(您输入的信息有误,请重新输入!\n\n);getchar();}}printf(谢谢使用本次模拟系统!\n\n);getchar();return0;}
本文标题:实验1:进程调度
链接地址:https://www.777doc.com/doc-5292934 .html