《操作系统-进程调度实验(共23页).docx》由会员分享,可在线阅读,更多相关《操作系统-进程调度实验(共23页).docx(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上实验五 进程调度模拟实验/进程调度算法proc.c#include <stdio.h>#include<stdlib.h>#include <string.h>typedef struct pcb/定义PCB结构char name20; /*进程标识符*/int cputime; /*进程占用CPU时间*/int prio; /*进程优先数*/int needtime; /*进程到完成还需要的CPU时间*/struct pcb *next;/*链指针*/PCB;PCB *RUN,*READY,*RTAIL,*FINSH,*FTAIL
2、;void PRINTLINK(int t)/*输出3个队列*/PCB *p;printf("CPU运行次数:_%d_n",t);printf("_n");printf("进程名t运行状态t运行次数t还需要运行次数n");if(RUN!=NULL) printf("%st运行t%dt%dn",RUN->name,RUN->cputime,RUN->needtime); else printf("*运行状态为空n");p=READY;if(p!=NULL) while(p!=NU
3、LL) printf("%st就绪t%dt%dn",p->name,p->cputime,p->needtime); p=p->next; else printf("*就绪队列为空n");p=FINSH;if (p!=NULL) while(p!=NULL)/printf(" 进程名字为:%sn",p->name);printf("%st完成t%dt%dn",p->name,p->cputime,p->needtime);p=p->next;elseprintf
4、("*完成队列为空n");getchar();PCB *CPCBLINK()/*建立就绪队列*/ printf("建立就绪队列nn");int i,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; else printf("输入有误。请重新输入!n"
5、;); getchar(); head=(struct pcb* )malloc(sizeof(struct pcb);printf("输入第1个进程的名称:");scanf("%s",head->name);while(1) printf("需要的运行时间:"); scanf("%d",&nt); if(nt>0) break; else printf("输入无效,重新输入!n"); getchar(); head->needtime=nt;printf("
6、优先数:");scanf("%d",&pr);head->prio=pr; head->cputime=0;/*进程已获得的运行时间*/head->next=NULL;q=head; for(i=1;i<n;i+) printf("n");p=(struct pcb* )malloc(sizeof(struct pcb); printf("输入第%d进程的名称:",i+1); scanf("%s",p->name); printf("需要的运行时间:&quo
7、t;); 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;return head;void JXDLPX()/*就绪队列按优先级从大到小排序*/ PCB *p,*q,*t; char s10; int L=0,ct,pr,nt; p=READY; t=(str
8、uct pcb* )malloc(sizeof(struct pcb); 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-
9、>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; void YXS()/*调用优先数调度算法*/PCB *p;int t=0,nt,ct,pr;printf("您选择的是:优先级调度算法n");READY=
10、CPCBLINK();/*建立就绪队列*/p=(struct pcb* )malloc(sizeof(struct pcb);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->cputim
11、e=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+;void S
12、JP()/*调用时间片循环轮转算法*/PCB *p;printf("您选择的是:时间片循环轮转调度算法n"); int t=0,nt,ct;READY=CPCBLINK();/*建立就绪队列*/p=(struct pcb* )malloc(sizeof(struct pcb);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;
13、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;
14、 RUN=NULL; t+;/*主程序*/int main() int N;RUN=(struct pcb* )malloc(sizeof(struct pcb); while(1)RUN =NULL; READY =NULL; RTAIL=NULL; FINSH=NULL; FTAIL=NULL;printf("=n");printf("进程调度算法演示程序 n");printf("=n"); printf(" 1:优先级调度算法n"); printf(" 2:时间片循环轮转算法n"); pr
15、intf(" 3:退出n"); printf("n"); printf(" 请选择:"); scanf("%d",&N);if(N=1)YXS();/*调用优先数调度算法*/else if(N=2)SJP();/*调用时间片循环轮转算法*/else if(N=3) break; elseprintf("您输入的信息有误,请重新输入!nn");getchar();printf("演示程序结束!nn"); getchar();return 0;1、 流程图2、 实验结果3
16、、 编写简化的多级反馈队列调度算法要求只有三级队列,进程在第一级队列中时,采用时间片轮转执行;如果该进程没有执行完毕,其进入第二级队列,第二级队列中也采用时间片轮转算法,但时间片长度是第一级队列时间片长度的二倍,以此类推,长进程在第三级队列中最终执行完毕。如果进程在第一级队列中就已经执行完毕,则在第一级队列中结束进程,如在第二级队列中执行完毕,则在第二级队列中结束进程。 #include <stdio.h>#include<stdlib.h>#include <string.h>typedef struct pcb/定义PCB结构char name20; /
17、*进程标识符*/int cputime; /*进程占用CPU时间*/int prio; /*进程优先数*/int needtime; /*进程到完成还需要的CPU时间*/struct pcb *next;/*链指针*/ int ltime; /*时间片长度*/PCB;PCB *RUN,*READY,*RTAIL,*FINSH,*FTAIL;void PRINTLINK(int t)/*输出3个队列*/PCB *p;printf("CPU运行次数:_%d_n",t);printf("_n");printf("进程名t运行状态t运行次数t还需要运行
18、次数n");if(RUN!=NULL) printf("%st运行t%dt%dn",RUN->name,RUN->cputime,RUN->needtime); else printf("*运行状态为空n");p=READY;if(p!=NULL) while(p!=NULL) printf("%st就绪t%dt%dn",p->name,p->cputime,p->needtime); p=p->next; else printf("*就绪队列为空n");p=FI
19、NSH;if (p!=NULL) while(p!=NULL)/printf(" 进程名字为:%sn",p->name);printf("%st完成t%dt%dn",p->name,p->cputime,p->needtime);p=p->next;elseprintf("*完成队列为空n");getchar();PCB *CPCBLINK()/*建立就绪队列*/ printf("建立就绪队列nn");int i,n,nt,pr;PCB *p,*q,*head;n=0;while(1)
20、 printf("请输入进程的个数(有效范围1-100):"); scanf("%d",&n); printf("n"); if (n>=1&&n<=100) break; else printf("输入有误。请重新输入!n"); getchar(); head=(struct pcb* )malloc(sizeof(struct pcb);printf("输入第1个进程的名称:");scanf("%s",head->name);wh
21、ile(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&
22、lt;n;i+) printf("n");p=(struct pcb* )malloc(sizeof(struct pcb); printf("输入第%d进程的名称:",i+1); scanf("%s",p->name); printf("需要的运行时间:"); scanf("%d",&nt); p->needtime=nt; printf("优先数:"); scanf("%d",&pr); p->prio=pr;p-&g
23、t;cputime=0;/*进程已获得的运行时间*/ p->next=NULL;q->next=p;q=p; RTAIL=q;return head;void SJP()/*调用时间片循环轮转算法*/PCB *p;printf("您选择的是:时间片循环轮转调度算法n"); int t=0,nt,ct;READY=CPCBLINK();/*建立就绪队列*/p=(struct pcb* )malloc(sizeof(struct pcb);while(READY!=NULL) p=READY; READY=READY->next; p->next=NUL
24、L; nt= p->needtime; nt=nt-ltime; if(nt<0) nt=0; p->needtime=nt; ct=p->cputime; ct=ct+ltime; p->cputime=ct; p->ltime*=2; RUN=p; PRINTLINK(t);/*输出3个队列*/ if( RUN->needtime<=0)/*若运行结束进入完成队列*/ if (FINSH=NULL)/*第1次进入完成队列*/ FINSH=p; FTAIL=p; else FTAIL->next=p; FTAIL=FTAIL->ne
25、xt; RUN=NULL; else/*若运行没结束进入就绪队列*/ if (READY=NULL)/*当就绪队列为空*/ READY=p; RTAIL=p; else RTAIL->next=p; RTAIL=p; RUN=NULL; t+;/*主程序*/void main() int N;RUN=(struct pcb* )malloc(sizeof(struct pcb); while(1)RUN =NULL; READY =NULL; RTAIL=NULL; FINSH=NULL; FTAIL=NULL;printf("=n");printf("进程
26、调度算法演示程序 n");printf("=n"); printf(" 1:调度算法n"); printf(" 2:退出n"); printf("n"); printf(" 请选择:"); scanf("%d",&N);if(N=1) SJP();/*调用时间片循环轮转算法*/else if(N=2) break; elseprintf("您输入的信息有误,请重新输入!nn");getchar();printf("演示程序结束!nn"); getchar();专心-专注-专业