操作系统实验进程调度_第1页
操作系统实验进程调度_第2页
操作系统实验进程调度_第3页
操作系统实验进程调度_第4页
操作系统实验进程调度_第5页
全文预览已结束

下载本文档

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

文档简介

实验二进程调度实验内容进程调度模拟实验。实验目的通过模拟进程调度算法,了解进程调度的过程并比较不同的调度算法的区别。实验题目设计一段程序来模拟优先级调度算法和时间片轮转算法。要求可以指定进程的数量、各进程需要CPU的时间和各进程的优先级。实验提示⑴进程调度算法是指处理机的分配策略。优先数调度算法是指对每个进程确定一个优先数,进程调度总是让具有最高优先数的进程先使用处理机。如果进程具有相同的优先数,再按先来先服务的次序分配处理机。在本实例中采用动态优先数算法。时间片轮转算法是指就绪进程按就绪的先后次序排成队列,每次总是选择就绪队列中的第一个进程占用处理机,但规定只能使用一个“时间片”。⑵系统中的进程可以用进程控制块PCB来表示,PCB的结构定义如表5-8所示:表5-8PCB结构进程标识符charname进程占用CPU时间intcputime进程优先数intprio完成进程还需要的时间intneedtime链指针structpcb*next⑶在进程调度时进程会交替的出现在运行、就绪和完成三种状态。可以定义三个链表来存放三种状态的进程。当进程运行时就把进程放入到运行链表中;当进程处于就绪状态时就将进程放入到就绪链表中;当进程运行完毕时就将进程放入到完成链表中。由于同一时刻运行的进程只能有一个,所以运行链表只能有一个结点。在实例程序中为了使程序更简洁忽略了进程的等待状态,仅运行了优先数调度算法,由于篇幅有限,仅显示部分结果,对于时间片轮转调度算法,请读者自行运行。⑷主要变量及函数说明如表5-9所示:表5-9主要变量及函数说明structpcb进程控制块结构RUN、READY、FINSH运行、就绪、完成对列voidPRINTLINK(intt)显示三个队列,t为运行的次数PCB*CPCBLINK()建立就绪队列voidJXDLPX()将队列按优先级排序voidYXS()优先数调度算法voidSJP()时间片轮转算法5.实例代码〃进程调度算法proc.c〃运行环境Redhad9.0gcc4.0#include<stdio.h>#include<string.h>typedefstructpcb〃定义PCB结构{charname[20];/*进程标识符*/intcputime;/*进程占用CPU时间*/intprio;/*进程优先数*/intneedtime;/*进程到完成还需要的CPU时间*/structpcb*next;/*链指针*/}PCB;PCB*RUN,*READY*RTAIL,*FINSH,*FTAIL;voidPRINTLINK(intt)/*输出3个队列*/{PCB*p;printf("CPU运行次数:—%d—\n",t);printf("\n");printf("进程名\t运行状态\t运行次数\t还需要运行次数\/);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){while(p!=NULL){//printf("进程名字为:%s\n”,p->name);printf("%s\t完成\t%d\t%d\n",p->name,p->cputime,p->needtime);p=p->next;}}elseprintf("*完成队列为空\n");getchar();}PCB*CPCBLINK()/*建立就绪队列*/{printf("建立就绪队列\n\n");inti,n,nt,pr;PCB*p,*q,*head;n=0;while(1){printf(-请输入进程的个数(有效范围1-100):");scanf("%d”,&n);printf("\n");if(n>=1&&n<=100)break;elseprintf("输入有误。请重新输入!\n");getchar();}head=(structpcb*)malloc(sizeof(structpcb));printf(-输入第1个进程的名称:,scanf("%s”,head->name);while(1){printf(-需要的运行时间:,scanf("%d”,&nt);if(nt>0)break;else{printf("输入无效,重新输入!\n");getchar();}}head->needtime=nt;printf("优先数:”);scanf("%d”,&pr);head->prio=pr;head->cputime=0;/*进程已获得的运行时间*/head->next=NULL;q=head;for(i=1;i<n;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;p=READY;t=(structpcb*)malloc(sizeof(structpcb));while(p->next!=NULL){L=0;q=p->next;t=p;while(q!=NULL){if(t->prio<q->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;strcpy(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;}}voidYXS()/*调用优先数调度算法*/{PCB*p;intt=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;pr=p->prio;pr=pr-3;p->prio=pr;/*运行1次进程优先级缩小3*/nt=p->needtime;nt=nt-1;p->needtime=nt;ct=p->cputime;ct=ct+1;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;}RUN=NULL;}else/*若运行没结束进入就绪队列*/{if(READY==NULL)/*当就绪队列为空*/{READY=p;RTAIL=p;}else{RTAIL->next=p;RTAIL=p;}RUN=NULL;}t++;}}voidSJP()/*调用时间片循环轮转算法*/{PCB*p;printf("您选择的是:时间片循环轮转调度算法\n");intt=0,nt,ct;READY=CPCBLINK();/*建立就绪队列*/p=(structpcb*)malloc(sizeof(structpcb));while(READY!=NULL){p=READY;READY=READY->next;p->next=NULL;nt=p->needtime;nt=nt-2;if(nt<0)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;}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));while(1){RUN=NULL;READY=NULL;RTAIL=NULL;FINSH=NULL;FTAIL=NULL;printf("===================\n");printf("进程调度算法演示程序\n");printf("===================\n");printf("1:优先级调度算法4,printf("2:时间片循环轮转算法\/);printf("3:退出\n");printf("\n");printf("请选择:”);scanf("%d”,&N);if(N==1)YXS();/*调用优先数调度算法*/elseif(N==2)SJP();/*调用时间片循环轮转算法*/elseif(N==3)break;else{printf("您输入的信息有误,请重新输入!\n\n");getchar();}}printf("演示程序结束!\n\n");getchar();return0;}运行结果:[root@redlinuxys]#gccproc.c-oproc.o[root@redlinuxys]#./proc.o进程调度算法演示程序1:优先级调度算法2:时间片循环轮转算法3:退出请选择:1/您选择的是:优先级调度算法建立就绪队列请输入进程的个数(有效范围1-100):3/输入第1个进程的名称:a/需要的运行时间:15/优先数:2/输入第2进程的名称:b/需要的运行时间:4/优先数:1/输入第3进程的名称:c/需要的运行时间:9/优先数:8/CPU运行次数:―0―进程名运行状态运行次数8154还需要运行次数c运行1a就绪0b就绪0*完成队列为空CPU运行次数:—1―进程名运行状态运

温馨提示

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

最新文档

评论

0/150

提交评论