操作系统-进程调度实验(共23页).docx
《操作系统-进程调度实验(共23页).docx》由会员分享,可在线阅读,更多相关《操作系统-进程调度实验(共23页).docx(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 进程 调度 实验 23
限制150内